Project Icon

Reloader

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

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

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联系我们

致谢

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号