ConfigMap有四种创建方式:命令行字面值、单文件、目录批量、YAML声明式;三种使用方式:环境变量(不热更新)、命令行参数(依赖环境变量)、卷挂载(约10秒热更新)。

ConfigMap 是 Kubernetes 里管理非敏感配置的核心方式,核心思路是把配置从镜像里抽出来,统一存、灵活用。它不加密、不限制访问权限,适合存数据库地址、日志等级、功能开关这类明文信息。
怎么创建 ConfigMap
有四种常用方式,按场景选:
-
命令行直接定义键值对:适合少量配置项,比如环境变量。
命令示例:kubectl create configmap app-config --from-literal=DB_HOST=mysql --from-literal=LOG_LEVEL=info -
从单个文件创建:适合已有配置文件(如
app.properties或nginx.conf)。
命令示例:kubectl create configmap nginx-cm --from-file=nginx.conf,键名默认为文件名,值为文件全部内容 -
从目录批量创建:目录下多个配置文件会自动转成多个键值对。
命令示例:kubectl create configmap my-cm --from-file=./config-dir/ -
用 YAML 文件声明式创建:适合纳入 Git 版本控制,便于复现和审计。
YAML 示例中data下每行是一个键,冒号后是字符串值;支持多行文本(用|),也支持数字(需加引号,如"8080")
怎么让 Pod 用上 ConfigMap
三种主流注入方式,效果和更新行为不同:
-
作为环境变量注入:用
env.valueFrom.configMapKeyRef引用单个 key,或用envFrom.configMapRef一次性导入所有 key。
注意:更新 ConfigMap 后,Pod 内环境变量不会自动刷新,必须重启容器才生效 -
作为命令行参数传入:在容器
args或command中通过$(VAR_NAME)引用环境变量(需先注入环境变量),本质还是依赖环境变量机制,同样不热更新 -
挂载为卷(推荐用于配置文件):将 ConfigMap 挂到容器内某个路径,比如
/etc/config,应用像读本地文件一样加载。
优势:ConfigMap 更新后约 10 秒内自动同步到挂载点(文件内容变更),只要应用支持热重载,就无需重启 Pod
怎么挂载更灵活
实际使用中常遇到几个细节问题,ConfigMap 都能应对:
-
自定义挂载文件名:默认用 ConfigMap 的 key 当文件名,但可通过
items和key/path映射,比如把 keynginx.conf挂成my-nginx.conf -
控制文件权限:用
defaultMode设置挂载后所有文件的默认权限(如0644),避免因权限不足导致应用读取失败 -
避免覆盖原有目录内容:如果挂载点已有文件,整个目录会被 ConfigMap 内容完全替换。可用
subPath只挂载某一个 key 到子路径,保留其他文件
要注意的边界和限制
ConfigMap 不是万能配置中心,用前得清楚它的边界:
- 单个 ConfigMap 总大小不能超过 1 MiB,大配置(如证书、大日志模板)不适合放这里,应走持久卷或外部配置中心
- 只适用于非敏感数据,密码、token、私钥等必须用
Secret,哪怕 ConfigMap 支持 base64 编码也不等于加密 - ConfigMap 是命名空间级资源,跨命名空间不可见,不同环境建议用不同命名空间隔离
- 挂载卷方式虽支持热更新,但最终是否生效还取决于应用本身——它得主动监听文件变化并 reload,否则新内容只是“躺在磁盘上”


















