Learn
Kubernetes/19-configmap-secret-advanced

ConfigMap 与 Secret 进阶

第 8 章介绍了配置与密钥的基础用法。实际生产中还有几个关键点直接影响稳定性与安全性,本章深入讲解。

1. 热更新的真相

以文件方式挂载的 ConfigMap/Secret,内容更新后(再次 apply)kubelet 会在约 1 分钟内把新内容同步到容器内的文件。但有三个重要限制:

  • 只有挂载为整个目录/文件(非 subPath)才能热更新。
  • 更新是最终一致的,存在延迟且不同步所有容器。
  • 应用必须自己重新读取文件,k8s 不会重启进程。
# 修改 ConfigMap 并重新应用,挂载的文件会在延迟后刷新
kubectl edit configmap app-config
kubectl rollout restart deployment app   # 想立即生效可手动滚动重启
💡需要真正的热重载?用配置中心

对延迟敏感或要求强一致的应用,建议用 Nacos、Consul 或 Apollo 等配置中心拉取配置,而不是依赖 k8s 挂载文件的异步刷新。

2. subPath 会阻断热更新

使用 subPath 把单个文件挂进已有目录时,该文件是「绑定挂载」,不会随 ConfigMap 更新而变化:

volumeMounts:
  - name: cfg
    mountPath: /etc/app/app.yaml
    subPath: app.yaml     # 用了 subPath,更新 ConfigMap 后这里不刷新

3. Immutable 不可变配置

Kubernetes 1.21 起可将 ConfigMap/Secret 标记为不可变,避免误改线上配置、并减轻 API 与 etcd 压力:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
immutable: true        # 设为 true 后禁止任何修改/删除(只能重建)
data:
  LOG_LEVEL: "info"
⚠️Immutable 配置无法原地修改

一旦 immutable: true,再 kubectl apply 修改 data 会报冲突。要变更只能新建同名(先删后建,注意删前已挂载的 Pod 不受影响)。

4. Secret 的常用类型

除默认 Opaque 外,k8s 内置了几种结构化的 Secret 类型,供特定场景自动消费:

  • kubernetes.io/dockerconfigjson:私有镜像仓库拉取凭证(imagePullSecrets)。
  • kubernetes.io/tls:证书与私钥,Ingress 的 TLS 直接用。
  • kubernetes.io/service-account-token:ServiceAccount 的 token(自动挂载)。
kubectl create secret tls web-tls --cert=tls.crt --key=tls.key

小结

  • 文件挂载可热更新但有延迟,且 subPath 挂载会阻断更新
  • immutable: true 锁定配置,防误改、降负载
  • 内置 Secret 类型(tls、dockerconfigjson)适配特定场景
  • 下一章学习有状态应用如何用 StatefulSet 管理 →