本文介绍: 4、将目录B内的文件b挂载到容器内指定的目录A,容器的目录A内容不会被覆盖,而且容器目录A还存在挂载来的文件b;2、使用subPath既可以将卷的子目录挂载到容器的指定目录,也可以将文件挂载到容器内指定的目录下的文件。1、subPath是在挂载的卷的子路径,而不是被挂载的容器目录的子路径(volumeMounts)。ConfigMap和Secret的更新方式是一样的 再此只做ConfigMap的更新。3、将目录B挂载到容器内指定的目录A,容器的目录A下的所有内容会被目录B覆盖。

目录

一、ConfigMap和Secret使用SubPath

二、ConfigMap和Secret的热更新


一、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进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注