开始之前,我们先来回顾一下,configmap的常用的挂载场景。

场景一:单文件挂载到空目录

假如业务应用有一个配置文件,名为 application-1.conf,如果想将此配置挂载到pod的/etc/application/目录中。

  1. name: "application"
  2. platform: "linux"
  3. purpose: "demo"
  4. company: "luffy"
  5. version: "v2.1.0"

该配置文件在k8s中可以通过configmap来管理,通常我们有如下两种方式来管理配置文件:

  • 通过kubectl命令行来生成configmap ```bash

    通过文件直接创建

    $ kubectl -n default create configmap application-config —from-file=application-1.conf

会生成配置文件,查看内容,configmap的key为文件名字

$ kubectl -n default get cm application-config -oyaml

  1. - 通过yaml文件直接创建
  2. ```yaml
  3. apiVersion: v1
  4. kind: ConfigMap
  5. metadata:
  6. name: application-config
  7. namespace: default
  8. data:
  9. application-1.conf: |
  10. name: "application"
  11. platform: "linux"
  12. purpose: "demo"
  13. company: "luffy"
  14. version: "v2.1.0"
  15. # 创建configmap
  16. $ kubectl create -f application-config.yaml

准备一个demo-deployment.yaml文件,挂载上述configmap到/etc/application/中

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: demo
  5. namespace: default
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: demo
  10. template:
  11. metadata:
  12. labels:
  13. app: demo
  14. spec:
  15. volumes:
  16. - configMap:
  17. name: application-config
  18. name: config
  19. containers:
  20. - name: nginx
  21. image: nginx:alpine
  22. imagePullPolicy: IfNotPresent
  23. volumeMounts:
  24. - mountPath: "/etc/application"
  25. name: config

创建并查看:

  1. $ kubectl create -f demo-deployment.yaml

修改configmap文件的内容,观察pod中是否自动感知变化:

  1. $ kubectl edit cm application-config

整个configmap文件直接挂载到pod中,若configmap变化,pod会自动感知并拉取到pod内部。
但是pod内的进程不会自动重启,所以很多服务会实现一个内部的reload接口,用来加载最新的配置文件到进程中。

场景二:多文件挂载

假如有多个配置文件,都需要挂载到pod内部,且都在一个目录中

  1. $ cat application-1.conf
  2. name: "application-1"
  3. platform: "linux"
  4. purpose: "demo"
  5. company: "luffy"
  6. version: "v2.1.0"
  7. $ cat application-2.conf
  8. name: "application-2"
  9. platform: "linux"
  10. purpose: "demo"
  11. company: "luffy"
  12. version: "v2.1.0"

同样可以使用两种方式创建:

  1. $ kubectl delete cm application-config
  2. $ kubectl create cm application-config --from-file=application-1.conf --from-file=application-2.conf
  3. $ kubectl get cm application-config -oyaml

观察Pod已经自动获取到最新的变化

  1. $ kubectl exec demo-55c649865b-gpkgk ls /etc/application/
  2. application-1.conf
  3. application-2.conf

此时,是挂载到pod内的空目录中/etc/application,假如想挂载到pod已存在的目录中,比如:

  1. $ kubectl exec demo-55c649865b-gpkgk ls /etc/profile.d
  2. color_prompt
  3. locale

更改deployment的挂载目录:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: demo
  5. namespace: default
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: demo
  10. template:
  11. metadata:
  12. labels:
  13. app: demo
  14. spec:
  15. volumes:
  16. - configMap:
  17. name: application-config
  18. name: config
  19. containers:
  20. - name: nginx
  21. image: nginx:alpine
  22. imagePullPolicy: IfNotPresent
  23. volumeMounts:
  24. - mountPath: "/etc/profile.d"
  25. name: config

重建pod

  1. $ kubectl apply -f demo-deployment.yaml
  2. # 查看pod内的/etc/profile.d目录,发现已有文件被覆盖
  3. $ kubectl exec demo-77d685b9f7-68qz7 ls /etc/profile.d
  4. application-1.conf
  5. application-2.conf

场景三 挂载子路径

实现多个配置文件,可以挂载到pod内的不同的目录中。比如:

  • application-1.conf挂载到/etc/application/
  • application-2.conf挂载到/etc/profile.d

configmap保持不变,修改deployment文件:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: demo
  5. namespace: default
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: demo
  10. template:
  11. metadata:
  12. labels:
  13. app: demo
  14. spec:
  15. volumes:
  16. - name: config
  17. configMap:
  18. name: application-config
  19. items:
  20. - key: application-1.conf
  21. path: application1
  22. - key: application-2.conf
  23. path: application2
  24. containers:
  25. - name: nginx
  26. image: nginx:alpine
  27. imagePullPolicy: IfNotPresent
  28. volumeMounts:
  29. - mountPath: "/etc/application/application-1.conf"
  30. name: config
  31. subPath: application1
  32. - mountPath: "/etc/profile.d/application-2.conf"
  33. name: config
  34. subPath: application2

测试挂载:

  1. $ kubectl apply -f demo-deployment.yaml
  2. $ kubectl exec demo-78489c754-shjhz ls /etc/application
  3. application-1.conf
  4. $ kubectl exec demo-78489c754-shjhz ls /etc/profile.d/
  5. application-2.conf
  6. color_prompt
  7. locale

使用subPath挂载到Pod内部的文件,不会自动感知原有ConfigMap的变更