在kubernetes中,更新configMap后,pod是不会自动识别configMap中的变动。
configMap更新后,如果想使pod中引用configMap的变量生效,
通常简单的做法是:
方法1. 删除该pod,让其自动产生一份新的pod.
方法2. 修改pod的配置,让其自动产生一份新的pod.
方法3. 增加一个sidecar,让其监控configMap的变化,来重启pod.
下面我们通过修改deployment中的annotations方法来实现剩下pod:
我们使用kustomize 来做试验(如果你没loadBalance,修改改为nodePort方式访问),项目地址:https://github.com/kubernetes-sigs/kustomize/tree/master/examples/helloWorld
一、部署项目:
$ kubectl apply -k .
二、检查运行pod状况
$ curl 192.168.0.7:8666/
<html><body>
Version 1 : Good Morning !
</body></html>
三、修改configMap
3.1 这里我们修改: altGreeting的值
$ cat configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: the-map
data:
altGreeting: "Good Morning 3!"
enableRisky: "false"
3.2 修改kustomization.yaml
这里我们增加一个键值 commonAnnotations-->version
commonLabels:
app: hello
commonAnnotations:
version: 1.0.1
resources:
- deployment.yaml
- service.yaml
- configMap.yaml
四、再次重新发布
$ kubectl apply -k .
五、检查运行pod状况
$ curl 192.168.0.7:8666/
<html><body>
Version 1 : Good Morning 3!
</body></html>
可见,我们改过了configMap中的key-value的值后,在pod已经生效了。
原理就是:通过更新deployment中的Annotations,增加一个version的key,每次需要更新configMap,只要upgrade一次kustomization.yaml中的commonAnnotations->version的值,发布后,pod就会自动重建一次,以此来发现confiMap的新值。
其他方法:
利用sidecar方法:https://github.com/jimmidyson/configmap-reload (prometheus helm 就是使用此方法)