k8s 1.28 上用 ConfigMap 把 prompt 文件挂进容器,回滚到上一版之后应用读到的仍是新模板,kubectl describe 显示资源已经更新,容器里的文件修改时间还是昨天;挂载方式写的是 subPath,只挂单个文件。

一开始怀疑是「回滚只改了 ConfigMap,没有触发 Pod 重建」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。subPath 挂载不会随 ConfigMap 更新而同步。还有一种是应用启动时把文件读进内存,没有监听文件变更。

还有一种情况,镜像里也带了一份同路径的默认文件,把挂载覆盖了。

先在容器内看挂载文件的真实内容和时间

kubectl exec deploy/api -- sh -c 'ls -l /app/prompt && md5sum /app/prompt/v3.txt'

随后比对 ConfigMap 里的内容是否一致

kubectl get cm prompt-cm -o jsonpath='{.data.v3\.txt}' | md5sum

去掉 subPath 改成整目录挂载后滚动更新

kubectl rollout restart deploy/api; kubectl rollout status deploy/api --timeout=120s

末了用调试接口回显当前使用的模板版本

curl -s http://api:8080/debug/prompt | jq '.version, .md5'

恢复的判定其实很直接。容器内文件 md5 与 ConfigMap 一致,接口回显的版本号是回滚目标版本,新 Pod 的回答里不再出现新版措辞。

补一句。subPath 挂载是只读快照,改 ConfigMap 和重启应用不是一回事,回滚清单里要写清是否包含重建 Pod。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189