Reloader

Reloader

Kubernetes配置变更自动监控与更新工具

Reloader实现了Kubernetes配置变更的自动监控和更新。它可检测ConfigMap和Secret的修改,并触发相关Deployment、DaemonSet等资源的滚动更新。通过注解实现灵活配置,支持多种更新策略,适用于Kubernetes 1.19及更高版本。Reloader简化了配置管理流程,提高了应用的可维护性和稳定性。

ReloaderKubernetes配置管理自动重启容器编排Github开源项目

Reloader-logo Reloader

Go Report Card Go Doc Release GitHub tag Docker Pulls Docker Stars license Get started with Stakater

问题

我们希望监视ConfigMap和/或Secret中是否发生变化;然后对相关的DeploymentConfigDeploymentDaemonsetStatefulsetRollout执行滚动升级。

解决方案

Reloader可以监视ConfigMapSecret的变化,并对与之关联的DeploymentConfigsDeploymentsDaemonsetsStatefulsetsRollouts的Pod执行滚动升级。

企业版

Reloader有两个不同的版本:

  1. 开源版本
  2. 企业版,包括:
    • SLA(服务级别协议)支持和独特请求
    • Slack支持
    • 认证镜像

有关Reloader企业版的信息,请联系sales@stakater.com

兼容性

Reloader与Kubernetes >= 1.19兼容

如何使用Reloader

对于名为fooDeployment,有一个名为foo-configmapConfigMap或名为foo-secretSecret或两者都有。然后在Deployment的主元数据中添加你的注解(默认为reloader.stakater.com/auto

kind: Deployment metadata: annotations: reloader.stakater.com/auto: "true" spec: template: metadata:

这将自动发现使用foo-configmapfoo-secret的deploymentconfigs/deployments/daemonsets/statefulset/rollouts,无论是通过环境变量还是通过卷挂载。当foo-configmapfoo-secret更新时,它将对相关的pod执行滚动升级。

你可以按监视资源的类型进行过滤,并使用auto注解的类型化版本。如果你只想发现挂载的Secret的变化,并忽略ConfigMap的变化,请添加secret.reloader.stakater.com/auto注解。类似地,你可以使用configmap.reloader.stakater.com/auto注解来查找挂载的ConfigMap的变化,任何挂载的Secret的变化都不会触发相关pod的滚动升级。

你也可以将这种发现限制为只有带有特殊注解的ConfigMapSecret对象。要利用这一点,请这样注解你的deploymentconfigs/deployments/daemonsets/statefulset/rollouts:

kind: Deployment metadata: annotations: reloader.stakater.com/search: "true" spec: template:

Reloader将在修改任何带有如下注解的ConfigMapSecret时触发滚动升级:

kind: ConfigMap metadata: annotations: reloader.stakater.com/match: "true" data: key: value

前提是secret/configmap正在环境变量或卷挂载中使用。

请注意,reloader.stakater.com/searchreloader.stakater.com/auto不能同时使用。如果你在部署中有reloader.stakater.com/auto: "true"注解,那么它将始终在其使用的configmaps或secrets发生变化时重启,无论它们是否有reloader.stakater.com/match: "true"注解。

同样,reloader.stakater.com/auto及其类型化版本(secret.reloader.stakater.com/autoconfigmap.reloader.stakater.com/auto)不能同时使用。如果你在部署中同时有这些注解,那么只需要其中一个为true就会触发重启。例如,同时有reloader.stakater.com/auto: "true"secret.reloader.stakater.com/auto: "false"或同时有reloader.stakater.com/auto: "false"secret.reloader.stakater.com/auto: "true"都会在其使用的secret发生变化时重启。

我们还可以指定一个特定的configmap或secret,它只会在我们指定的configmap或secret发生变化时触发滚动升级,这样,它就不会在deploymentconfigdeploymentdaemonsetstatefulsetrollout中使用的所有configmaps或secrets发生变化时触发滚动升级。 要做到这一点,要么将auto注解设置为"false"reloader.stakater.com/auto: "false"),要么完全删除它,并使用ConfigmapSecret的注解。

也可以通过设置--auto-reload-all标志来为所有资源启用自动重新加载。 在这种情况下,所有没有将auto注解(或其类型化版本)设置为"false"的资源,在其ConfigMaps或Secrets更新时都会自动重新加载。 注意,将auto注解设置为未定义的值也算作false。

Configmap

要仅在特定configmaps发生变化时执行滚动升级,请使用以下注解。

对于名为fooDeployment,有一个名为foo-configmapConfigMap。然后在Deployment的主元数据中添加此注解

kind: Deployment metadata: annotations: configmap.reloader.stakater.com/reload: "foo-configmap" spec: template: metadata:

使用逗号分隔的列表来定义多个configmaps。

kind: Deployment metadata: annotations: configmap.reloader.stakater.com/reload: "foo-configmap,bar-configmap,baz-configmap" spec: template: metadata:

Secret

要仅在特定secrets发生变化时执行滚动升级,请使用以下注解。

对于名为fooDeployment,有一个名为foo-secretSecret。然后在Deployment的主元数据中添加此注解

kind: Deployment metadata: annotations: secret.reloader.stakater.com/reload: "foo-secret" spec: template: metadata:

使用逗号分隔的列表来定义多个secrets。

kind: Deployment metadata: annotations: secret.reloader.stakater.com/reload: "foo-secret,bar-secret,baz-secret" spec: template: metadata:

注意事项

  • Reloader 还支持 sealed-secrets这里是使用 sealed-secrets 与 Reloader 的步骤。
  • 对于 rollouts,Reloader 只是触发一个变更,如何配置 rollout 策略由你决定。
  • reloader.stakater.com/auto: "true" 只会在 configmap 或 secret 被使用时(作为卷挂载或环境变量)重新加载 pod,适用于 DeploymentConfigs/Deployment/Daemonsets/Statefulsets
  • secret.reloader.stakater.com/reloadconfigmap.reloader.stakater.com/reload 注解会在指定的 configmap 或 secret 发生变化时重新加载 pod,不论 configmap 或 secret 是否被使用。
  • 你可以使用 --auto-annotation 标志覆盖自动注解
  • 你可以使用 --secret-auto-annotation 标志覆盖 secret 类型的自动注解
  • 你可以使用 --configmap-auto-annotation 标志覆盖 configmap 类型的自动注解
  • 你可以使用 --auto-search-annotation 标志覆盖搜索注解,使用 --search-match-annotation 标志覆盖匹配注解
  • 你可以使用 --configmap-annotation 标志覆盖 configmap 注解
  • 你可以使用 --secret-annotation 标志覆盖 secret 注解
  • 你可以使用 --namespaces-to-ignore 标志阻止监视某些命名空间
  • 你可以使用 --namespace-selector 标志只监视带有特定标签的一组命名空间
  • 你可以使用 --resource-label-selector 标志只监视带有特定标签的一组 secrets/configmaps
  • 你可以使用 --resources-to-ignore 标志阻止监视某些资源
  • 你可以使用 --log-format=json 选项配置 JSON 格式的日志记录
  • 你可以使用 --reload-strategy=<策略名称> 选项配置"重新加载策略"(详情如下)

重新加载策略

Reloader 支持多种"重新加载"策略来对资源执行滚动升级。以下列表描述了这些策略:

  • env-vars:当被跟踪的 configMap/secret 更新时,此策略会将 Reloader 特定的环境变量附加到拥有资源(如 DeploymentStatefulSet 等)上引用了变更的 configMapsecret 的任何容器中。可以通过 --reload-strategy=env-vars 参数指定此策略。注意:这是默认的重新加载策略。
  • annotations:当被跟踪的 configMap/secret 更新时,此策略会在拥有资源(如 DeploymentStatefulSet 等)上附加一个 reloader.stakater.com/last-reloaded-from pod 模板注解。当使用像 ArgoCD 这样的资源同步工具时,此策略很有用,因为它不会导致这些工具在资源重新加载后检测到配置偏差。注意:由于附加的 pod 模板注解只跟踪最后一次重新加载源,如果其 configMapsecret 被删除并重新创建,此策略将重新加载任何被跟踪的资源。可以通过 --reload-strategy=annotations 参数指定此策略。

部署到 Kubernetes

你可以通过以下方法部署 Reloader:

原生清单

你可以通过将清单中提供的 RELEASE-NAME 占位符更改为适当的值,并运行以下命令来应用原生清单:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

默认情况下,Reloader 部署在 default 命名空间中,并监视所有命名空间中 secretsconfigmaps 的变化。此外,在默认的 Reloader 部署中,设置了以下资源限制和请求:

resources: limits: cpu: 150m memory: 512Mi requests: cpu: 10m memory: 128Mi

可以通过向其容器传递以下参数(spec.template.spec.containers.args)来配置 Reloader 忽略 secretsconfigmaps 资源:

参数描述
--resources-to-ignore=configMaps忽略 configMaps
--resources-to-ignore=secrets忽略 secrets

注意: 一次只能忽略其中一种资源,尝试同时忽略两种资源将导致 Reloader 出错。忽略两种资源的解决方法是将 Reloader pods 缩放到 0

可以使用 --resource-label-selector 参数配置 Reloader 只监视带有一个或多个标签的 secrets/configmaps。支持的运算符有 !, in, notin, ==, =, !=,如果没有找到运算符,则推断为"存在"运算符(即仅键)。这些选择器的更多示例可以在 Kubernetes 文档中找到。

注意: 旧的 : 分隔的键值映射已被弃用,如果提供,将被转换为 key=value。同样,如果提供了通配符值(例如 key:*),它将被转换为独立的 key,用于检查键是否存在。

这些选择器可以组合使用,例如:

--resource-label-selector=reloader=enabled,key-exists,another-label in (value1,value2,value3)

只有标记如下的 configmaps 或 secrets 将被监视:

kind: ConfigMap apiVersion: v1 metadata: labels: reloader: enabled key-exists: yes another-label: value1

可以使用 --namespace-selector 参数配置 Reloader 只监视带有一个或多个标签的命名空间。支持的运算符有 !, in, notin, ==, =, !=,如果没有找到运算符,则推断为"存在"运算符(即仅键)。这些选择器的更多示例可以在 Kubernetes 文档中找到。

注意: 旧的 : 分隔的键值映射已被弃用,如果提供,将被转换为 key=value。同样,如果提供了通配符值(例如 key:*),它将被转换为独立的 key,用于检查键是否存在。

这些选择器可以组合使用,例如:

--namespace-selector=reloader=enabled,test=true

只有标记如下的命名空间将被监视并符合重新加载条件:

kind: Namespace apiVersion: v1 metadata: labels: reloader: enabled test: true

原生 Kustomize

你也可以通过运行以下命令应用原生清单

kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes

与原生清单类似,部署在 default 命名空间中,并监视所有命名空间中 secretsconfigmaps 的变化。

Kustomize

你可以使用我们的清单作为"基础"编写自己的 kustomization.yaml,并编写补丁来调整配置。

apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - https://github.com/stakater/Reloader/deployments/kubernetes namespace: reloader

Helm Charts

或者,如果你已经在集群上配置了 helm,可以从我们的公共 chart 仓库将 Reloader 添加到 helm 中,并使用以下命令通过 helm 部署它。如果你在将 Reloader 从 Helm2 迁移到 Helm3 时遇到问题,请参考这个指南。

安装

helm repo add stakater https://stakater.github.io/stakater-charts helm repo update helm install stakater/reloader # 对于 helm3,添加 --generate-name 标志或设置发布名称 helm install {{RELEASE_NAME}} stakater/reloader -n {{NAMESPACE}} --set reloader.watchGlobally=false # 默认情况下,Reloader 监视所有命名空间。要监视单个命名空间,设置 watchGlobally=false helm install stakater/reloader --set reloader.watchGlobally=false --namespace test --generate-name # 在 `test` 命名空间中安装 Reloader,它将只监视 `test` 命名空间中的 `Deployments`、`Daemonsets`、`Statefulsets` 和 `Rollouts`。

卸载

helm uninstall {{RELEASE_NAME}} -n {{NAMESPACE}}

参数

全局参数

参数描述类型默认值
global.imagePullSecrets引用一个或多个用于拉取镜像的 secrets数组[]

通用参数

参数描述类型默认值
nameOverride替换 chart 的名称字符串""
fullnameOverride替换生成的名称字符串""

核心 Reloader 参数

参数描述类型默认值
reloader.autoReloadAll布尔值false
reloader.isArgoRollouts启用Argo Rollouts。有效值为 truefalse布尔值false
reloader.isOpenshift启用OpenShift DeploymentConfigs。有效值为 truefalse布尔值false
reloader.ignoreSecrets忽略secrets。有效值为 truefalseignoreSecretsignoreConfigMaps 只能忽略其中一个,不能同时忽略两者布尔值false
reloader.ignoreConfigMaps忽略configMaps。有效值为 truefalse布尔值false
reloader.reloadOnCreate启用创建事件时重新加载。有效值为 truefalse布尔值false
reloader.reloadOnDelete启用删除事件时重新加载。有效值为 truefalse布尔值false
reloader.syncAfterRestart启用Reloader重启后同步添加事件,仅在reloadOnCreate为true时生效。有效值为 truefalse布尔值false
reloader.reloadStrategy触发资源重启的策略,设置为 defaultenv-varsannotations枚举default
reloader.ignoreNamespaces要忽略的命名空间列表,用逗号分隔,如果提供多个,它们将使用AND运算符组合字符串""
reloader.namespaceSelector要选择的命名空间列表,用逗号分隔,如果提供多个,它们将使用AND运算符组合字符串""
reloader.resourceLabelSelector标签选择器列表,用逗号分隔,如果提供多个,它们将使用AND运算符组合字符串""
reloader.logFormat设置日志格式类型。值可以是 json""字符串""
reloader.watchGlobally允许Reloader在所有命名空间(true)或仅在单个命名空间(false)中观察布尔值true
reloader.enableHA启用领导者选举,允许运行多个副本布尔值false
reloader.readOnlyRootFileSystem强制只读根文件系统布尔值false
reloader.legacy.rbac布尔值false
reloader.matchLabels要匹配的Pod标签映射{}
reloader.enableMetricsByNamespace按命名空间公开额外的Prometheus重载计数器(在具有许多命名空间的集群中,此指标可能具有高基数)布尔值false

部署Reloader参数

参数描述类型默认值
reloader.deployment.replicas副本数量,如果希望运行多个副本,请设置 reloader.enableHA = true整数1
reloader.deployment.revisionHistoryLimit限制修订历史中保留的修订数量整数2
reloader.deployment.nodeSelector基于设置的标签将pod调度到特定节点映射{}
reloader.deployment.affinity在pod上设置亲和规则映射{}
reloader.deployment.securityContext设置pod安全上下文映射{}
reloader.deployment.containerSecurityContext设置容器安全上下文映射{}
reloader.deployment.tolerations应用于部署的容忍列表数组[]
reloader.deployment.topologySpreadConstraintsPod分配的拓扑分布约束数组[]
reloader.deployment.annotations设置部署注释映射{}
reloader.deployment.labels设置部署标签,默认为stakater设置数组见values.yaml
reloader.deployment.image设置容器镜像名称、标签和策略数组见values.yaml
reloader.deployment.env支持额外的环境变量数组[]
reloader.deployment.livenessProbe设置存活探针超时值映射{}
reloader.deployment.readinessProbe设置就绪探针超时值映射{}
reloader.deployment.resources设置容器请求和限制(例如CPU或内存)映射{}
reloader.deployment.pod.annotations为pod设置注释映射{}
reloader.deployment.priorityClassName在集群中为pod设置优先级类字符串""

其他Reloader参数

参数描述类型默认值
reloader.service映射{}
reloader.rbac.enabled指定是否应创建基于角色的访问控制布尔值true
reloader.serviceAccount.create指定是否应创建ServiceAccount布尔值true
reloader.custom_annotations添加自定义注释映射{}
reloader.serviceMonitor.enabled启用以抓取Reloader的Prometheus指标(旧版)布尔值false
reloader.podMonitor.enabled启用以抓取Reloader的Prometheus指标布尔值false
reloader.podDisruptionBudget.enabled限制复制应用程序的pod数量布尔值false
reloader.netpol.enabled布尔值false
reloader.volumeMounts挂载卷数组[]
reloader.volumes向pod添加卷数组[]
reloader.webhookUrl向Reloader添加webhook字符串""

附加说明

  • namespaceSelectorresourceLabelSelector 可以一起使用。如果同时使用,则configmap或secret必须满足两个条件才能触发重新加载事件。(例如,如果configMap匹配resourceLabelSelectornamespaceSelector不匹配configmap所在的命名空间,它将被忽略)。
  • 一次只能忽略ignoreConfigMapsignoreSecrets中的一个资源,尝试同时忽略两者将导致helm模板编译错误。
  • OpenShift(DeploymentConfig)和/或Argo Rollouts的重新加载必须显式启用,因为在权限受限的集群上可能并不总是可以使用它。
  • isOpenShift 最近版本的OpenShift(在4.13.3上测试)要求指定用户在命名空间动态分配的uid范围内。解决方案是通过deployment.securityContext.runAsUser=null取消设置runAsUser变量,让OpenShift在安装时分配它。
  • reloadOnCreate控制Reloader如何处理首次添加到缓存的secrets。如果reloadOnCreate设置为true:
    1. 添加到缓存的Configmaps/secrets将导致Reloader对关联的工作负载执行滚动更新
    2. 首次部署应用程序时,Reloader将对关联的工作负载执行滚动更新
    3. 如果在HA模式下运行Reloader,当选出新的领导者时,所有工作负载都将执行滚动更新
  • reloadOnDelete控制Reloader如何处理被删除的secrets。如果reloadOnDelete设置为true:
    1. 删除Configmaps/secrets将导致Reloader对关联的工作负载执行滚动更新
  • serviceMonitor将在未来的Reloader版本中被移除,转而使用Pod monitor
  • 如果reloadOnCreate设置为false:
    1. 在没有领导者期间发生的configmaps/secrets更新将不会被新领导者拾取,直到configmap/secret发生后续更新
    2. 在最坏的情况下,可能没有领导者的窗口期为15秒,因为这是LeaseDuration
  • 如果reloadOnDelete设置为false:
    1. 删除引用这些资源的pod的configmaps/secrets不会产生任何影响。
  • 默认情况下,reloadOnCreatereloadOnDeletesyncAfterRestart都设置为false。所有这些都需要明确启用

帮助

文档

你可以在这里找到更多文档

有问题吗?

提交GitHub issue

在Slack上与我们交流

加入并在Slack上与我们讨论Reloader 加入Slack 聊天

贡献

错误报告和功能请求

请使用问题追踪器报告任何错误或提交功能请求。

开发

  1. 部署Reloader。
  2. 运行okteto up以激活您的开发容器。
  3. make build
  4. ./Reloader

欢迎提交PR。通常,我们遵循"fork-and-pull"Git工作流程。

  1. 在GitHub上Fork仓库
  2. 将项目克隆到您自己的机器上
  3. 将更改提交到您自己的分支
  4. 将您的工作推送回您的fork
  5. 提交拉取请求,以便我们可以审查您的更改

注意: 在提交拉取请求之前,请确保合并最新的"上游"更改!

更新日志

查看我们已关闭的拉取请求

许可证

Apache2 © Stakater

关于

ReloaderStakater维护。喜欢它吗?请通过hello@stakater.com告诉我们

查看我们的其他项目 或者如有专业服务和查询,请通过hello@stakater.com联系我们

致谢

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多