系统整理K8S的配置管理实战-建议收藏系列( 二 )

验证:
[root@master01 yamls]# kubectl get poNAMEREADYSTATUSRESTARTSAGEdp-test-cm-7c5666c5c4-wnhtk1/1Running0111s[root@master01 yamls]# kubectl exec -ti dp-test-cm-7c5666c5c4-wnhtk -- sh# echo $AppNamenginx# echo $LevelPro1.2.2、envFrom一次性配置多个环境变量
注意点:如果key不存在,不会影响pod的运用,但是也不会创建这个环境变量
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: dp-test-cmname: dp-test-cmspec:replicas: 1selector:matchLabels:app: dp-test-cmtemplate:metadata:labels:app: dp-test-cmspec:containers:- image: nginxname: nginx# 和env同级,将redis-cm中的所有kv均作为环境变量注入到容器中envFrom:- configMapRef:name: redis-cmenv:- name: Levelvalue: Pro- name: AppNamevalueFrom:configMapKeyRef:name: cm-env-filekey: app.name验证:
[root@master01 yamls]# kubectl exec -ti dp-test-cm-6b7d8dc675-wf2vm -- sh# echo $ip10.10.10.1011.2.3、volumeMounts将基于文件创建的configMap以文件的形式挂在Pod的指定目录中
关键字:volume、volumeMounts
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: dp-test-cmname: dp-test-cmspec:replicas: 1selector:matchLabels:app: dp-test-cmtemplate:metadata:labels:app: dp-test-cmspec:volumes:- name: brm-configconfigMap:name: cm-from-filecontainers:- image: nginxname: nginxvolumeMounts:- name: brm-configmountPath: "/etc/foo"验证:可以看到它会将ConfigMap.data中的每一项,都作为一个单独的文件挂载进Pod中 。
[root@master01 yamls]# kubectl get cm cm-from-file -oyamlapiVersion: v1data:nginx.conf: |app.name=nginxlocation.prefix=/appredis.conf: |ip=10.10.10.101port=2379kind: ConfigMapmetadata:creationTimestamp: "2022-03-31T00:52:21Z"name: cm-from-filenamespace: defaultresourceVersion: "759788"uid: 5a41bdbe-66d0-45fa-8a5e-b6f6b005d671[root@master01 yamls]# kubectl exec -ti dp-test-cm-68d77c6c6-4jtqr -- sh# cd /etc/foo# lsnginx.confredis.conf# cat nginx.confapp.name=nginxlocation.prefix=/app1.2.4、自定义文件名称自定义挂载进Pod容器的文件名关键字:spec.spec.volumes.configMap.items
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: dp-test-cmname: dp-test-cmspec:replicas: 1selector:matchLabels:app: dp-test-cmtemplate:metadata:labels:app: dp-test-cmspec:volumes:- name: brm-configconfigMap:name: cm-from-fileitems:- key: redis.confpath: redis.conf.cuscontainers:- image: nginxname: nginxvolumeMounts:- name: brm-configmountPath: "/etc/foo"1.2.5、控制文件权限关键字:spec.template.spec.vulumes.configMap.defaultModespec.template.spec.vulumes.configMap.items.mode
用在控制挂载进Pod的文件的权限,---分别对应421(八进制)
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: dp-test-cmname: dp-test-cmspec:replicas: 1selector:matchLabels:app: dp-test-cmtemplate:metadata:labels:app: dp-test-cmspec:volumes:- name: brm-configconfigMap:name: cm-from-fileitems:- key: redis.confpath: redis.conf.cusmode: 0111defaultMode: 0666containers:- image: nginxname: nginxvolumeMounts:- name: brm-configmountPath: "/etc/foo"1.2.6、子目录-subPath关键字:subPath
subpath的作用是解决spec.template.spec.containers.volumeMounts.mountPath的挂载覆盖问题
意思就是说,如果mountPath指定的是一个目录,那么k8s会用我们期望挂载进该目录的文件覆盖掉该目录中已存在的文件 , 从而导致意外的结果 。
解决方式如下的subPath , 就是将cm 挂载成指定目录+指定文件,覆盖也是对指定目录中的指定文件进行覆盖,也就是下例中:将brm-config这个cm挂载进容器的/etc/foo/nginx.conf文件(覆盖也不会影响其他文件) 。
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: dp-test-cmname: dp-test-cmspec:replicas: 1selector:matchLabels:app: dp-test-cmtemplate:metadata:labels:app: dp-test-cmspec:volumes:- name: brm-configconfigMap:name: cm-from-fileitems:- key: redis.confpath: redis.conf.cusmode: 0111defaultMode: 0666containers:- image: nginxname: nginxvolumeMounts:- name: brm-configmountPath: "/etc/foo/nginx.conf"subPath: "nginx.conf"

这里可以做一个实验,比如在挂在之前先搞一个/etc/foo/1.txt,然后分别用subpath和不用subpath两种方式做挂载,对比/etc/foo/1.txt的是否被覆盖的差异~
1.2.7、热更新cm中的值被编辑修改后,Pod中对应的挂载文件的值也会保持同步 。
特殊情况:
env-fromvalue-from这种以环境变量的形式挂载进pod的cm,无法做到热更新
subPath也无法热更新
1.2.8、不可变的cm与Kind同级,设置参数immutable=true即可
1.3、限制条件