ConfigMap #

一、ConfigMap概述 #

ConfigMap是Kubernetes中存储非敏感配置数据的资源,用于将配置与容器镜像解耦。

1.1 ConfigMap功能 #

text
ConfigMap功能
    │
    ├── 配置存储
    │   ├── 键值对
    │   └── 配置文件
    │
    ├── 配置注入
    │   ├── 环境变量
    │   ├── 命令行参数
    │   └── 配置文件挂载
    │
    └── 配置解耦
        └── 配置与镜像分离

1.2 ConfigMap特点 #

text
ConfigMap特点
    │
    ├── 非敏感数据
    │   └── 敏感数据使用Secret
    │
    ├── 命名空间级别
    │   └── 只在同一命名空间有效
    │
    ├── 大小限制
    │   └── 最大1MB
    │
    └── 热更新
        └── 挂载方式支持更新

二、创建ConfigMap #

2.1 命令行创建 #

bash
# 从字面值创建
kubectl create configmap my-config \
  --from-literal=key1=value1 \
  --from-literal=key2=value2

# 从文件创建
kubectl create configmap my-config --from-file=config.properties

# 从目录创建
kubectl create configmap my-config --from-file=./config-dir/

# 从env文件创建
kubectl create configmap my-config --from-env-file=config.env

2.2 YAML创建 #

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  key1: value1
  key2: value2
  config.yaml: |
    server:
      port: 8080
      host: localhost
    database:
      host: mysql-service
      port: 3306

2.3 查看ConfigMap #

bash
# 查看ConfigMap列表
kubectl get configmap
kubectl get cm

# 查看详情
kubectl describe configmap my-config

# 查看YAML
kubectl get configmap my-config -o yaml

三、使用ConfigMap #

3.1 环境变量注入 #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: env-pod
spec:
  containers:
  - name: app
    image: nginx
    env:
    - name: APP_KEY1
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1
    - name: APP_KEY2
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key2

3.2 注入所有环境变量 #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: envfrom-pod
spec:
  containers:
  - name: app
    image: nginx
    envFrom:
    - configMapRef:
        name: my-config

3.3 命令行参数 #

yaml
apiVersion: v1
kind: Pod
metadata:
  name: args-pod
spec:
  containers:
  - name: app
    image: busybox
    command: ["sh", "-c", "echo $APP_KEY1 && echo $APP_KEY2"]
    env:
    - name: APP_KEY1
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key1
    - name: APP_KEY2
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: key2

3.4 配置文件挂载 #

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

3.5 挂载特定键 #

yaml
volumes:
- name: config
  configMap:
    name: my-config
    items:
    - key: config.yaml
      path: app.yaml

3.6 子路径挂载 #

yaml
volumeMounts:
- name: config
  mountPath: /etc/nginx/nginx.conf
  subPath: nginx.conf

四、ConfigMap热更新 #

4.1 更新ConfigMap #

bash
# 编辑ConfigMap
kubectl edit configmap my-config

# 从文件更新
kubectl create configmap my-config --from-file=config.properties --dry-run=client -o yaml | kubectl apply -f -

4.2 自动更新机制 #

text
ConfigMap更新传播
    │
    ├── kubelet定期同步
    │   └── 默认10秒
    │
    ├── 更新挂载文件
    │   └── 自动更新容器内文件
    │
    └── 不重启容器
        └── 需要应用支持热加载

4.3 不可变ConfigMap #

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: immutable-config
immutable: true
data:
  key1: value1

五、实际应用示例 #

5.1 Nginx配置 #

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    events {
      worker_connections 1024;
    }
    
    http {
      include /etc/nginx/mime.types;
      default_type application/octet-stream;
      
      server {
        listen 80;
        server_name localhost;
        
        location / {
          root /usr/share/nginx/html;
          index index.html;
        }
      }
    }
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: config
      mountPath: /etc/nginx/nginx.conf
      subPath: nginx.conf
  volumes:
  - name: config
    configMap:
      name: nginx-config

5.2 应用配置 #

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  APP_DEBUG: "false"
  APP_PORT: "8080"
  DB_HOST: mysql-service
  DB_PORT: "3306"
  REDIS_HOST: redis-service
  REDIS_PORT: "6379"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app
        image: myapp:latest
        envFrom:
        - configMapRef:
            name: app-config
        ports:
        - containerPort: 8080

5.3 多环境配置 #

yaml
# 开发环境
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: development
data:
  APP_ENV: development
  DB_HOST: mysql-dev
---
# 生产环境
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: production
data:
  APP_ENV: production
  DB_HOST: mysql-prod

六、ConfigMap管理 #

6.1 查看ConfigMap #

bash
# 查看列表
kubectl get cm

# 查看详情
kubectl describe cm <configmap-name>

# 查看特定键
kubectl get cm <configmap-name> -o jsonpath='{.data.key1}'

6.2 更新ConfigMap #

bash
# 编辑更新
kubectl edit cm <configmap-name>

# 使用patch更新
kubectl patch cm <configmap-name> --patch '{"data":{"key1":"new-value"}}'

# 从文件更新
kubectl create cm <configmap-name> --from-file=config.yaml --dry-run=client -o yaml | kubectl apply -f -

6.3 删除ConfigMap #

bash
# 删除ConfigMap
kubectl delete cm <configmap-name>

# 从文件删除
kubectl delete -f configmap.yaml

七、故障排查 #

7.1 常见问题 #

bash
# 查看ConfigMap是否存在
kubectl get cm <configmap-name>

# 查看ConfigMap内容
kubectl describe cm <configmap-name>

# 进入容器检查环境变量
kubectl exec -it <pod-name> -- env | grep APP

# 进入容器检查挂载文件
kubectl exec -it <pod-name> -- cat /etc/config/key1

7.2 问题诊断 #

问题 原因 解决方案
环境变量未注入 ConfigMap不存在 检查ConfigMap名称
文件未挂载 挂载路径错误 检查volumeMounts
更新未生效 使用subPath subPath不支持热更新

八、最佳实践 #

8.1 命名规范 #

text
命名建议
    │
    ├── <app-name>-config
    │   └── 示例:nginx-config
    │
    └── <app-name>-<env>-config
        └── 示例:app-prod-config

8.2 配置分离 #

yaml
# 分离不同类型配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-env-config
data:
  APP_ENV: production
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-db-config
data:
  DB_HOST: mysql-service
  DB_PORT: "3306"

8.3 版本控制 #

bash
# 使用Git管理ConfigMap
kubectl create cm app-config --from-file=config.yaml --dry-run=client -o yaml > configmap.yaml
git add configmap.yaml
git commit -m "Update config"

九、总结 #

9.1 核心要点 #

要点 说明
用途 非敏感配置存储
注入方式 环境变量、Volume
热更新 Volume挂载支持
大小限制 最大1MB

9.2 下一步 #

掌握了ConfigMap后,让我们学习 Secret,了解敏感数据的管理方法。

最后更新:2026-03-28