ConfigMap 是什么
ConfigMap 是 Kubernetes 里存放非敏感配置的 API 对象,以键值对形式独立于镜像存在:同一份镜像在开发、测试、生产跑不同参数,靠的就是挂不同的 ConfigMap。它通过环境变量或文件挂载注入容器,改配置不必重新构建镜像。密码、证书私钥这类敏感数据不属于它,应放 Secret。
基本信息
| 作用范围 | 命名空间级资源,Pod 只能引用同命名空间的 ConfigMap |
|---|---|
| 注入方式 | env/envFrom 注入环境变量;volumes 挂载为文件 |
| 体量上限 | 单个 ConfigMap 1MiB,超出需拆分 |
| 创建 | kubectl create configmap --from-file/--from-literal,或直接写 YAML |
| 校验 | kubectl describe cm <名称> 查看键与字节数 |
典型使用场景
- 同一镜像多环境部署:不同环境注入不同日志级别与超时参数
- 把 nginx、MySQL 等一整段配置文件挂进容器,避免为改一行重建镜像
- 功能开关、灰度比例这类开关集中管理,回滚只需切回旧对象
- 配置走独立发布流程,与镜像版本解耦,互不牵连
- 批量注入一组环境变量,省去在 Pod spec 里逐条写 env
最小示例
最小示例
apiVersion: v1
kind: ConfigMap
metadata:
name: app-conf
namespace: dev
data:
LOG_LEVEL: info # 单值键:可整体注入环境变量
app.yaml: | # 多行内容:挂载后成为同名文件
server:
port: 8080
read_timeout: 5s两种注入方式对比
| 注入方式 | 生效机制 | 改配置之后 |
|---|---|---|
| envFrom | 容器启动时读取一次写入环境变量 | 必须重建 Pod 才更新 |
| volume 挂载 | 以文件形式挂到指定目录 | 约 1 分钟级同步,应用需重读 |
| env 单键引用 | 只注入指定键 | 同 envFrom,需重建 Pod |
| subPath 挂单文件 | 只挂一个键为文件 | 不随 ConfigMap 更新,需重建 |
「配置改了应用没变」先问注入方式:env 注入的改动 Pod 完全不感知,要执行 kubectl rollout restart deployment/<名称>;挂载方式有分钟级延迟,且应用得自己重读配置文件才生效。
ConfigMap 内容以明文存放在 etcd,任何能读该命名空间 ConfigMap 的账号都能看到;数据库口令、访问密钥请放 Secret,必要时再叠加 KMS 加密。
挂载到目录会把容器内该目录原有内容整体覆盖;只想替换单个文件就用 subPath,但会失去自动更新能力,两者按需求取舍。