Kubernetes Secrets
存敏感数据(密码、token)base64 编码,挂载为环境或文件。
容器进阶
为什么
Secret 分离存储敏感数据与镜像和 ConfigMap。默认 base64 编码(非加密),可挂载为环境变量或文件。
Docker is used by 59% of professional developers per the Stack Overflow 2024 survey,Kubernetes 在生产中运行 60% 的容器化工作负载(CNCF 2024 调查)。容器编排通过声明式滚动发布将部署相关事故减少 35%。
何时使用
密码、API key、TLS 证书用 Secret。启用静态加密真正安全。
如何做
1. 创建 — kubectl create secret generic --from-literal
2. 从文件 — --from-file=tls.crt
3. 编码 — YAML 中 base64 值
4. 挂载 — env.valueFrom.secretKeyRef 或 volume
5. 加密 — 启用静态加密
6. 外部 — ExternalSecrets 或 Vault
7. 轮换 — 更新 secret,rollout restart
示例
# 创建 secret
kubectl create secret generic db-secret --from-literal=password=supersecret --from-literal=user=admin
# 或经 YAML(base64 编码)
apiVersion: v1
kind: Secret
metadata: { name: db-secret }
type: Opaque
data:
password: c3VwZXJzZWNyZXQ= # "supersecret" 的 base64
user: YWRtaW4= # "admin" 的 base64
# deployment 中使用
spec:
containers:
- name: app
env:
- name: DB_PASSWORD
valueFrom: { secretKeyRef: { name: db-secret, key: password } }
常见问题
- ⚠Secret 未静态加密 — 仅 base64,etcd 启用加密
- ⚠Secret 入 git — 永不提交 Secret YAML,用 sealed-secrets 或 ExternalSecrets
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓启用静态加密 — etcd 中加密 secret,非仅 base64
- ✓用 ExternalSecrets 或 Vault — secret 不入 git,外部管理
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求