helm实现更新cm和secret后自动更新pod

在kubernetes中,更新configMap后,pod是不会自动识别configMap和secret中的变动。

configMap和secret更新后,如果想使pod中引用configMap和secret的变量生效,通常简单的做法是:

  • 方法1. 手动删除该pod,让其自动产生一份新的pod.
  • 方法2. 修改pod中的spec配置,让其自动产生一份新的pod.
  • 方法3. 增加一个sidecar,让其监控configMap的变化,来重启pod.

Reloader

Reloader[3] 是一个监视 ConfigMap/Secret 更改并对其关联的 Deployment、Daemonset、StatefulSet、DeploymentConfig 进行滚动更新的开源项目。

Reloader的使用方法比较简单,首先部署 Reloader 控制器:

1
kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

然后,给想要滚动更新配置的应用加上 reloader 注解即可:

1
2
3
4
5
6
7
kind: Deployment
metadata:
annotations:
secret.reloader.stakater.com/reload: "foo-secret"
configmap.reloader.stakater.com/reload: "foo-configmap"
spec:
template: metadata:

checksum 注解热更新

checksum 注解是 Helm Charts 中最常用的滚动更新方法,即在 Deployment 的 annotations 中加上 Secret 或者 ConfigMap 的 sha256sum,这样已有的 Pod 就会随着 Secret 或者 ConfigMap 的变更而更新。

1
2
3
4
5
6
7
8
kind: Deployment
spec:
template: # 注意是这个层级里面的注解
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
checksum/secrets: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]