对象定位
把 ConfigMap 以卷的形式挂进容器,每个键落成一个文件,适合放配置文件、脚本片段、证书之外的文本类配置。适用平台是 Kubernetes。与 env 注入相比,卷挂载有两个关键差别:内容会随 ConfigMap 更新自动同步(分钟级),以及挂载会遮蔽目标目录里镜像原有的内容。用 items 可以挑选键并重命名文件,用 subPath 可以只挂单个文件。
基本信息
| 适用平台 | Kubernetes,Pod 的 volumes.configMap |
|---|---|
| 文件权限 | 默认 0644,可用 defaultMode 或 items 的 mode 调整 |
| 更新行为 | 普通挂载会分钟级同步;subPath 挂载不会更新 |
| 覆盖行为 | mountPath 指向目录时会遮蔽该目录原有内容 |
典型使用场景
- 应用配置文件:把 nginx.conf、application.yml 之类的文本配置挂到预期路径
- 挑选并改名:只挂需要的键,把 LOG_LEVEL 落成 log-level.txt 供脚本读取
- 多容器共享配置:同一 ConfigMap 挂到多个容器,保证配置一致
- 灰度改配置:更新 ConfigMap 后观察应用重读行为,配合热加载生效
- 区分环境:不同命名空间挂各自的 ConfigMap,同一份清单跑多套环境
卷挂载示例
卷挂载示例
spec:
containers:
- name: app
image: registry.example.com/app:1.26.0
volumeMounts:
- name: config
mountPath: /etc/app/conf.d
readOnly: true
volumes:
- name: config
configMap:
name: app-config
items:
- key: app.properties
path: app.properties
- key: LOG_LEVEL
path: log-level.txt验证
验证
kubectl exec -it web-x -- ls -l /etc/app/conf.d # 挂载出的文件与权限
kubectl exec -it web-x -- cat /etc/app/conf.d/log-level.txt
kubectl get cm app-config -o jsonpath='{.data}' # 与容器内内容比对
kubectl exec -it web-x -- find /etc/app/conf.d -type l # 挂载点内的符号链接(Kubernetes 用软链切换版本)挂载方式对比
| 方式 | 更新是否传播 | 适用 | 注意 |
|---|---|---|---|
| 整目录挂载 | 分钟级传播 | 配置目录、多文件场景 | 遮蔽目标目录原有内容 |
| items 挑选键 | 分钟级传播 | 只要部分键、需要改名 | 未列出的键不会出现 |
| subPath 单文件 | 不传播 | 挂单个文件到特定路径 | 改配置需重建 Pod |
| defaultMode 调权限 | 随挂载生效 | 限制配置可读范围 | 数值用八进制写法 |
卷里的文件会随 ConfigMap 更新自动同步(分钟级),这是与 env 注入的关键区别;但应用自身要能重读文件,否则同步了也不会生效。
Kubernetes 通过符号链接切换挂载内容,容器内直接 cat 跟随链接读到的是最新版本,而进程若一直持有文件句柄则仍看到旧内容。