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 管理 →