如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
基于 https://sdk.operatorframework.io/ 重构的 Reloader v2 现已正式发布,所有新功能开发均在 https://github.com/stakater/Reloader/tree/v2 分支进行。
master 分支(对应 Reloader v1)已停止新功能开发,仅接收安全修复与关键 Bug 补丁。所有新功能需求和 Pull Request 请提交至 v2 分支,分支命名与 PR 标题规则请参考贡献指南。
Reloader 是一款 Kubernetes 控制器,当被关联的 Secret、ConfigMap 或可选的 CSI 挂载 Secret 发生更新时,它会自动触发对应工作负载(如 Deployment、StatefulSet 等)的滚动更新。
在传统 Kubernetes 部署场景中,更新 Secret 或 ConfigMap 不会自动重启或重新部署关联工作负载,这可能导致生产环境运行过期配置,尤其是凭证、功能开关、环境配置这类动态值的场景下问题更为突出。
Reloader 解决了这一痛点,可确保工作负载自动、安全地同步配置变更。
📚 完整文档请访问 Stakater 官方文档站点
flowchart LR
ExternalSecret -->|Creates| Secret
SealedSecret -->|Creates| Secret
Certificate -->|Creates| Secret
Secret -->|Watched by| Reloader
ConfigMap -->|Watched by| Reloader
Reloader -->|Triggers Rollout| Deployment
Reloader -->|Triggers Rollout| DeploymentConfig
Reloader -->|Triggers Rollout| Daemonset
Reloader -->|Triggers Rollout| Statefulset
Reloader -->|Triggers Rollout| ArgoRollout
Reloader -->|Triggers Job| CronJob
Reloader -->|Sends Notification| Slack,Teams,Webhook
ExternalSecret、SealedSecret 或 cert-manager 提供的 Certificate 这类组件可以创建或管理 Kubernetes Secret,Secret 也支持手动创建或通过 GitOps 工作流交付Secret 和 ConfigMap 的变更开源版 Reloader 完全免费,已在生产环境经过验证,累计下载量超过 240 亿次。
针对有更高合规与服务要求的团队,Reloader 提供企业版选项:
| 需求项 | 企业版支持 |
|---|---|
| 无已知 CVE 漏洞、附带 SBOM 的签名镜像 | ✅ |
| 由 Kubernetes 技术专家提供 SLA 保障的技术支持 | ✅ |
| 满足合规审计要求的构件来源溯源能力 | ✅ |
| 专属问题升级响应通道 | ✅ |
→ 如有 Reloader 企业版相关需求,请联系销售团队获取详情。
请任选一种安装方式完成部署。
以下示例为 Deployment 启用自动重载能力:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
annotations:
reloader.stakater.com/auto: "true"
spec:
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: your-image
envFrom:
- configMapRef:
name: my-config
- secretRef:
name: my-secret
该配置会告知 Reloader 监听此 Deployment 中引用的 ConfigMap 和 Secret,任意一项发生更新时都会触发工作负载滚动更新。
Reloader 支持多种基于注解的控制规则,你可以自定义 Kubernetes 工作负载在 Secret/ConfigMap 变更时的重载时机与行为。
Kubernetes 本身不会在关联的 Secret 或 ConfigMap 更新时触发 Pod 重启,Reloader 通过监听变更自动执行滚动更新填补了这一空白,同时提供基于注解的全量控制能力,支持以下场景:
Secret 或仅针对 ConfigMap 启用重载search + match)实现按需启用重载使用以下注解可在关联的 Secret 或 ConfigMap 发生变更时自动重启工作负载。
| 注解 | 说明 |
|---|---|
reloader.stakater.com/auto: "true" | 任意被引用的 ConfigMap 或 Secret 变更时,触发工作负载重载 |
secret.reloader.stakater.com/auto: "true" | 仅当被引用的 Secret 变更时,触发工作负载重载 |
configmap.reloader.stakater.com/auto: "true" | 仅当被引用的 ConfigMap 变更时,触发工作负载重载 |
这类注解允许你手动定义可触发重载的 ConfigMap 或 Secret 名称,无需依赖这些资源是否在 Pod 配置中被引用。
| 注解 | 说明 |
|---|---|
secret.reloader.stakater.com/reload: "my-secret" | 指定的 Secret 变更时触发重载,不受该 Secret 的使用方式限制 |
configmap.reloader.stakater.com/reload: "my-config" | 指定的 ConfigMap 变更时触发重载,不受该 ConfigMap 的使用方式限制 |
适用场景
该模式可实现细粒度的重载控制:只有当满足以下两个条件时,工作负载才会在 Secret/ConfigMap 变更时重启:
match: true 注解| 注解 | 作用对象 | 说明 |
|---|---|---|
reloader.stakater.com/search: "true" | 工作负载 | 启用搜索模式(仅当匹配的 Secret/ConfigMap 存在时才会触发重载) |
reloader.stakater.com/match: "true" | ConfigMap/Secret | 将对应配置/Secret 标记为搜索模式下可触发重载的候选资源 |
工作逻辑
reloader.stakater.com/search: "true"reloader.stakater.com/match: "true"volumeMount 等方式在对应工作负载中被引用适用场景
reloader.stakater.com/match: "true" 的 ConfigMap 或 Secret 时,才触发重载。如果需要阻止指定 ConfigMap 或 Secret 触发任何重载操作,可以直接在该资源上添加忽略注解:
apiVersion: v1
kind: ConfigMap # 也可设置为 Secret
metadata:
name: my-config
annotations:
reloader.stakater.com/ignore: "true"
该配置会指示 Reloader 跳过所有工作负载对该资源的全部重载逻辑。
[!NOTE] 该功能仅在搭配 https://argoproj.github.io/argo-rollouts/ 使用时生效,不适用于标准 Kubernetes
Deployment、StatefulSet或DaemonSet。使用前必须在 Reloader 中开启 Argo Rollouts 支持,例如通过启动参数--is-argo-rollouts=true启用。
默认情况下,Reloader 会通过更新 Pod 模板触发 Argo Rollouts 控制器执行标准发布流程。该逻辑在大多数场景下都能正常工作,但由于此操作会修改工作负载规约,ArgoCD 等 GitOps 工具会将其识别为「配置漂移」,并标记应用处于 OutOfSync 状态。
为避免该问题,你可以切换到 restart 策略:该策略仅重启 Pod,不会修改 Pod 模板。
metadata:
annotations:
reloader.stakater.com/rollout-strategy: "restart"
| 取值 | 行为说明 |
|---|---|
rollout(默认值) | 更新 Pod 模板元数据以触发发布流程 |
restart | 删除 Pod 完成重启,不会对模板执行任何补丁操作 |
符合以下任意场景时,推荐使用 restart 策略:
该设置仅影响 Argo Rollouts 的行为,不会修改 Argo CD 的同步配置。
reloader.stakater.com/auto 和 reloader.stakater.com/search 不可同时使用——如果同时配置,auto 注解优先级更高。auto 及其分类版本(secret.reloader.stakater.com/auto、configmap.reloader.stakater.com/auto),只需其中任意一个取值为 true 即可触发重载。reloader.stakater.com/auto: "false" 会直接禁用该工作负载的重载功能。--auto-reload-all 参数:
auto: "true",除非该工作负载显式将其设置为 "false"。"false"。Reloader 支持可选的告警推送功能:每当它为工作负载(例如 Deployment、StatefulSet 等)触发滚动升级时,就可以向外发送告警通知。
告警会被推送到你配置的 Webhook 端点,该端点可以是通用接收服务,也可以对接 Slack、Microsoft Teams、Google Chat 这类第三方通知服务。
如果通过 Helm 安装 Reloader,可以修改 values.yaml 中的 reloader.env.secret 字段开启该功能:
reloader:
deployment:
env:
secret:
ALERT_ON_RELOAD: "true" # 开启告警功能(默认值:false)
ALERT_SINK: "slack" # 可选值:slack、teams、gchat 或 webhook(默认值:webhook)
ALERT_WEBHOOK_URL: " " # 当 ALERT_ON_RELOAD 为 true 时该字段必填
ALERT_ADDITIONAL_INFO: "Triggered by Reloader in staging environment"
该功能允许你为 Deployment 设置指定时长的重载暂停周期:当多个 ConfigMap 或 Secret 在短时间内连续更新时,可以避免不必要的重复重启。
| 注解 | 生效对象 | 说明 |
|---|---|---|
deployment.reloader.stakater.com/pause-period: "5m" | Deployment | 暂停指定时长内的所有重载操作,例如可设置为 5m(5 分钟)、1h(1 小时) |
工作原理
deployment.reloader.stakater.com/pause-period 注解,指定暂停时长,例如填写 "5m" 代表暂停 5 分钟。适用场景
Reloader 兼容 https://secrets-store-csi-driver.sigs.k8s.io/,该驱动支持将外部密钥管理服务(例如 AWS Secrets Manager、Azure Key Vault、HashiCorp Vault)中的密钥直接挂载到 Pod 内。
与原生 Kubernetes Secret 对象不同,CSI 挂载的密钥变更不会总能触发 Kubernetes 原生更新事件。Reloader 会通过监控 CSI 状态资源解决这个问题:当挂载的密钥版本发生变化时,自动重启受影响的工作负载。
工作原理
开启密钥轮换功能后,Secrets Store CSI Driver 会更新一个名为 SecretProviderClassPodStatus 的 Kubernetes 资源。该资源会记录当前 Pod 所有已挂载密钥的版本信息,Reloader 会监控该资源的变更,一旦检测到版本变化就会触发工作负载发布。
前置条件
--enable-csi-integration=trueCSI 挂载密钥专属注解
| 注解 | 说明 |
|---|---|
reloader.stakater.com/auto: "true" | 全局自动发现:当工作负载挂载的任意 ConfigMap 或 Secret 更新时,自动发现并触发重载 |
secretproviderclass.reloader.stakater.com/auto: 'true' | CSI 专属自动发现:专门监控该工作负载使用的所有 SecretProviderClass 的更新(依赖 CSI 驱动集成功能) |
secretproviderclass.reloader.stakater.com/reload: "my-secretproviderclass" | 定向重载:仅当指定名称的 SecretProviderClass 发生更新时,才触发该工作负载重载 |
Reloader 会通过监控 SecretProviderClassPodStatus 实现单密钥粒度的变更检测。请确保你需要监控的每个密钥都已在 SecretProviderClass 中通过 secretKey 字段完成正确定义。
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: vault-reloader-demo
namespace: test
spec:
provider: vault
parameters:
vaultAddress: "http://vault.vault.svc:8200"
vaultSkipTLSVerify: "true"
roleName: "demo-role"
objects: |
- objectName: "password"
secretPath: "secret/data/reloader-demo"
secretKey: "password"
[!IMPORTANT] Reloader 会追踪单个密钥(通过
secretKey标识)的变更。如果你的 SecretProviderClass 没有为每个对象指定secretKey,Reloader 可能无法正确检测到更新。
注意事项与限制
subPath 挂载)仍然生效,这类场景可能需要手动重启 Pod根据你的 Kubernetes 环境和使用偏好,可通过多种方式安装 Reloader。以下是支持的安装方法:
helm repo add stakater https://stakater.github.io/stakater-charts
helm repo update
helm install reloader stakater/reloader
➡️ 完整的 Helm 配置说明请参阅 Chart 说明文档。
直接应用官方 Kubernetes 原生清单:
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml
使用内置的 Kustomize 支持完成部署:
kubectl apply -k https://github.com/stakater/Reloader/deployments/kubernetes
你可以创建自己的 kustomization.yaml,将 Reloader 的官方配置作为基础依赖:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- https://github.com/stakater/Reloader/deployments/kubernetes
namespace: reloader
默认情况下,Reloader 部署时会配置以下资源请求和限制:
resources:
limits:
cpu: 150m
memory: 512Mi
requests:
cpu: 10m
memory: 128Mi
以下参数可在 Reloader 控制器层面全局自定义其运行行为:
1. 🔁 重载行为
| 参数 | 说明 |
|---|---|
--reload-on-create=true | 当监控的 ConfigMap 或 Secret 被创建时触发关联工作负载重载 |
--reload-on-delete=true | 当监控的 ConfigMap 或 Secret 被删除时触发关联工作负载重载 |
--auto-reload-all=true | 自动重载所有工作负载,除非工作负载显式标注为不参与自动重载(即设置 auto: "false") |
--reload-strategy=env-vars | 用于触发重载的策略,可选值为 env-vars 或 annotations |
--log-format=json | 启用 JSON 格式日志,提升日志的机器可读性 |
重载策略
当监控的 ConfigMap 或 Secret 发生变更时,Reloader 支持多种策略触发滚动更新,你可以通过 --reload-strategy 参数指定使用的策略。
| 策略 | 说明 |
|---|---|
env-vars(默认) | 为引用了变更资源的所有容器(例如 Deployment、StatefulSet 等)添加一个无实际作用的环境变量,强制 Kubernetes 执行滚动更新。 |
annotations | 在 Pod 模板元数据中添加 reloader.stakater.com/last-reloaded-from 注解,非常适用于 ArgoCD 等 GitOps 工具,可以避免触发不必要的同步差异。 |
env-vars 是默认策略,可在绝大多数部署场景下正常工作。annotations 策略,避免在 ArgoCD、Flux 等工具中引发配置漂移问题。annotations 模式下,被删除后重新创建的 ConfigMap 或 Secret 仍会触发重载(因为 Reloader 不会追踪历史状态)。2. 🚫 资源过滤
| 参数 | 说明 |
|---|---|
--resources-to-ignore=configmaps | 忽略 ConfigMap 资源(同一时间仅可忽略一种资源类型) |
--resources-to-ignore=secrets | 忽略 Secret 资源(不可与 configMaps 同时配置) |
--ignored-workload-types=jobs,cronjobs | 针对指定类型的工作负载,跳过其重载监控逻辑 |
--resource-label-selector=key=value | 仅监控带有匹配标签的 ConfigMap/Secret |
[!NOTE] 同一时间只能忽略一种资源类型。尝试同时忽略
configmaps和secrets会导致 Reloader 运行报错。 ✅ 临时替代方案:如果你需要完全禁用 Reloader,可以将其 Deployment 副本数缩放至0。
💡 工作负载类型配置示例:
# 仅忽略 Job 类型
--ignored-workload-types=jobs
# 仅忽略 CronJob 类型
--ignored-workload-types=cronjobs
# 同时忽略两种类型(使用逗号分隔)
--ignored-workload-types=jobs,cronjobs
🔧 使用场景:当你不希望特定类型的工作负载被自动重载时,忽略指定工作负载类型的功能非常实用。
3. 🧩 命名空间过滤
| 参数 | 说明 |
|---|---|
--namespace-selector='key=value' --namespace-selector='key1=value1,value2=value2' --namespace-selector='key in (value1,value2)' | 仅监控带有匹配标签的命名空间。关于标签选择器的更多细节,请参阅 https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#list-and-watch-filtering |
--namespaces-to-ignore=ns1,ns2 | 跳过指定的命名空间,不纳入监控范围 |
4. 📝 注解键自定义
以下参数支持你自定义工作负载或资源上使用的注解键名:
| 参数 | 覆盖的默认注解 |
|---|---|
--auto-annotation | 覆盖默认的 reloader.stakater.com/auto 注解 |
--secret-auto-annotation | 覆盖默认的 secret.reloader.stakater.com/auto 注解 |
--configmap-auto-annotation | 覆盖默认的 configmap.reloader.stakater.com/auto 注解 |
--auto-search-annotation | 覆盖默认的 reloader.stakater.com/search 注解 |
--search-match-annotation | 覆盖默认的 reloader.stakater.com/match 注解 |
--secret-annotation | 覆盖默认的 secret.reloader.stakater.com/reload 注解 |
--configmap-annotation | 覆盖默认的 configmap.reloader.stakater.com/reload 注解 |
--ignore-annotation | 覆盖默认的 reloader.stakater.com/ignore 注解 |
--pause-deployment-annotation | 覆盖默认的 deployment.reloader.stakater.com/pause-period 注解 |
--pause-deployment-time-annotation | 覆盖默认的 deployment.reloader.stakater.com/paused-at 注解 |
5. ⚖️ 高可用
当通过 --enable-ha 参数运行多副本实例时,Reloader 会基于 Kubernetes Lease 机制实现领导者选举。以下参数可用于调整 client-go 领导者选举的相关时序配置:
| Flag | 描述 |
|---|---|
--leader-election-lease-duration=15s | 非领导者候选节点在强制夺取领导权前的等待时长 |
--leader-election-renew-deadline=10s | 现任领导者在放弃领导权前重试刷新租约的最长时长 |
--leader-election-retry-period=2s | 节点尝试获取和续订领导权操作之间的间隔时长 |
租约时长必须为不小于 1s 的整秒数值:由于租约信息在 Lease 资源中以整秒形式持久化存储,跟随节点会依据该存储值判断租约是否过期,非整数的租约时长会被截断,这可能导致跟随节点判定租约已过期的时间早于现任领导者到达续订截止时间,进而同时出现两个领导者。此外租约时长必须大于续订截止时间,而续订截止时间必须大于重试周期乘以抖动系数 1.2 所得的结果。设置更长的参数值可减少 API 服务器流量,提升对低速网络的容忍度;设置更短的参数值则可缩短领导者异常后的故障切换间隔。
6. 🕷️ 调试
| Flag | 描述 |
|---|---|
--enable-pprof | 启用 pprof 性能分析功能 |
--pprof-addr | pprof 服务启动监听地址,默认值为 :6060 |
Reloader 兼容 Kubernetes 1.19 及以上版本。
Reloader 在全球数千个 Kubernetes 集群中的 Docker 拉取量已超过 240 亿次。
如果您正在生产环境中使用 Reloader,欢迎向我们反馈:
查看所有 Reloader 用户 →
请在 GitHub 提交 https://github.com/stakater/Reloader/issues。
加入 Slack 群组即可与我们讨论 Reloader 相关问题:
master 分支当前处于功能冻结状态,仅接受 Bug 修复(fix:)和维护类变更(chore:)。v2 为当前活跃开发分支,所有新功能请提交至 v2 分支。拉取请求标题必须遵循 https://www.conventionalcommits.org/ 规范,例如 fix(chart): correct probe port。在 v2 分支下允许使用以下前缀:feat、fix、chore、docs、refactor、perf、test、ci、build 以及 revert。
请通过 https://github.com/stakater/Reloader/issues 提交任意 Bug 反馈或功能需求。
okteto up 启动开发容器make build 完成构建./Reloader 启动程序我们欢迎所有拉取请求,项目整体遵循标准的 "fork-and-pull" Git 工作流:
[!NOTE] 在提交拉取请求前,请务必先合并上游仓库的最新代码!
仓库 GitHub 发布:应社区在 https://github.com/stakater/Reloader/issues/685 中的需求,Reloader 现已采用手动发布流程。不再在每个 PR 合并到主分支后自动发布版本,而是按需手动触发发布。
执行 GitHub 发布的步骤如下:
master 分支创建名为 release-vX.Y.Z 的发布分支TARGET_BRANCH 参数设置为目标发布分支,即 release-vX.Y.ZTARGET_VERSION 参数设置为不带前缀 v 的目标版本号,即 X.Y.ZvX.Y.Z、目标分支为 release-vX.Y.Z 的 GitHub 发布,该操作将触发对应镜像的构建master 分支新建分支,同时更新 Helm Chart 版本与 Reloader 镜像版本
release/helm-chart 标签的 PR,示例参考:https://github.com/stakater/Reloader/pull/846仓库 Git 标签:当代码推送到主分支时,系统会自动生成名为 merge-${{ github.event.number }} 的合并镜像与合并标签,例如当编号为 800 的拉取请求被合并后,将生成标签 merge-800。
您可以在 https://github.com/stakater/Reloader/releases 查看每个版本的变更内容。
Apache2 © Stakater
Reloader 由 Stakater 维护。如果您觉得本项目有用,欢迎通过 *** 与我们取得联系。
您可以查看 https://github.com/stakater,如果有专业服务需求或任何疑问,也请通过 *** 联系我们。
来自真实用户的反馈,见证轩辕镜像的优质服务