Reloader
问题
我们希望监视ConfigMap
和/或Secret
中是否发生变化;然后对相关的DeploymentConfig
、Deployment
、Daemonset
、Statefulset
和Rollout
执行滚动升级。
解决方案
Reloader可以监视ConfigMap
和Secret
的变化,并对与之关联的DeploymentConfigs
、Deployments
、Daemonsets
、Statefulsets
和Rollouts
的Pod执行滚动升级。
企业版
Reloader有两个不同的版本:
- 开源版本
- 企业版,包括:
- SLA(服务级别协议)支持和独特请求
- Slack支持
- 认证镜像
有关Reloader企业版的信息,请联系sales@stakater.com
。
兼容性
Reloader与Kubernetes >= 1.19兼容
如何使用Reloader
对于名为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。
Configmap
要仅在特定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:
Secret
要仅在特定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:
注意事项
- 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/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 支持多种"重新加载"策略来对资源执行滚动升级。以下列表描述了这些策略:
- env-vars:当被跟踪的
configMap
/secret
更新时,此策略会将 Reloader 特定的环境变量附加到拥有资源(如Deployment
、StatefulSet
等)上引用了变更的configMap
或secret
的任何容器中。可以通过--reload-strategy=env-vars
参数指定此策略。注意:这是默认的重新加载策略。 - annotations:当被跟踪的
configMap
/secret
更新时,此策略会在拥有资源(如Deployment
、StatefulSet
等)上附加一个reloader.stakater.com/last-reloaded-from
pod 模板注解。当使用像 ArgoCD 这样的资源同步工具时,此策略很有用,因为它不会导致这些工具在资源重新加载后检测到配置偏差。注意:由于附加的 pod 模板注解只跟踪最后一次重新加载源,如果其configMap
或secret
被删除并重新创建,此策略将重新加载任何被跟踪的资源。可以通过--reload-strategy=annotations
参数指定此策略。
部署到 Kubernetes
你可以通过以下方法部署 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
原生 Kustomize
你也可以通过运行以下命令应用原生清单
kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
与原生清单类似,部署在 default
命名空间中,并监视所有命名空间中 secrets
和 configmaps
的变化。
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 。有效值为 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重启后同步添加事件,仅在reloadOnCreate为true 时生效。有效值为 true 或 false | 布尔值 | false |
reloader.reloadStrategy | 触发资源重启的策略,设置为 default 、env-vars 或 annotations | 枚举 | 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.topologySpreadConstraints | Pod分配的拓扑分布约束 | 数组 | [] |
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 | 字符串 | "" |
附加说明
namespaceSelector
和resourceLabelSelector
可以一起使用。如果同时使用,则configmap或secret必须满足两个条件才能触发重新加载事件。(例如,如果configMap匹配resourceLabelSelector
但namespaceSelector
不匹配configmap所在的命名空间,它将被忽略)。- 一次只能忽略
ignoreConfigMaps
或ignoreSecrets
中的一个资源,尝试同时忽略两者将导致helm模板编译错误。 - OpenShift(DeploymentConfig)和/或Argo
Rollouts
的重新加载必须显式启用,因为在权限受限的集群上可能并不总是可以使用它。 isOpenShift
最近版本的OpenShift(在4.13.3上测试)要求指定用户在命名空间动态分配的uid
范围内。解决方案是通过deployment.securityContext.runAsUser=null
取消设置runAsUser变量,让OpenShift在安装时分配它。reloadOnCreate
控制Reloader如何处理首次添加到缓存的secrets。如果reloadOnCreate
设置为true:- 添加到缓存的Configmaps/secrets将导致Reloader对关联的工作负载执行滚动更新
- 首次部署应用程序时,Reloader将对关联的工作负载执行滚动更新
- 如果在HA模式下运行Reloader,当选出新的领导者时,所有工作负载都将执行滚动更新
reloadOnDelete
控制Reloader如何处理被删除的secrets。如果reloadOnDelete
设置为true:- 删除Configmaps/secrets将导致Reloader对关联的工作负载执行滚动更新
serviceMonitor
将在未来的Reloader版本中被移除,转而使用Pod monitor- 如果
reloadOnCreate
设置为false:- 在没有领导者期间发生的configmaps/secrets更新将不会被新领导者拾取,直到configmap/secret发生后续更新
- 在最坏的情况下,可能没有领导者的窗口期为15秒,因为这是LeaseDuration
- 如果
reloadOnDelete
设置为false:- 删除引用这些资源的pod的configmaps/secrets不会产生任何影响。
- 默认情况下,
reloadOnCreate
、reloadOnDelete
和syncAfterRestart
都设置为false。所有这些都需要明确启用
帮助
文档
你可以在这里找到更多文档
有问题吗?
提交GitHub issue。
在Slack上与我们交流
贡献
错误报告和功能请求
请使用问题追踪器报告任何错误或提交功能请求。
开发
- 部署Reloader。
- 运行
okteto up
以激活您的开发容器。 make build
./Reloader
欢迎提交PR。通常,我们遵循"fork-and-pull"Git工作流程。
- 在GitHub上Fork仓库
- 将项目克隆到您自己的机器上
- 将更改提交到您自己的分支
- 将您的工作推送回您的fork
- 提交拉取请求,以便我们可以审查您的更改
注意: 在提交拉取请求之前,请确保合并最新的"上游"更改!
更新日志
查看我们已关闭的拉取请求。
许可证
Apache2 © Stakater
关于
Reloader
由Stakater维护。喜欢它吗?请通过hello@stakater.com告诉我们
查看我们的其他项目 或者如有专业服务和查询,请通过hello@stakater.com联系我们
致谢
- ConfigmapController;我们在这里记录了为什么我们重新创建了Reloader