|NO.Z.00184|——————————|CloudNative|——|KuberNetes&配置管理.V15|——|configmap.secret热更新.v01|解决configmap不被更新感知的问题|
一、ConfigMap和Secret的热更新概述
### --- ConfigMap和Secret的热更新概述
~~~ ConfigMap和Secret如果是以subPath 的形式挂载的,
~~~ 那么Pod是不会感知到ConfigMap和Secret的更新的。
~~~ 如果Pod的变量来自于ConfigMap和Secret中定义的内容,那么ConfigMap和Secret更新后,
~~~ 也不会更新Pod中的变量。
~~~ # ConfigMap和Secret的更新方式是一样的。以configMap为例
~~~ postStart:容器启动之前执行的命令
~~~ preStop:容器停止之前执行的命令
### --- 热更新ConfigMap或Secret方式
~~~ # 第一种:edit;最常使用的方式。
[root@k8s-master01 ~]# kubectl edit cm nginx-conf
~~~ # 第二种:自己定义一个yaml文件,写入更新的内容,进行replace也是一种。
[root@k8s-master01 ~]# kubectl replace -f demo.nginx-deploy.yaml
二、configmap和secret更新
### --- 使用edit修改容器配置参数
~~~ 更新操作:nworker_processes的值改为2
[root@k8s-master01 ~]# kubectl edit cm nginx-conf
apiVersion: v1
data:
nginx.conf: "\r\nuser nginx;\r\nworker_processes 2; // 把nworker-processes的值改为2
configmap/nginx-conf edited
***************省略部分内容******************
resourceVersion: "778597" // 查看resourceVersion的值,它的值每次更新它都会有变化
### --- 查看这个容器它的文件有没有被更新
~~~ 可以看到它是没有被更新的,更新是有周期的,
~~~ 周期应该是configmap的更新时间+configmap的缓存时间就会触发它的更新。
~~~ 它是有一个坑的:configmap和secret如果是以SubPath的形式挂载的,
~~~ 那么Pod是不会感知到configmap和secret的更新的。
~~~ 如果pod的变量来自于configmap和secret中定义的内容,
~~~ configmap和secret更新后,也不会更新pod的变量。
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
demo-nginx-57d4c4777f-s26sg 1/1 Running 0 12m
[root@k8s-master01 ~]# kubectl exec -ti demo-nginx-57d4c4777f-s26sg -- cat /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
三、解决configmap不被更新感知的问题
### --- 解决方案:
~~~ 解决configmap不能被更新感知的问题严重:可以把它挂载到其它的目录,
~~~ 把它做一个ln软连接的形式。它就可以感知到变化,并同步到文件夹中。
~~~ # 然后通过ln -s把这个文件链接到目标目录下,但是链接之前要把之前的文件给删除掉。
~~~ postStart:容器启动之前执行的命令
~~~ preStop:容器停止之前执行的命令
~~~ # 再创建一个configmap
[root@k8s-master01 ~]# kubectl edit deploy demo-nginx
volumeMounts:
- mountPath: /etc/nginx/nginx.conf
name: config-volume
subPath: etc/nginx/nginx.conf // 以上为原始参数
- mountPath: /mnt/ // 重写写入参数
name: config-volume-non-subpath
*****************省略部分内容*******************
volumes:
- configMap:
defaultMode: 420
items:
- key: nginx.conf
path: etc/nginx/nginx.conf
name: nginx-conf
name: config-volume // 以上为原始参数
- configMap: // 再创建一个configmap
defaultMode: 420
name: nginx-conf
name: config-volume-non-subpath
deployment.apps/demo-nginx edited // 输出内容
### --- 验证:使用SubPath和直接挂载更新是否被感知配置文件被更新了
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
demo-nginx-5d64cb8bf7-bmqbc 1/1 Running 0 78s
demo-nginx-5d64cb8bf7-h59hb 1/1 Running 0 2m16s
[root@k8s-master01 ~]# kubectl exec -ti demo-nginx-5d64cb8bf7-bmqbc -- cat /etc/nginx/nginx.conf
user nginx; // 这个是用了SubPath的,SubPath的形式是不能感知到configmap的更新的。
worker_processes 2; // 输出值是2
[root@k8s-master01 ~]# kubectl exec -ti demo-nginx-5d64cb8bf7-bmqbc -- cat /mnt/nginx.conf
user nginx; // 这个是没有使用SubPath
worker_processes 2; // mnt下的值也是2;说明文件内容是一致的,
四、更新configmap,配置更新参数
### --- 更新一下configmap文件内容
[root@k8s-master01 ~]# kubectl edit cm nginx-conf
apiVersion: v1
data:
nginx.conf: "\r\nuser nginx;\r\nworker_processes 1 // 把它的值更改为1
configmap/nginx-conf edited // 输出内容
### --- 查看容器配置文件的更新变化
[root@k8s-master01 ~]# kubectl exec -ti demo-nginx-5d64cb8bf7-bmqbc -- cat /etc/nginx/nginx.conf
user nginx;
worker_processes 2; // 没有更新;使用了SubPath的形式去挂载的,它是不能感知到configmap的更新的。所以没有更新成功。
[root@k8s-master01 ~]# kubectl exec -ti demo-nginx-5d64cb8bf7-bmqbc -- cat /mnt/nginx.conf
user nginx;
worker_processes 1; // 更新为1;查看直接挂载的这种形式,它的文件内容已经更新为1了,说明更新成功,
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了