1. ConfigMap 基础概念
1.1 ConfigMap 的定义与作用
ConfigMap 是 Kubernetes 中用于将非机密性配置数据与容器镜像解耦的 API 对象。它允许你将环境变量、命令行参数、配置文件等内容以键值对或文件形式注入到 Pod 中,从而实现应用配置的外部化与动态管理。
核心作用:将配置从应用代码中剥离,使同一镜像可以在不同环境(开发、测试、生产)中复用,无需重新构建镜像。
ConfigMap 的典型使用场景包括:
- 环境变量注入:将数据库连接地址、日志级别等以环境变量形式传递给容器。
- 配置文件挂载:将 nginx.conf、application.yml 等配置文件以 Volume 方式挂载到容器指定路径。
- 命令行参数:通过环境变量间接为容器启动命令提供参数。
- 多环境配置切换:同一套部署模板,通过不同 ConfigMap 实现环境差异化。
1.2 ConfigMap 与 Secret 的区别
ConfigMap 和 Secret 是 Kubernetes 中两个并行的配置管理对象,但它们在数据敏感性、存储方式和使用限制上存在本质差异。下表从多个维度进行对比:
| 对比维度 | ConfigMap | Secret |
|---|---|---|
| 数据性质 | 非机密配置(明文) | 机密数据(密码、、证书) |
| 存储编码 | 纯文本 / 明文 | Base64 编码(etcd 中可加密) |
| 大小限制 | 1 MiB(etcd 限制) | 1 MiB(etcd 限制) |
| 支持的数据类型 | 键值对、文件内容 | 键值对、Docker 凭证、TLS 证书、ServiceAccount |
| 访问控制 | RBAC 控制 | RBAC + 加密存储 + 最小权限原则 |
| 审计日志 | 常规审计 | 建议开启数据脱敏审计 |
| 热更新行为 | Volume 挂载支持自动更新 | Volume 挂载支持自动更新 |
| 典型用途 | 配置文件、环境变量、命令行参数 | 数据库密码、、JWT 密钥、TLS 证书 |
安全提醒:切勿将数据库密码、私钥等敏感信息存储在 ConfigMap 中。ConfigMap 的数据在 etcd 中以明文存储,任何具有 etcd 访问权限或集群管理员权限的用户均可读取。敏感数据必须使用 Secret,并配合 etcd 加密存储和 RBAC 细粒度控制。
1.3 ConfigMap 在云原生中的定位
在云原生架构中,ConfigMap 是不可变基础设施和声明式配置管理两大理念的关键支撑组件。它的定位可以从以下三个层面理解:
- 镜像与配置解耦:同一容器镜像通过绑定不同 ConfigMap,即可在不同环境(dev/staging/prod)中表现出不同行为,无需重新构建镜像。
- 配置外部化与版本化:配置从代码仓库中独立管理,支持版本回滚、变更审计和环境差异化管理。
- 动态配置更新:通过 Volume 挂载方式,ConfigMap 更新后 Pod 内文件自动同步(需应用支持文件变更监听),为蓝绿发布、灰度发布中的配置切换提供基础。
1.4 ConfigMap 的创建与基本使用
ConfigMap 可以通过多种方式创建,以下是最常用的两种方法:
方法一:使用 kubectl create configmap 命令
# 从字面量创建
kubectl create configmap app-config --from-literal=LOG_LEVEL=debug --from-literal=DB_HOST=mysql-svc
# 从文件创建
kubectl create configmap nginx-config --from-file=nginx.conf
# 从目录创建(目录下所有文件成为键值对)
kubectl create configmap app-config-dir --from-file=./configs/
# 从环境变量文件创建
kubectl create configmap env-config --from-env-file=.env.production
方法二:使用 YAML 声明式定义
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
LOG_LEVEL: "debug"
DB_HOST: "mysql-svc"
DB_PORT: "3306"
app.properties: |
app.name=myapp
app.version=1.0.0
app.feature.flag=true
最佳实践:推荐使用声明式 YAML 管理 ConfigMap,并将其纳入 Git 版本控制。配合 Kustomize 的
configMapGenerator 或 Helm 的模板化 values,可以实现环境级配置差异化,避免手动创建带来的配置漂移问题。