43·配置管理进阶

使用 ConfigMap

kubernetesconfigmapconfiguration

使用 ConfigMap

学习目标

  1. 掌握在 Pod 中使用 ConfigMap 的方法
  2. 理解环境变量注入和卷挂载的区别
  3. 掌握配置热更新的实现

核心概念

使用方式概览

┌─────────────────────────────────────┐
│           Pod                       │
│  ┌─────────────────────────────┐   │
│  │  Container                   │   │
│  │  - 环境变量注入              │   │
│  │  - 卷挂载为文件              │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
           ↑ 读取配置
┌─────────────────────────────────────┐
│         ConfigMap                   │
└─────────────────────────────────────┘

方式 1:环境变量注入

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app:1.0
    env:
    # 单个环境变量
    - name: DATABASE_HOST
      valueFrom:
        configMapKeyRef:
          name: db-config
          key: DATABASE_HOST
    # 所有环境变量
    envFrom:
    - configMapRef:
        name: app-config

方式 2:卷挂载

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: my-app:1.0
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: app-config

环境变量 vs 卷挂载

特性环境变量卷挂载
更新方式需要重启 Pod自动更新
适用场景简单配置项配置文件
数据格式键值对文件内容
访问方式os.environ读取文件

环境变量引用

env:
# 方式 1:直接引用整个 ConfigMap
- name: ALL_CONFIG
  valueFrom:
    configMapKeyRef:
      name: my-config
      key: special.key

# 方式 2:引用单个键
- name: DATABASE_HOST
  valueFrom:
    configMapKeyRef:
      name: db-config
      key: DB_HOST
      optional: true  # 可选,ConfigMap 不存在时不报错

卷挂载选项

volumes:
- name: config-volume
  configMap:
    name: app-config
    # 可选配置
    optional: true  # ConfigMap 不存在时不报错
    items:
    - key: config.properties
      path: app.conf  # 挂载后的文件名
    defaultMode: 0644  # 文件权限

配置热更新

卷挂载的 ConfigMap 支持热更新:

1. 更新 ConfigMap
   kubectl apply -f updated-config.yaml

2. 等待更新生效(通常 60-90 秒)
   - kubelet 定期检查 ConfigMap 变化
   - 更新挂载的文件

3. 应用读取新配置
   - 应用需要支持配置重载
   - 或者使用文件监控机制

部分键挂载

volumes:
- name: config-volume
  configMap:
    name: app-config
    items:
    - key: database.properties
      path: database.conf
    - key: cache.properties
      path: cache.conf

实践练习

练习 1:环境变量注入

创建 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
data:
  DB_HOST: mysql.example.com
  DB_PORT: "3306"
  DB_NAME: mydb

创建 Pod 使用 ConfigMap:

apiVersion: v1
kind: Pod
metadata:
  name: app-with-config
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "echo DB=$DATABASE_HOST:$DATABASE_PORT/$DB_NAME && sleep 3600"]
    envFrom:
    - configMapRef:
        name: db-config

验证:

kubectl logs app-with-config
# 输出:DB=mysql.example.com:3306/mydb

练习 2:卷挂载

创建 ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    server {
        listen 80;
        server_name localhost;
        location / {
            return 200 "Hello from Nginx!";
        }
    }

创建 Pod 使用 ConfigMap:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-with-config
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: nginx-config
      mountPath: /etc/nginx/conf.d
  volumes:
  - name: nginx-config
    configMap:
      name: nginx-config

验证:

kubectl exec nginx-with-config -- cat /etc/nginx/conf.d/nginx.conf

练习 3:配置热更新

  1. 创建初始 ConfigMap
  2. 创建 Pod 使用卷挂载
  3. 更新 ConfigMap
  4. 观察 Pod 中的文件变化
# 创建初始配置
kubectl apply -f config.yaml

# 创建 Pod
kubectl apply -f pod.yaml

# 查看配置
kubectl exec my-app -- cat /etc/config/app.conf

# 更新配置
kubectl edit configmap my-config

# 等待 60-90 秒后再次查看
kubectl exec my-app -- cat /etc/config/app.conf

小结

要点说明
环境变量注入简单配置,需要重启生效
卷挂载配置文件,支持热更新
envFrom注入整个 ConfigMap
configMapKeyRef引用单个键
热更新卷挂载自动更新,需要应用支持

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「Secret 简介」 以巩固所学知识。