目录
[1. 环境变量注入](#1. 环境变量注入)
[2. 挂载为文件](#2. 挂载为文件)
[3. 引用单个文件](#3. 引用单个文件)
[4. 作为命令行参数](#4. 作为命令行参数)
[ConfigMap 的意义](#ConfigMap 的意义)
基本概念
ConfigMap 是 Kubernetes 中用于存储非敏感配置数据(如环境变量、配置文件、命令行参数等)的 API 对象。它将配置与容器镜像解耦,实现应用的灵活配置管理。
核心特性
-
键值对存储
- 数据以
key: value
形式存储(支持纯文本、JSON、XML等)。 - 示例:
log_level: debug
或整个配置文件内容。
- 数据以
-
多数据来源
支持从多种方式创建:
- 文件 :
kubectl create configmap <name> --from-file=<file-path>
- 目录:自动合并目录内所有文件。
- 字面值 :
kubectl create configmap <name> --from-literal=key=value
- 文件 :
-
命名空间隔离
ConfigMap 属于特定命名空间(Namespace),仅同命名空间的 Pod 可引用。
-
动态更新支持
- 挂载为文件时:更新 ConfigMap 后,Kubernetes 自动同步到已挂载的 Pod(需应用支持重载)。
- 环境变量注入时 :不支持动态更新,需重启 Pod。
-
大小限制
单个 ConfigMap 最大 1 MiB(受 etcd 限制)。
核心原理
-
存储机制
- ConfigMap 数据存储在 Kubernetes 的 etcd 数据库中。
- 通过 API Server 提供创建/读取/更新接口。
-
数据注入到 Pod
- 环境变量:直接注入到容器环境。
- 文件挂载:将 ConfigMap 内容挂载为容器内的文件或目录。
- 命令行参数 :通过
$(KEY)
语法引用。
-
更新传播
- 文件挂载:kubelet 定期检查更新(默认同步周期约 1 分钟),将新内容写入容器文件系统。
- 环境变量:仅 Pod 启动时注入,运行时不可变。
核心使用方式
1. 环境变量注入
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config # ConfigMap 名称
key: log_level # 键名
2. 挂载为文件
volumes:
- name: config-volume
configMap:
name: app-config # 整个 ConfigMap 挂载为目录
volumeMounts:
- name: config-volume
mountPath: /etc/config # 容器内挂载路径
3. 引用单个文件
volumes:
- name: config-volume
configMap:
name: app-config
items:
- key: "nginx.conf" # ConfigMap 中的键
path: "nginx.conf" # 容器内文件名
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
4. 作为命令行参数
args:
- "--db-host=$(DB_HOST)"
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db_host
ConfigMap 的意义
-
解耦配置与代码
- 无需重构镜像即可修改配置(如切换开发/生产环境)。
- 提升镜像复用性和安全性(避免硬编码敏感路径)。
-
统一配置管理
- 集中管理多环境配置(通过不同 ConfigMap 区分)。
- 与 CI/CD 流水线集成,实现配置版本化。
-
动态配置更新
- 文件挂载方式支持不重启容器更新配置(适合 Nginx、微服务等场景)。
-
降低运维复杂度
- 替代传统方案(如手动修改容器内文件或重建镜像)。
最佳实践与注意事项
-
敏感数据用 Secret
ConfigMap 明文存储数据,敏感信息(密码、密钥)应使用 Secret。
-
设置默认值与可选引用
envFrom: - configMapRef: name: app-config optional: true # 即使 ConfigMap 不存在,Pod 也能启动
-
文件更新策略
- 应用需监听文件变化(如
inotify
)或定期重载配置。 - 避免符号链接:挂载 ConfigMap 会覆盖整个目录。
- 应用需监听文件变化(如
-
资源命名规范
使用明确名称(如
redis-config
),避免通用名引起冲突。
示例场景
场景:为 Nginx 配置动态更新
-
创建 ConfigMap:
kubectl create configmap nginx-conf --from-file=default.conf
-
Pod 挂载配置:
volumeMounts: - name: nginx-config mountPath: /etc/nginx/conf.d volumes: - name: nginx-config configMap: name: nginx-conf
-
修改配置后更新 ConfigMap:
kubectl create configmap nginx-conf --from-file=default.conf --dry-run=client -o yaml | kubectl replace -f -
Nginx 会自动加载新配置(需配置
nginx -s reload
)。
总结
ConfigMap 是 Kubernetes 配置管理的基石,通过分离配置与镜像:
- 提升应用可移植性和可维护性。
- 支持动态更新(文件挂载)。
- 规避明文存储敏感数据。
- ️ 注意环境变量需重启生效。