全部场景Scene 03

配置未生效改 ConfigMap 与 env 惰性

ConfigMap 已显示新值,容器里的 APP_MODE 仍旧。你将对比 get cm 与 exec 输出,确认 env 的启动时快照语义,再通过 rollout restart 让新配置进入 Pod。

中阶阶段 · 8 min · 5 步 · apply · get cm · exec · rollout restart

演练前检查

环境
本地实验集群;仓库根目录可访问 examples/config/;允许重建 web-config Pod。
初始故障
ConfigMap 对象将被改为 debug,已有容器仍保留启动时读到的旧 APP_MODE。
成功标准
能复现 get cm 新、exec 旧,并用 rollout restart 使新配置进入 Pod;能区分 restart 与 undo
清理
kubectl delete -f examples/config/

场景判断

ConfigMap / Secret 是「集群里的配置对象」,不是运行中进程的热更新总线。通过 envFrom / valueFrom 注入的变量,在容器 create 时由 kubelet 写入进程环境;之后你再 edit ConfigMap,API 对象变了,但已存在的容器不会自动 re-exec。volume 挂载的文件可能被 kubelet 异步刷新(仍有延迟与应用是否重读的问题),而 env 路径几乎总是「不重启就不生效」。把这条因果链记死,能省掉大量「我 apply 了为什么没变」的值班时间。

真实案例骨架:活动前把 APP_MODE 从 prod 改成 debug,get cm 显示新值,客服页面却仍是旧文案——因为 Deployment 的 Pod 还在用启动时的环境。最终 rollout restart(或改 template annotation 触发滚动)后,新 Pod 才 printenv 出新模式。Secret 同理,且更危险:你以为轮换了 token,旧 Pod 仍持有旧 token。

复现步骤

本机勾选备忘(localStorage),不代表你已在集群里跑过,也不连接任何 API。只是帮你对照步骤,别当成「学会了」的勋章。

— / 5本机勾选

  1. 01
  2. 02
  3. 03
  4. 04
  5. 05

关键配置

SHELLbash
# 基线
kubectl apply -f examples/config/
kubectl get cm app-config -o yaml | grep APP_MODE
kubectl exec deploy/web-config -- printenv | grep APP_

# 改对象 ≠ 改运行中 env
kubectl patch cm app-config --type merge -p '{"data":{"APP_MODE":"debug"}}'
kubectl get cm app-config -o yaml | grep APP_MODE
kubectl exec deploy/web-config -- printenv | grep APP_MODE   # 仍旧值

# 让新配置进入新 Pod
kubectl rollout restart deploy/web-config
kubectl rollout status deploy/web-config
kubectl exec deploy/web-config -- printenv | grep APP_MODE   # debug

kubectl delete -f examples/config/

get 看见新值只证明 API 对象更新了——进程眼里的世界,仍是启动那一刻的快照。

验收:你能向同事口述「get cm 新、exec 旧」的判断树,并独立完成 patch → 对照 → restart → 再对照。中阶后续发布回滚会继续问你:现在要恢复的是配置,还是 revision?

现场记录

先写自己的证据,再看参考答案。输入只留在当前页面,本站不会读取或验证你的集群。

配置未生效:改 ConfigMap 与 env 惰性

Evidence Receipt · 执行凭证

只填写你实际运行过的环境;stdout / Events 请脱敏后写入下方证据句。

这是你的手动确认,不代表本站已检测命令执行结果。

关联命令

跳转图鉴并展开对应条目(可复制示例)。

对应路径课节

Kubernetes 图鉴 · 场景剧本 · config-stale