ConfigMap 和 Secret 把配置与容器镜像解耦,使同一个镜像在 dev、staging 和 production 中以不同设置运行。ConfigMap 保存非敏感配置;Secret 保存敏感数据(密码、token、密钥)并被更谨慎地处理。
理念:把配置移出镜像
镜像 = 代码(不可变,只构建一次)。 配置 = 每个环境的取值。
把配置烤进镜像是一种反模式(每个环境都要重建、secret 会泄露)。
→ 把配置存在 ConfigMap/Secret 中,运行时以环境变量或文件注入。
ConfigMap 和 Secret 把配置与容器镜像解耦,使同一个镜像在 dev、staging 和 production 中以不同设置运行。ConfigMap 保存非敏感配置;Secret 保存敏感数据(密码、token、密钥)并被更谨慎地处理。
镜像 = 代码(不可变,只构建一次)。 配置 = 每个环境的取值。
把配置烤进镜像是一种反模式(每个环境都要重建、secret 会泄露)。
→ 把配置存在 ConfigMap/Secret 中,运行时以环境变量或文件注入。
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "info"
FEATURE_X: "true"
app.properties: |
timeout=30
retries=3
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData: # 此处为明文;在 etcd 中以 base64 编码存储
DB_PASSWORD: "s3cr3t"
DB_USER: "appuser"
# 通常以命令式方式创建,以避免把 secret 提交到 git:
kubectl create secret generic db-secret \
--from-literal=DB_USER=appuser --from-literal=DB_PASSWORD=s3cr3t
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: LOG_LEVEL # 从一个 ConfigMap 取单个 key
valueFrom:
configMapKeyRef: { name: app-config, key: LOG_LEVEL }
- name: DB_PASSWORD # 从一个 Secret 取单个 key
valueFrom:
secretKeyRef: { name: db-secret, key: DB_PASSWORD }
envFrom:
- configMapRef: { name: app-config } # 把所有 key 作为环境变量导入
volumeMounts:
- name: config-vol
mountPath: /etc/config # 把配置以文件形式挂载
volumes:
- name: config-vol
configMap: { name: app-config }
⚠ 默认情况下 Secret 数据是 base64 编码的,而非加密。
→ 为 etcd 启用静态加密 (EncryptionConfiguration)。
→ 用 RBAC 限制访问(谁能 'get secrets')。
→ 优先使用外部管理器(Vault、云 Secrets Manager)或 sealed secret。
→ 绝不要把真实的 Secret manifest 提交到 git。
环境变量配置在容器启动时只读取一次;挂载的文件可以实时更新。
把配置与代码分离是一项核心运维实践,而 ConfigMap 与 Secret 就是 Kubernetes 实现它的方式,因此理解它们是必备的中级知识。把环境相关设置烤进镜像是一种反模式——它迫使每个环境都重建,并有泄露 secret 的风险——所以 Kubernetes 让你保留一个单一、不可变的镜像,并在运行时注入配置:ConfigMap 用于非敏感取值(日志级别、feature flag、配置文件),Secret 用于敏感数据(密码、token、密钥)。了解消费它们的两种方式——作为环境变量(通过 configMapKeyRef/secretKeyRef 取单个 key,或通过 envFrom 取全部 key)和作为挂载文件(其微妙之处在于环境变量在启动时只读取一次,而挂载文件可实时更新)——是部署真实应用的日常实用知识。同样重要的是理解那些绊倒许多工程师的安全注意事项:默认情况下 Secret 数据只是 base64 编码而非加密,因此真正保护它需要为 etcd 启用静态加密、用 RBAC 限制访问、避免把 Secret manifest 提交到版本控制,并常常集成一个外部 secret 管理器。因为几乎每个 workload 都需要按环境划分的配置和凭据,且因为处理不当的 Secret 是一个常见而严重的安全缺口,牢固掌握 ConfigMap 与 Secret 是在 Kubernetes 上安全、正确运行应用的基础。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠