k8s集群密钥管理方案思路
在K8s集群中存储和部署证书/密钥,核心是避免明文存储和版本控制泄露,推荐以下3种安全且常用的方案,按“轻量到企业级”排序:
1. 基础方案:用K8s原生的Secret资源(无额外组件)
这是最轻量的方式,适合中小集群或简单场景,直接利用K8s内置能力管理密钥。
- 存储逻辑:将证书/密钥(如TLS证书、API密钥)以 Secret 资源形式存储在K8s集群中,数据会被Base64编码(注意:非加密,需配合RBAC权限控制访问)。
- 部署方式:
1. 手动创建:通过 kubectl create secret 命令,例如创建TLS证书:
kubectl create secret tls my-tls-secret --cert=path/to/tls.crt --key=path/to/tls.key 。
2. 配置文件创建:写 Secret 的YAML文件(避免提交到GitHub),通过 kubectl apply -f secret.yaml 部署。
- 使用方式:Pod通过“环境变量注入”或“文件挂载”使用Secret,例如在Deployment中指定 secretMounts 挂载证书到容器内路径。
2. 进阶方案:用Sealed Secrets(适合GitOps流程)
如果需要将密钥配置纳入Git版本控制(配合GitOps工具如ArgoCD/Flux),Sealed Secrets能解决“密钥明文存Git”的风险。
- 核心原理:通过“密封密钥”机制——将K8s Secret用集群唯一的公钥加密成 SealedSecret (加密后的数据可安全存Git),集群内的 sealed-secrets-controller 组件用私钥解密,自动生成原生Secret。
- 部署步骤:
1. 在K8s集群部署 sealed-secrets-controller (通过Helm或YAML部署)。
2. 在本地安装 kubeseal 工具,用集群公钥加密原始Secret:
kubectl create secret generic my-secret --from-literal=key=value --dry-run=client -o yaml | kubeseal --format=yaml > sealed-secret.yaml 。
3. 将 sealed-secret.yaml 提交到Git,GitOps工具同步到集群后,控制器自动解密生成Secret。
3. 企业级方案:集成外部KMS(适合高安全需求)
如果对密钥安全要求极高(如金融、政务场景),需用独立的密钥管理系统(KMS)存储根密钥,避免密钥泄露风险。
- 支持的KMS:主流有HashiCorp Vault、AWS KMS、Azure Key Vault、GCP KMS,或开源的Vault(最常用)。
- 存储与部署逻辑:
1. 在集群外部署KMS(如Vault服务器),将核心证书/密钥存储在KMS中,K8s不直接存原始密钥。
2. 在K8s集群部署KMS客户端插件(如Vault Agent Injector),通过插件向Pod动态注入密钥(无需在集群内持久化密钥)。
- 优势:KMS提供密钥生命周期管理(生成、轮换、销毁)、细粒度权限控制和审计日志,安全性远高于原生Secret。
关键注意事项
- 禁止将任何明文密钥、 Secret 的YAML文件(未密封)提交到GitHub,可在 gitignore 中排除 secret/ 目录或 *.secret.yaml 文件。
- 无论用哪种方案,都需配置K8s RBAC权限,限制 Secret 的访问(仅授权必要的Pod/ServiceAccount读取)。
- 定期轮换密钥:原生Secret需手动或写脚本轮换,Sealed Secrets/KMS支持自动轮换,降低密钥泄露风险。

浙公网安备 33010602011771号