跳转至

配置与密钥

镜像应保持环境无关,同一镜像通过外部配置运行在测试、预生产和生产环境。普通参数放 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 当前文件不足以消除历史泄露

上线原则

  1. 镜像中不写死环境地址和密码。
  2. 配置与应用版本都可追溯,变更经过校验和发布记录。
  3. Secret 只授予需要它的 Namespace、ServiceAccount 和工作负载。
  4. 应用启动时主动校验关键配置,错误要给出明确日志。
  5. 对证书和 Token 建立到期监控与轮换流程。

官方参考:ConfigMapsSecrets