开始之前,我们先来回顾一下,configmap的常用的挂载场景。
场景一:单文件挂载到空目录
假如业务应用有一个配置文件,名为 application-1.conf,如果想将此配置挂载到pod的/etc/application/目录中。
name: "application"platform: "linux"purpose: "demo"company: "luffy"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
- 通过yaml文件直接创建```yamlapiVersion: v1kind: ConfigMapmetadata:name: application-confignamespace: defaultdata:application-1.conf: |name: "application"platform: "linux"purpose: "demo"company: "luffy"version: "v2.1.0"# 创建configmap$ kubectl create -f application-config.yaml
准备一个demo-deployment.yaml文件,挂载上述configmap到/etc/application/中
apiVersion: apps/v1kind: Deploymentmetadata:name: demonamespace: defaultspec:selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:volumes:- configMap:name: application-configname: configcontainers:- name: nginximage: nginx:alpineimagePullPolicy: IfNotPresentvolumeMounts:- mountPath: "/etc/application"name: config
创建并查看:
$ kubectl create -f demo-deployment.yaml
修改configmap文件的内容,观察pod中是否自动感知变化:
$ kubectl edit cm application-config
整个configmap文件直接挂载到pod中,若configmap变化,pod会自动感知并拉取到pod内部。
但是pod内的进程不会自动重启,所以很多服务会实现一个内部的reload接口,用来加载最新的配置文件到进程中。
场景二:多文件挂载
假如有多个配置文件,都需要挂载到pod内部,且都在一个目录中
$ cat application-1.confname: "application-1"platform: "linux"purpose: "demo"company: "luffy"version: "v2.1.0"$ cat application-2.confname: "application-2"platform: "linux"purpose: "demo"company: "luffy"version: "v2.1.0"
同样可以使用两种方式创建:
$ kubectl delete cm application-config$ kubectl create cm application-config --from-file=application-1.conf --from-file=application-2.conf$ kubectl get cm application-config -oyaml
观察Pod已经自动获取到最新的变化
$ kubectl exec demo-55c649865b-gpkgk ls /etc/application/application-1.confapplication-2.conf
此时,是挂载到pod内的空目录中/etc/application,假如想挂载到pod已存在的目录中,比如:
$ kubectl exec demo-55c649865b-gpkgk ls /etc/profile.dcolor_promptlocale
更改deployment的挂载目录:
apiVersion: apps/v1kind: Deploymentmetadata:name: demonamespace: defaultspec:selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:volumes:- configMap:name: application-configname: configcontainers:- name: nginximage: nginx:alpineimagePullPolicy: IfNotPresentvolumeMounts:- mountPath: "/etc/profile.d"name: config
重建pod
$ kubectl apply -f demo-deployment.yaml# 查看pod内的/etc/profile.d目录,发现已有文件被覆盖$ kubectl exec demo-77d685b9f7-68qz7 ls /etc/profile.dapplication-1.confapplication-2.conf
场景三 挂载子路径
实现多个配置文件,可以挂载到pod内的不同的目录中。比如:
- application-1.conf挂载到/etc/application/
- application-2.conf挂载到/etc/profile.d
configmap保持不变,修改deployment文件:
apiVersion: apps/v1kind: Deploymentmetadata:name: demonamespace: defaultspec:selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:volumes:- name: configconfigMap:name: application-configitems:- key: application-1.confpath: application1- key: application-2.confpath: application2containers:- name: nginximage: nginx:alpineimagePullPolicy: IfNotPresentvolumeMounts:- mountPath: "/etc/application/application-1.conf"name: configsubPath: application1- mountPath: "/etc/profile.d/application-2.conf"name: configsubPath: application2
测试挂载:
$ kubectl apply -f demo-deployment.yaml$ kubectl exec demo-78489c754-shjhz ls /etc/applicationapplication-1.conf$ kubectl exec demo-78489c754-shjhz ls /etc/profile.d/application-2.confcolor_promptlocale
使用subPath挂载到Pod内部的文件,不会自动感知原有ConfigMap的变更
