【kubernetes】--ConfigMap
文章目录
- Kubernetes ConfigMap 详解
- 1. ConfigMap 基本概念
- 1.1 核心特性
- 1.2 与 Secret 的对比
- 2. ConfigMap 创建方式
- 2.1 从字面值创建
- 2.2 从文件创建
- 2.3 从环境文件创建
- 2.4 YAML 定义方式
- 3. ConfigMap 使用方式
- 3.1 作为环境变量
- 3.2 作为命令行参数
- 3.3 作为卷挂载
- 3.4 子路径挂载(不自动更新)
- 4. 热更新机制
- 4.1 自动更新特性
- 4.2 更新操作
- 4.3 更新延迟
- 5. 高级用法
- 5.1 不可变ConfigMap
- 5.2 大小限制与最佳实践
- 5.3 与Init容器配合
- 6. 监控与调试
- 6.1 常用命令
- 6.2 事件监控
- 7. 最佳实践
- 8. 实际应用示例
- 8.1 Nginx配置示例
- 8.2 多环境配置管理
- 案例
Kubernetes ConfigMap 详解
ConfigMap 是 Kubernetes 中用于存储非敏感(不加密)
配置数据的 API 对象,允许将配置与容器镜像分离,实现配置的灵活管理和动态更新。
1. ConfigMap 基本概念
1.1 核心特性
- 解耦配置:将应用配置与容器镜像分离
- 动态更新:支持不重启 Pod 更新配置(部分场景)
- 多种使用方式:环境变量、命令行参数、配置文件
- 非敏感数据:不适合存储密码、密钥等敏感信息
1.2 与 Secret 的对比
特性 | ConfigMap | Secret |
---|---|---|
数据类型 | 普通配置数据 | 敏感数据 |
存储编码 | 明文(可UTF-8文本) | Base64编码 |
典型用途 | 配置文件、命令行参数 | 密码、令牌、密钥 |
安全保护 | 无特殊保护 | 额外保护机制 |
大小限制 | 1MB(etcd限制) | 1MB |
2. ConfigMap 创建方式
2.1 从字面值创建
kubectl create configmap game-config \--from-literal=game.level=4 \--from-literal=game.health=5
2.2 从文件创建
# 从单个文件
kubectl create configmap nginx-config --from-file=nginx.conf# 从目录(所有文件)
kubectl create configmap config-dir --from-file=./configs/# 指定键名
kubectl create configmap special-config --from-file=config=app.properties
2.3 从环境文件创建
kubectl create configmap env-config --from-env-file=env.list
2.4 YAML 定义方式
apiVersion: v1
kind: ConfigMap
metadata:name: game-confignamespace: default
data:# 类属性键game.properties: |enemy.types=aliens,monstersplayer.maximum.level=10# 类文件键ui.properties: |color.good=purplecolor.bad=yellow
3. ConfigMap 使用方式
3.1 作为环境变量
单个环境变量:
env:
- name: LOG_LEVELvalueFrom:configMapKeyRef:name: game-configkey: log.level
全部环境变量:
envFrom:
- configMapRef:name: game-config
3.2 作为命令行参数
args:- "--loglevel"- "$(LOG_LEVEL)"
env:- name: LOG_LEVELvalueFrom:configMapKeyRef:name: game-configkey: log.level
3.3 作为卷挂载
完整挂载:
volumes:
- name: config-volumeconfigMap:name: game-config
volumeMounts:
- name: config-volumemountPath: /etc/config
选择性挂载:
volumes:
- name: config-volumeconfigMap:name: game-configitems:- key: game.propertiespath: game/game.properties
3.4 子路径挂载(不自动更新)
volumeMounts:
- name: config-volumemountPath: /etc/game/game.propertiessubPath: game.properties
4. 热更新机制
4.1 自动更新特性
- 卷挂载的ConfigMap:自动更新(kubelet定期检查,默认1分钟同步周期)
- 环境变量:不会自动更新,需要重启Pod
- 子路径挂载:不会自动更新
4.2 更新操作
# 更新ConfigMap
kubectl edit configmap game-config# 触发更新(对卷挂载有效)
kubectl patch configmap game-config -p '{"data":{"game.level":"5"}}'
4.3 更新延迟
- 更新传播到Pod通常需要1-2分钟(取决于kubelet配置)
- 可通过观察文件时间戳确认更新:
kubectl exec <pod-name> -- ls -la /etc/config/
5. 高级用法
5.1 不可变ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:name: immutable-config
immutable: true
data:some.key: some.value
优势:
- 防止意外更改
- 减少apiserver负载
- 安全提升(防止热更新攻击)
5.2 大小限制与最佳实践
- 单ConfigMap限制:1MB(etcd限制)
- 推荐实践:
- 按功能拆分ConfigMap
- 同类配置合并
- 避免超大配置文件
5.3 与Init容器配合
initContainers:
- name: init-configimage: busyboxcommand: ['sh', '-c', 'cp /tmp/config/* /shared-config/']volumeMounts:- name: config-volumemountPath: /tmp/config- name: shared-configmountPath: /shared-config
containers:
- name: appimage: myappvolumeMounts:- name: shared-configmountPath: /etc/app-config
6. 监控与调试
6.1 常用命令
# 查看ConfigMap
kubectl get configmaps
kubectl describe configmap <name># 查看挂载内容
kubectl exec <pod> -- ls /etc/config# 查看环境变量
kubectl exec <pod> -- env | grep CONFIG# 检查更新状态
kubectl get pods -w
6.2 事件监控
kubectl get events --field-selector involvedObject.kind=ConfigMap
7. 最佳实践
-
命名规范:
- 使用有意义的名称(如
{app}-{env}-config
) - 包含版本信息(v1, v2)
- 使用有意义的名称(如
-
组织结构:
configs/ ├── dev/ │ ├── app-config.yaml │ └── db-config.yaml └── prod/├── app-config.yaml└── db-config.yaml
-
版本控制:
- 将ConfigMap定义纳入版本控制
- 使用Kustomize或Helm管理不同环境配置
-
更新策略:
- 对关键配置使用RollingUpdate
- 测试环境先验证配置变更
-
安全考虑:
- 敏感数据必须使用Secret
- 限制ConfigMap访问权限(RBAC)
8. 实际应用示例
8.1 Nginx配置示例
# nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-conf
data:nginx.conf: |user nginx;worker_processes auto;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 index.htm;}}}# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:alpineports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: nginx-configconfigMap:name: nginx-conf
8.2 多环境配置管理
# 目录结构
config/
├── base/
│ ├── configmap.yaml
│ └── kustomization.yaml
├── dev/
│ ├── configmap-patch.yaml
│ └── kustomization.yaml
└── prod/├── configmap-patch.yaml└── kustomization.yaml# 使用Kustomize部署
kubectl apply -k config/dev/
案例
cm.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: busyboximage: busyboxcommand: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: redis-configrestartPolicy: Never``
myconfig.yaml
```yaml
apiVersion: v1
kind: ConfigMap
metadata:name: myconfignamespace: default
data:special.level: infospecial.type: hello
config-var.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: busyboximage: busyboxcommand: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]env:- name: LEVELvalueFrom:configMapKeyRef:name: myconfigkey: special.level- name: TYPEvalueFrom:configMapKeyRef:name: myconfigkey: special.typerestartPolicy: Never