配置与密钥¶
镜像应保持环境无关,同一镜像通过外部配置运行在测试、预生产和生产环境。普通参数放 ConfigMap,密码、Token、证书等敏感值放 Secret;两者都可以作为环境变量或文件注入 Pod。
ConfigMap 与 Secret 的边界¶
| 类型 | 适合保存 | 不适合保存 |
|---|---|---|
| ConfigMap | URL、开关、日志级别、普通配置文件 | 密码、私钥、访问令牌 |
| Secret | 凭据、证书、Token | 大文件、完整密钥生命周期管理 |
Secret 的值通常只是 Base64 编码,不等于加密。生产集群还要配置 etcd 静态加密、RBAC 最小权限、审计,以及外部 KMS/Secret 管理系统。
声明式创建¶
apiVersion: v1
kind: ConfigMap
metadata:
name: order-config
namespace: order
data:
APP_ENV: production
application.yaml: |
server:
port: 8080
logging:
level:
root: INFO
---
apiVersion: v1
kind: Secret
metadata:
name: order-secret
namespace: order
type: Opaque
stringData:
DB_USERNAME: order_app
DB_PASSWORD: replace-outside-git
stringData 方便提交给 API Server,但示例中的真实密码仍不能进入 Git。GitOps 场景可使用 SOPS、Sealed Secrets 或 External Secrets 等方案,让仓库只保存密文或外部密钥引用。
注入环境变量¶
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: order-config
key: APP_ENV
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: order-secret
key: DB_PASSWORD
环境变量在容器启动时读取。ConfigMap/Secret 更新后,正在运行的进程不会自动获得新值,通常需要滚动重启:
kubectl rollout restart deployment/order-service -n order
kubectl rollout status deployment/order-service -n order
挂载配置文件¶
volumes:
- name: config
configMap:
name: order-config
containers:
- name: app
volumeMounts:
- name: config
mountPath: /etc/order
readOnly: true
挂载为卷的内容会由 kubelet 逐步同步,但不是立即更新;应用还必须支持重新加载文件。使用 subPath 挂载单文件时,更新通常不会自动反映到容器内。为了让发布结果可追踪,常见做法是把配置校验和写进 Pod Template annotation,配置变化便会触发新一轮滚动发布,Helm Chart 经常采用这种方式。
运维检查¶
kubectl get configmap,secret -n order
kubectl describe configmap order-config -n order
kubectl get configmap order-config -n order -o yaml
kubectl exec -n order deploy/order-service -- printenv APP_ENV
kubectl exec -n order deploy/order-service -- ls -l /etc/order
查看 Secret 会把敏感值带入终端历史、录屏或工单,非必要不要解码输出。排障时优先确认对象是否存在、key 名是否一致、Pod 使用的对象名称和 ServiceAccount 权限。
常见问题¶
| 现象 | 原因与处理 |
|---|---|
CreateContainerConfigError |
ConfigMap/Secret 不存在,或引用的 key 缺失;查看 Pod Events |
| 配置改了但应用没变化 | 环境变量不会热更新;卷同步有延迟,应用也可能不支持 reload |
| 文件权限不正确 | 检查 defaultMode、容器用户、fsGroup,私钥权限要更严格 |
| 新配置导致启动失败 | 先校验格式,再通过 rollout history/undo 回滚 Pod Template |
| Git 中出现明文 Secret | 立即轮换凭据;只删 Git 当前文件不足以消除历史泄露 |
上线原则¶
- 镜像中不写死环境地址和密码。
- 配置与应用版本都可追溯,变更经过校验和发布记录。
- Secret 只授予需要它的 Namespace、ServiceAccount 和工作负载。
- 应用启动时主动校验关键配置,错误要给出明确日志。
- 对证书和 Token 建立到期监控与轮换流程。
官方参考:ConfigMaps、Secrets。