目录
一、ConfigMap和Secret使用SubPath
1、subPath是在挂载的卷的子路径,而不是被挂载的容器目录的子路径(volumeMounts)。
2、使用subPath既可以将卷的子目录挂载到容器的指定目录,也可以将文件挂载到容器内指定的目录下的文件。
3、将目录B挂载到容器内指定的目录A,容器的目录A下的所有内容会被目录B覆盖。
4、将目录B内的文件b挂载到容器内指定的目录A,容器的目录A内容不会被覆盖,而且容器目录A还存在挂载来的文件b;挂载文件的前提是需要使用到subPath指令。
SubPath的使用方法:
1、同一个Pod中多个容器挂载同一卷时提供隔离使用volumeMounts.subPath
2、将configmap和secret作为文件挂载到容器中而不覆盖挂载目录下的文件
示例:
测试
1、先查看下pod中的nginx的配置文件
[root@k8s-master-1 SubPath]# kubectl exec -it sub-path-test-58b695f848-5kbw9 -- cat /etc/nginx/nginx.conf
2、看下nginx下目录,因为要测试,看看是否会被覆盖
[root@k8s-master-1 test]# kubectl exec -it label-test-7787b4694b-nw5m8 -- ls /etc/nginx/
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
3、把nginx配置文件导出来一份
[root@k8s-master-1 SubPath]# kubectl exec -it sub-path-test-58b695f848-5kbw9 -- cat /etc/nginx/nginx.conf > nginx.conf
4、以文件形式创建一个configMap
[root@k8s-master-1 SubPath]# kubectl create cm sub-path-test --from-file=nginx.conf
configmap/sub-path-test created
5、在线编辑deployment 添加volume 注意位置 是和containers是同级spec.template.spec.volume
containers:
volumes:
- name: config-volume
configMap: #是什么类型的 configMap、或者Secret
name: sub-path-test #对应的configMap名字
- - - - -挂载的话是spec.template.spec.containers.volumeMounts.subPath- - - - - -
command: ["sh","-c","sleep 3600"]
volumeMounts:
- name: config-volume
mountPath: /etc/nginx
保存退出
[root@k8s-master-1 SubPath]# kubectl edit deploy sub-path-test
deployment.apps/sub-path-test edited
6、在查看 POD 发现目录下只有config文件,其他文件已经被覆盖掉
[root@k8s-master-1 SubPath]# kubectl exec -it sub-path-test-dd9d997b5-cvk8m -- ls /etc/nginx/
nginx.conf
7、为了解决这个问题,需要使用SubPath的命令 来挂载文件,详细配置如下
volumeMounts:
- mountPath: /etc/nginx/nginx.conf
name: config-volume
subPath: etc/nginx/nginx.conf #以文件的形式挂载到目录
volumes:
- name: config-volume
configMap:
name: sub-path-test
items:
- key: nginx.conf
path: etc/nginx/nginx.conf
注意:
1、如果在卷目录下(path: etc/nginx/nginx.conf)没有nginx.conf文件的话,启动容器时候,会自动在卷内自动创建nginx.conf目录。注意是目录而不是文件
2、如果有这个文件,启动容器时候,就会挂载文件,并且不会被覆盖
[root@k8s-master-1 SubPath]# kubectl exec -it sub-path-test-6bd9b7bd86-5dd5r -- ls /etc/nginx/
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
二、ConfigMap和Secret的热更新
ConfigMap和Secret的更新方式是一样的 再此只做ConfigMap的更新
注:
ConfigMap和Secret,如果是以SubPath方式挂载的,那么Pod是不会感知到ConfigMap和Secret的更新的。
如果Pod的变量来自于ConfigMap和Secret的定义的内容,那么ConfigMap和Secret更新后,Pod也不回自动更新
解决方式:把更新的内容挂载到其他目录,然后ln -s 做一个软连接过去,但是在连接之前需要把这个文件删除,就会更新
使用如下参数:
postStart:容器启动之前要执行的命令
preStop:容器停止之前,执行的命令
1、先在线编辑下ConfigMap
[root@k8s-master-1 SubPath]# kubectl edit cm sub-path-test
将worker_processes 1; 改成worker_processes 2;
2、进入Pod查看是否被修改。是没有被修改的。更新周期是,更新时间+缓存时间
3、在创建一个不以SubPath 形式挂载的ConfigMap 把nginx.conf挂载到/mnt/测试
[root@k8s-master-1 SubPath]# kubectl edit deploy sub-path-test
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: sub-path-test
name: config-volume
- configMap:
defaultMode: 420
name: sub-path-test
name: config-volume-non-subpath
修改完成之后,进去容器查看,然后修改ConfigMap
[root@k8s-master-1 SubPath]# kubectl edit cm sub-path-test
configmap/sub-path-test edited
4、然后在查看容器的两个目录中的nginx.conf配置文件,发现SubPath挂载的没有更新,/mnt/的已经被更新
第二种方式
使用 --dry-run -oyaml
[root@k8s-master-1 SubPath]# kubectl create cm cm-name --from-file=nginx.conf --dry-run -oyaml
就是 前边命令是创建了一个ConfigMap,使用--dry-run 是把前边这个命令执行的结果打印出来,但是不把他发给kube-apiserver,就不会被执行,然后在使用replace更新
1、修改nginx.conf文件,把worker_processes 1; 改成worker_processes 3;
然后执行
[root@k8s-master-1 SubPath]# kubectl create cm cm-name --from-file=nginx.conf --dry-run=client -oyaml |kubectl replace -f-
2、进入容器查看 发现已经被更新掉,而SubPath挂载的未被更新
[root@k8s-master-1 SubPath]# kubectl exec -it sub-path-test-844b44ddb-hqlpv -- cat /mnt/nginx.conf
user nginx;
worker_processes 3;
原文地址:https://blog.csdn.net/weixin_42171272/article/details/135771692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_62343.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!