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 生效。

笔记加载中…