结论:分两种挂载方式:以 volume 挂载的 ConfigMap 会自动更新(kubelet 定期同步,延迟可达一分钟级,且原子切换——通过符号链接整体替换);以 env 注入的环境变量永不更新(env 在进程启动时固定),必须重启 Pod。热更新需要应用配合或借助工具。

展开:volume 自动更新的机制:kubelet 在 Pod 目录维护 ..data 符号链接指向新版本目录,切换是原子的,应用读到的是完整新内容或完整旧内容;subPath 挂载的单文件例外——不走符号链接,永不更新,这是高频坑。实现热更新的三条路径:1)应用自watch 配置文件变化(fsnotify/Viper WatchConfig)重新加载——最优雅,但要求配置可安全热更(连接池类配置热更要想清楚存量连接怎么办);2)reloader 类控制器(stakater/Reloader)watch ConfigMap/Secret 变化后自动滚动重启 Deployment——通用但本质是重启;3)把配置中心外置(Nacos/Apollo),K8s 只负责启动参数。配套实践:ConfigMap 加内容 hash 到名字(kustomize 的 configMapGenerator 自动做),内容变 → 名字变 → 触发滚动更新,GitOps 场景的标准做法。易错点:Secret 与 ConfigMap 行为一致;更新延迟期间新旧 Pod 配置不一致(滚动中),强一致要求的配置应走重启。

volumes:
- name: conf
  configMap: { name: app-conf }   # 自动更新
# 避免:volumeMounts 里 subPath: app.yaml(永不更新)

追问方向:immutable ConfigMap 的收益(kubelet 不再 watch,减轻 API 压力)、配置变更与版本回滚的一致性设计。