验证:
[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 $LevelPro
1.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.101
1.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=/app
1.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.defaultMode
和spec.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-from
和value-from
这种以环境变量的形式挂载进pod的cm,无法做到热更新subPath
也无法热更新1.2.8、不可变的cm与Kind同级,设置参数
immutable=true
即可1.3、限制条件
- cm收NameSpace限制,只有在同一个NameSpace中的Pod才能引用她
推荐阅读
- 1分钟完成在线测试部署便捷收集班级同学文件的web管理系统
- RHCE习题
- 红米note10怎么更新系统_系统更新教程
- 重新整理 .net core 实践篇 ———— linux上性能排查 [外篇]
- k8s 中的 ingress 使用细节
- 重新整理 .net core 实践篇 ———— linux上排查问题实用工具 [外篇]
- 第2-1-1章 FastDFS分布式文件服务背景及系统架构介绍
- 华为nova8SE可以升级鸿蒙系统吗_华为nova8SE能不能升级鸿蒙系统
- 基于 Docker 构建轻量级 CI 系统:Gitea 与 Woodpecker CI 集成
- BI系统打包Docker镜像及部署的技术难度和实现