Kubernetes中如何管理配置_ConfigMap使用说明
技术百科
P粉602998670
发布时间:2026-01-27
浏览: 次 ConfigMap 创建后 Pod 里没生效是因为它不会自动注入,必须在 Pod 的 envFrom、env 或 volumes 中显式引用;更新后也不会自动刷新,挂载为 volume 的文件内容约1分钟内同步但进程不重读,env 注入的值则完全静态,需滚动更新 Pod 或应用热加载。
ConfigMap 创建后为什么 Pod 里没生效?
ConfigMap 本身只是存储配置的键值对,不会自动注入到 Pod。必须在 Pod 的 spec.containers.envFrom、env 或 volumes 中显式引用,否则 Pod 启动时根本读不到。
常见错误是只创建了 ConfigMap,却忘了在 Pod 模板里加 envFrom 或挂载 volumeMounts。检查方法:进容器执行 env | grep KEY_NAME 或 ls /etc/config/ 看文件是否存在。
- 用
envFrom注入全部键值对:envFrom:
- configMapRef:
name: my-config - 用
env单独映射某个键:env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: my-config
key: db.host - 用
volumeMount挂载为文件(适合多行配置或非环境变量场景):volumes:
- name: config-volume
configMap:
name: my-config
volumeMounts:
- name: config-volume
mountPath: /etc/config
从文件或目录创建 ConfigMap 时路径和 key 名怎么对应?
用 kubectl create config 从文件创建时,key 默认是文件名;从目录创建时,key 是目录下每个文件的文件名(不含路径)。注意:文件名不能含 
. 开头(如 .env),否则会被忽略。
如果想自定义 key 名,用 --from-file=key1=path/to/file1 显式指定。比如 --from-file=app.conf=./conf/app.conf 会让 key 变成 app.conf,而不是原始文件名 app.conf —— 看似一样,但能绕过自动推导逻辑,避免意外。
- 从单个文件创建:
kubectl create configmap my-cm --from-file=config.json→ key 是config.json - 从目录创建:
kubectl create configmap my-cm --from-file=./configs/→ key 是db.yaml、log.ini等 - 重命名 key:
--from-file=database.yml=./prod/db.yaml→ key 是database.yml
ConfigMap 更新后 Pod 里的配置会不会自动刷新?
不会。ConfigMap 被挂载为 volume 时,文件内容会定期同步(默认 1 分钟内),但已有进程不会重新读取;通过 env 注入的值则完全静态,Pod 启动那一刻就固定了,后续 ConfigMap 怎么改都无效。
所以别指望“改完 ConfigMap 就立刻生效”。真正可靠的方案只有两个:滚动更新 Pod(触发重建),或应用自己实现配置热加载(比如监听 /etc/config 文件变化)。
- 挂载为 volume 的文件:可被应用轮询或 inotify 监听,但需代码支持
- 环境变量方式:必须重启容器才生效,CI/CD 流程中要触发
rollout restart deployment - 使用
kubectl patch或apply更新 ConfigMap 后,记得检查 Pod 的restartCount是否增加,确认是否真的重建了
ConfigMap 和 Secret 混用时要注意什么?
ConfigMap 和 Secret 结构几乎一样,但 Secret 会 Base64 编码且有更严格的权限控制。千万别把密码写进 ConfigMap——哪怕只是临时测试。Kubernetes 不会对 ConfigMap 做任何加密或访问限制,etcd 里明文可查。
另外,Secret 默认挂载权限是 0644,而 ConfigMap 是 0644(可被所有容器内用户读),如果你挂载到容器里又没做权限隔离,敏感信息等于裸奔。
- 密码、token、私钥等一律走
Secret,哪怕开发环境也别偷懒 - ConfigMap 适合放
log.level=debug、feature.flag=true这类无害配置 - 用
kubectl get cm my-cm -o yaml能直接看到明文内容,而secret需要加--decode才能看,这就是设计意图的差别
ConfigMap 看似简单,但关键点全在“怎么连上”和“怎么更新”这两个动作上;多数线上问题不是创建失败,而是引用漏了、挂载错了、或者误当 Secret 用了。
# ai
# 加载
# 如果你
# 用了
# 里加
# 已有
# 这就是
# 会不会
# 这两个
# app
# js
# json
# golang
# 环境变量
# 编码
# 为什么
# igs
# 键值对
# Token
# 错了
# 键值
# 开发环境
# database
# kubernetes
# etcd
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++中如何对数组进行排序_c++数组排序算法汇总
- Win11怎么设置开机密码_Windows11账户
- 如何使用Golang操作指针变量_Golang解引
- PythonWeb前后端整合项目教程_FastAP
- c++ std::future和std::prom
- Avalonia如何实现跨窗口通信 Avaloni
- 如何使用Golang实现微服务事件驱动_使用消息总
- 如何在JavaScript中动态拼接PHP的bas
- 如何在Golang中优化文件读写性能_使用缓冲和并
- C#如何在一个XML文件中查找并替换文本内容
- PythonPandas数据分析教程_数据清洗与处
- Windows10系统怎么查看设备管理器_Win1
- 如何使用Golang开发简单的聊天室消息存储_Go
- c# F# 的 MailboxProcessor
- Win11怎么关闭自动修复_跳过Win11开机自动
- Win11怎么关闭应用权限_Windows11相机
- Win11怎么设置默认浏览器Chrome_Wind
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Laravel 查询 JSON 列:高效筛选包含数
- Win11键盘快捷键大全_Windows 11常用
- PHP 中如何在函数内持久修改引用变量所指向的目标
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- c# 如何用c#实现一个支持优先级的任务队列
- php做exe支持多线程吗_并发处理实现方式【详解
- Win11怎么检查TPM2.0模块_Windows
- Windows如何使用注册表查找和删除项?(reg
- Win11怎么开启剪贴板历史记录_Windows1
- Python对象生命周期管理_创建销毁解析【教程】
- 如何在Golang中编写端到端测试_Golang
- Win11如何设置系统语言_Win11系统语言切换
- C#怎么使用委托和事件 C# delegate与e
- Python网络日志追踪_请求定位解析【教程】
- php485在php5.6下能用吗_php485旧
- Windows10系统怎么查看显卡驱动_Win10
- Python音视频处理高级项目教程_FFmpegP
- mac怎么查看wifi密码_MAC查看已连接WiF
- Win11怎么设置指纹解锁 Win11笔记本录入指
- VSC怎么快速定位PHP错误行_错误追踪设置法【方
- 如何在 ACF 中正确更新嵌套多层 Group 字
- Python包结构设计_大型项目组织解析【指导】
- Win11相机打不开提示错误怎么修_相机权限开启与
- c# Task.ConfigureAwait(tr
- php8.4匿名类怎么用_php8.4匿名类创建与
- Mac如何备份到iCloud_Mac桌面与文稿文件
- mac怎么打开终端_MAC终端Terminal使用
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- php下载安装后swoole扩展怎么安装_异步框架
- 如何在Golang中写入XML文件_生成符合规范的

QQ客服