K8s——配置管理(1)
目录
基本概念
核心特性
核心原理
核心使用方式
1. 环境变量注入
2. 挂载为文件
3. 引用单个文件
4. 作为命令行参数
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_LEVELvalueFrom:configMapKeyRef:name: app-config # ConfigMap 名称key: log_level # 键名
2. 挂载为文件
volumes:- name: config-volumeconfigMap:name: app-config # 整个 ConfigMap 挂载为目录 volumeMounts:- name: config-volumemountPath: /etc/config # 容器内挂载路径
3. 引用单个文件
volumes:- name: config-volumeconfigMap:name: app-configitems:- key: "nginx.conf" # ConfigMap 中的键path: "nginx.conf" # 容器内文件名 volumeMounts:- name: config-volumemountPath: /etc/nginx/conf.d
4. 作为命令行参数
args:- "--db-host=$(DB_HOST)"
env:- name: DB_HOSTvalueFrom:configMapKeyRef:name: app-configkey: db_host
ConfigMap 的意义
-
解耦配置与代码
- 无需重构镜像即可修改配置(如切换开发/生产环境)。
- 提升镜像复用性和安全性(避免硬编码敏感路径)。
-
统一配置管理
- 集中管理多环境配置(通过不同 ConfigMap 区分)。
- 与 CI/CD 流水线集成,实现配置版本化。
-
动态配置更新
- 文件挂载方式支持不重启容器更新配置(适合 Nginx、微服务等场景)。
-
降低运维复杂度
- 替代传统方案(如手动修改容器内文件或重建镜像)。
最佳实践与注意事项
-
敏感数据用 Secret
ConfigMap 明文存储数据,敏感信息(密码、密钥)应使用 Secret。 -
设置默认值与可选引用
envFrom:- configMapRef:name: app-configoptional: true # 即使 ConfigMap 不存在,Pod 也能启动
-
文件更新策略
- 应用需监听文件变化(如
inotify
)或定期重载配置。 - 避免符号链接:挂载 ConfigMap 会覆盖整个目录。
- 应用需监听文件变化(如
-
资源命名规范
使用明确名称(如redis-config
),避免通用名引起冲突。
示例场景
场景:为 Nginx 配置动态更新
- 创建 ConfigMap:
kubectl create configmap nginx-conf --from-file=default.conf
- Pod 挂载配置:
volumeMounts:- name: nginx-configmountPath: /etc/nginx/conf.d volumes:- name: nginx-configconfigMap:name: nginx-conf
- 修改配置后更新 ConfigMap:
Nginx 会自动加载新配置(需配置kubectl create configmap nginx-conf --from-file=default.conf --dry-run=client -o yaml | kubectl replace -f -
nginx -s reload
)。
总结
ConfigMap 是 Kubernetes 配置管理的基石,通过分离配置与镜像:
- 提升应用可移植性和可维护性。
- 支持动态更新(文件挂载)。
- 规避明文存储敏感数据。
- ️ 注意环境变量需重启生效。