|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

 

 

posted on   yanqi_vip  阅读(245)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示