首页/云/Kubernetes 速查/ConfigMap 不可变(immutable)
配置与存储54 条

ConfigMap 不可变(immutable)

设置 immutable: true 后禁止任何修改:可减少 kubelet 监听开销并防误改;代价是变更必须删除重建。

Kubernetes 速查云更新于 2026-10-13

不可变配置对象

把 ConfigMap 标记为 immutable: true 之后它就不能再被修改:任何改动数据的请求都会被拒绝,只能删除后重建。好处是减少 kubelet 对这类对象的监听与同步开销,也能防止误改;代价是每次变更都要走删除重建流程。要注意这个字段只能从未设置改为不可变,不能改回来;虽然可以删除重建,但重建期间引用它的工作负载可能短暂找不到配置。

基本信息

适用对象各版本的 ConfigMap,Secret 也支持同名字段
关键字段immutable: true
变更方式只能删除后重建,名称可以保持不变
回退限制不能从不可变改回可变
潜在影响重建窗口内引用方可能创建失败

典型使用场景

  • 关键配置防误改:不希望有人顺手编辑线上配置
  • 减少监听负载:配置对象数量多时降低 kubelet 同步开销
  • 版本化配置:把配置内容与版本号绑定,变更即换对象
  • 合规要求:要求配置变更留痕、不可原地修改
  • 减少漂移:配合声明式发布,让配置差异只在清单层面体现

声明与变更流程

声明与变更流程
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: prod
data:
  version: "2026.10"
  log_level: info
immutable: true          # 标记后不能再修改 data

验证与重建

验证与重建
kubectl patch cm app-config -n prod -p '{"data":{"log_level":"debug"}}'
# 预期报错:字段不可变,修改被拒绝
kubectl get cm app-config -n prod -o jsonpath='{.immutable}'
kubectl delete cm app-config -n prod && kubectl apply -f app-config.yaml   # 重建
kubectl rollout restart deploy/web -n prod                                 # 引用方拿新配置

操作与结果

操作结果注意
修改数据被拒绝报错提示字段不可变
删除后重建允许名称不变即可被引用方继续使用
关闭不可变不允许只能删除后重新创建
引用方重启重建窗口内可能失败需要错开时间或先建新对象
不可变对象能减少 kubelet 的监听与同步负担,配置类对象数量多的集群收益比较明显,属于投入小、收益稳的改动。
变更流程要设计好顺序:先准备好新配置内容,再删除重建,随后触发引用方滚动,避免出现「配置不存在」的窗口期。

易错点

  • 建错之后想改回来:字段不可撤销,只能删除并重新创建对象
  • 删除重建时引用方恰好也在重启:Pod 因找不到配置卡住,需要错开时间窗口
  • 用环境变量注入的 Pod 不重建:配置换了但运行中的 Pod 仍是旧值,以为变更没生效
  • 删除重建不留下变更记录:配置内容与操作之间缺少对应关系,事后难以回溯

数据来源与参考

  • Kubernetes 官方文档 · ConfigMap(Immutable ConfigMaps)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌