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