ConfigMap 配置管理
应用配置(环境、开关、连接串)经常变化,改配置就重打镜像太笨重。ConfigMap 把配置从镜像里抽出来,以键值对形式保存,Pod 启动时挂载或注入即可,实现「配置与代码分离」,改配置无需重新发布镜像。
创建 ConfigMap
kubectl create configmap 支持从字面量、文件、目录创建:
kubectl create configmap app-cfg --from-literal=env=prod --from-literal=debug=false
kubectl create configmap app-file --from-file=app.conf # 一个文件一个键
kubectl create configmap app-dir --from-file=./conf/ # 目录下每个文件一个键
kubectl get configmap app-cfg -o yaml
也可以用 yaml 直接声明,data 里的每行都是一个键值:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-cfg
data:
env: prod
debug: "false"
app.conf: | # | 保留多行原文
log.level=INFO
timeout=30
挂载为文件
ConfigMap 可以整个目录挂载,或用 subPath 只替换单个文件:
apiVersion: v1
kind: Pod
metadata:
name: cm-demo
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: cfg
mountPath: /etc/app # 整目录挂载
- name: cfg
mountPath: /etc/app.conf # 只挂这一个文件
subPath: app.conf
volumes:
- name: cfg
configMap:
name: app-cfg
注意:整目录挂载到已有内容的目录时,会覆盖(隐藏)该目录原有文件,只保留 ConfigMap 里的键;只想替换某个文件必须用 subPath。
挂载为环境变量
用 envFrom 把整份 ConfigMap 变成环境变量,或 env 里 valueFrom 取单个键:
spec:
containers:
- name: app
image: myapp:1.0
envFrom:
- configMapRef:
name: app-cfg
更新与生效
ConfigMap 更新后,挂载文件会由 kubelet 周期性同步到 Pod 内,但运行中的进程不一定自动重读文件,常规做法是滚动重启:
kubectl create configmap app-cfg --from-literal=env=staging --from-literal=debug=true -o yaml --dry-run=client | kubectl apply -f -
kubectl rollout restart deployment/myapp # 让所有 Pod 重新加载配置
环境变量方式注入后更不会热更新,只能重建 Pod。另有两类注意点:
- 大型配置(接近 1MB 级别)不适合放 ConfigMap,应改用对象存储或独立卷。
- 只在启动读取、绝不改动的配置可设 immutable: true 声明为不可变,防止误改并减轻 API Server 负担。
小结:ConfigMap 以键值对承载配置,--from-literal/--from-file 快速创建,目录挂载或 subPath 变文件、envFrom 变环境变量;整目录挂载会覆盖原有文件,改配置后配合 rollout restart 让 Pod 生效。