我们希望监视ConfigMap
和/或Secret
中是否发生变化;然后对相关的DeploymentConfig
、Deployment
、Daemonset
、Statefulset
和Rollout
执行滚动升级。
Reloader可以监视ConfigMap
和Secret
的变化,并对与之关联的DeploymentConfigs
、Deployments
、Daemonsets
、Statefulsets
和Rollouts
的Pod执行滚动升级。
Reloader有两个不同的版本:
有关Reloader企业版的信息,请联系sales@stakater.com
。
Reloader与Kubernetes >= 1.19兼容
对于名为foo
的Deployment
,有一个名为foo-configmap
的ConfigMap
或名为foo-secret
的Secret
或两者都有。然后在Deployment
的主元数据中添加你的注解(默认为reloader.stakater.com/auto
)
kind: Deployment metadata: annotations: reloader.stakater.com/auto: "true" spec: template: metadata:
这将自动发现使用foo-configmap
或foo-secret
的deploymentconfigs/deployments/daemonsets/statefulset/rollouts,无论是通过环境变量还是通过卷挂载。当foo-configmap
或foo-secret
更新时,它将对相关的pod执行滚动升级。
你可以按监视资源的类型进行过滤,并使用auto
注解的类型化版本。如果你只想发现挂载的Secret
的变化,并忽略ConfigMap
的变化,请添加secret.reloader.stakater.com/auto
注解。类似地,你可以使用configmap.reloader.stakater.com/auto
注解来查找挂载的ConfigMap
的变化,任何挂载的Secret
的变化都不会触发相关pod的滚动升级。
你也可以将这种发现限制为只有带有特殊注解的ConfigMap
或Secret
对象。要 利用这一点,请这样注解你的deploymentconfigs/deployments/daemonsets/statefulset/rollouts:
kind: Deployment metadata: annotations: reloader.stakater.com/search: "true" spec: template:
Reloader将在修改任何带有如下注解的ConfigMap
或Secret
时触发滚动升级:
kind: ConfigMap metadata: annotations: reloader.stakater.com/match: "true" data: key: value
前提是secret/configmap正在环境变量或卷挂载中使用。
请注意,reloader.stakater.com/search
和reloader.stakater.com/auto
不能同时使用。如果你在部署中有reloader.stakater.com/auto: "true"
注解,那么它将始终在其使用的configmaps或secrets发生变化时重启,无论它们是否有reloader.stakater.com/match: "true"
注解。
同样,reloader.stakater.com/auto
及其类型化版本(secret.reloader.stakater.com/auto
或configmap.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发生变化时触发滚动升级,这样,它就不会在deploymentconfig
、deployment
、daemonset
、statefulset
或rollout
中使用的所有configmaps或secrets发生变化时触发滚动升级。
要做到这一点,要么将auto注解设置为"false"
(reloader.stakater.com/auto: "false"
),要么完全删除它,并使用Configmap或Secret的注解。
也可以通过设置--auto-reload-all
标志来为所有资源启用自动重新加载。
在这种情况下,所有没有将auto注解(或其类型化版本)设置为"false"
的资源,在其ConfigMaps或Secrets更新时都会自动重新加载。
注意,将auto注解设置为未定义的值也算作false。
要仅在特定configmaps发生变化时执行滚动升级,请使用以下注解。
对于名为foo
的Deployment
,有一个名为foo-configmap
的ConfigMap
。然后在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:
要仅在特定secrets发生变化时执行滚动升级,请使用以下注解。
对于名为foo
的Deployment
,有一个名为foo-secret
的Secret
。然后在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:
rollouts
,Reloader 只是触发一个变更,如何配置 rollout
策略由你决定。reloader.stakater.com/auto: "true"
只会在 configmap 或 secret 被使用时(作为卷挂载或环境变量)重新加载 pod,适用于 DeploymentConfigs/Deployment/Daemonsets/Statefulsets
。secret.reloader.stakater.com/reload
或 configmap.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 支持多种"重新加载"策略来对资源执行滚动升级。以下列表描述了这些策略:
configMap
/secret
更新时,此策略会将 Reloader 特定的环境变量附加到拥有资源(如 Deployment
、StatefulSet
等)上引用了变更的 configMap
或 secret
的任何容器中。可以通过 --reload-strategy=env-vars
参数指定此策略。注意:这是默认的重新加载策略。configMap
/secret
更新时,此策略会在拥有资源(如 Deployment
、StatefulSet
等)上附加一个 reloader.stakater.com/last-reloaded-from
pod 模板注解。当使用像 ArgoCD 这样的资源同步工具时,此策略很有用,因为它不会导致这些工具在资源重新加载后检测到配置偏差。注意:由于附加的 pod 模板注解只跟踪最后一次重新加载源,如果其 configMap
或 secret
被删除并重新创建,此策略将重新加载任何被跟踪的资源。可以通过 --reload-strategy=annotations
参数指定此策略。你可以通过以下方法部署 Reloader:
你可以通过将清单中提供的 RELEASE-NAME
占位符更改为适当的值,并运行以下命令来应用原生清单:
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
默认情况下,Reloader 部署在 default
命名空间中,并监视所有命名空间中 secrets
和 configmaps
的变化。此外,在默认的 Reloader 部署中,设置了以下资源限制和请求:
resources: limits: cpu: 150m memory: 512Mi requests: cpu: 10m memory: 128Mi
可以通过向其容器传递以下参数(spec.template.spec.containers.args
)来配置 Reloader 忽略 secrets
和 configmaps
资源:
参数 | 描述 |
---|---|
--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
你也可以通过运行以下命令应用原生清单
kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
与原生清单类似,部署在 default
命名空间中,并监视所有命名空间中 secrets
和 configmaps
的变化。
你可以使用我们的清单作为"基础"编写自己的 kustomization.yaml
,并编写补丁来调整配置。
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - https://github.com/stakater/Reloader/deployments/kubernetes namespace: reloader
或者,如果你已经在集群上配置了 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.autoReloadAll | 布尔值 | false | |
reloader.isArgoRollouts | 启用Argo Rollouts 。有效值为 true 或 false | 布尔值 | false |
reloader.isOpenshift | 启用OpenShift DeploymentConfigs。有效值为 true 或 false | 布尔值 | false |
reloader.ignoreSecrets | 忽略secrets。有效值为 true 或 false 。ignoreSecrets 或 ignoreConfigMaps 只能忽略其中一个,不能同时忽略两者 | 布尔值 | false |
reloader.ignoreConfigMaps | 忽略configMaps。有效值为 true 或 false | 布尔值 | false |
reloader.reloadOnCreate | 启用创建事件时重新加载。有效值为 true 或 false | 布尔值 | false |
reloader.reloadOnDelete | 启用删除事件时重新加载。有效值为 true 或 false | 布尔值 | false |
reloader.syncAfterRestart | 启用Reloader重启后同步添加 |