K8s ConfigMap 变更触发 Pod 重启

ConfigMap 更新后,挂载它的 Pod 不会自动重启。实现”ConfigMap 变更 → 自动重启对应工作负载”有三种主流方案。

方案一:Reloader 控制器(推荐)

Reloader 专为解决此问题设计,监视 ConfigMap/Secret 变化,自动触发关联工作负载的滚动重启。

安装

helm repo add stakater https://stakater.github.io/stakater-charts
helm install reloader stakater/reloader --namespace kube-system

使用:为 Deployment 添加注解即可。

metadata:
  annotations:
    reloader.stakater.com/auto: "true"  # 监视引用的所有 ConfigMap/Secret
    # 或指定特定 ConfigMap
    configmap.reloader.stakater.com/reload: "my-configmap"

优点:完全自动、精准(只重启关联工作负载)、支持外部变更、不侵入 Chart 模板。 缺点:需额外安装控制器。

方案二:Helm Checksum 注解(轻量方案)

将 ConfigMap 内容散列值作为 Deployment 注解,helm upgrade 时 checksum 变化触发滚动更新。

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

优点:无需额外组件,Helm 社区标准模式。 缺点:仅 helm upgrade 时触发,不支持外部变更,需修改模板。

方案三:Wave 控制器

Wave 是类似 Reloader 的控制器。

helm repo add wave-k8s https://wave-k8s.github.io/wave/
helm install wave wave-k8s/wave

注解:wave.k8s.io/hash: <configmap-name>

方案对比

特性Reloader(推荐)Checksum 注解Wave
自动化程度完全自动helm upgrade完全自动
依赖 Helm
修改 Chart仅加注解需改模板仅加注解
支持外部变更支持不支持支持
额外组件需安装控制器不需要需安装控制器

选择建议

  • 推荐 Reloader:一劳永逸,不侵入 Chart 逻辑,还能感知外部变更。
  • 不想引入新控制器:Checksum 注解是轻量替代方案,前提是 ConfigMap 变更总伴随 helm upgrade

如果应用支持热加载(如 Nginx、Spring Cloud Config),也可通过挂载 Volume 让应用自行感知变化,但这需要应用本身支持。

相关笔记