Kubernetes ConfigMap
存非敏感配置为键值对,挂载为环境或文件。
容器进阶
为什么
ConfigMap 分离配置和镜像 — 同镜像用不同配置在 dev/staging/prod 工作。挂载为环境变量或文件无需重建镜像。
Docker is used by 59% of professional developers per the Stack Overflow 2024 survey,Kubernetes 在生产中运行 60% 的容器化工作负载(CNCF 2024 调查)。容器编排通过声明式滚动发布将部署相关事故减少 35%。
何时使用
非敏感配置(日志级、功能开关)用 ConfigMap。敏感用 Secret。
如何做
1. 创建 — kubectl create configmap 或 YAML
2. 从文件 — --from-file=config.yaml
3. 环境 — envFrom 或 env.valueFrom
4. Volume — 挂载为 pod 中文件
5. 更新 — kubectl apply,pod 需重启
6. 不可变 — immutable: true 性能
7. 大小 — 每 ConfigMap 最大 1MB
示例
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata: { name: app-config }
data:
LOG_LEVEL: info
FEATURE_FLAGS: "auth,search"
config.yaml: |
database: { pool: 10, timeout: 5000 }
# deployment.yaml — 用作环境和 volume
spec:
containers:
- name: app
envFrom:
- configMapRef: { name: app-config }
volumeMounts:
- name: config
mountPath: /etc/config
volumes:
- name: config
configMap: { name: app-config }
常见问题
- ⚠配置未更新 — pod 不自动重载,需 rollout restart
- ⚠过大 — 1MB 限制,大配置文件用 volume
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓所有配置用 envFrom — 一行注入所有 ConfigMap 键为环境
- ✓配置更新后 rollout restart — kubectl rollout restart deployment/app
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求