如何通过Helm Chart管理Google服务账号及相关密钥
GKE + Helm 场景下 Google 服务账号密钥自动化管理方案
需求1:通过Helm自动创建Secret,无需手动执行kubectl命令
你可以直接在Helm Chart中新增Secret资源模板,配合安装时传入密钥文件路径参数实现自动创建,步骤如下:
- 在你的Helm Chart的
templates/目录下新建secret.yaml文件,内容示例:
apiVersion: v1 kind: Secret metadata: name: pubsub-key type: Opaque data: key.json: {{ .Values.gcpServiceAccountKey | b64enc | quote }}
- 安装Helm Release时通过参数传入本地密钥文件内容,避免硬编码到Chart中,命令如下:
helm install your-release-name ./your-chart-path --set gcpServiceAccountKey=$(cat PATH-TO-KEY-FILE.json)
后续迁移到其他集群时,只要本地保留密钥文件,执行上述安装命令即可自动完成Secret创建,无需手动调用kubectl。
需求2:推送Helm Chart到仓库时不暴露明文密钥
上述方案已经天然满足该需求,因为密钥内容是安装时动态传入的,没有硬编码到Chart的任何文件中。如果需要更安全的托管方案,可选择以下两种常用方案:
方案A:使用Sealed Secrets
- 先在集群中安装Sealed Secrets控制器,本地安装kubeseal命令行工具
- 用kubeseal将原始密钥加密为只能被集群中控制器解密的SealedSecret资源,将该加密后的资源文件直接放到Helm Chart的templates目录中
- 加密后的内容即使泄露也无法被第三方解密,可安全提交到代码仓库或推送Chart到公开仓库
方案B:使用GCP原生的Workload Identity(GKE场景优先推荐)
完全避免把服务账号密钥导出到集群外,不需要管理任何密钥文件:
- 为GKE集群启用Workload Identity功能
- 将K8s服务账号与具备GCS权限的Google服务账号进行绑定
- 在Deployment的模板中指定使用绑定后的K8s服务账号,应用可直接获得对应权限,全程不需要创建任何存储密钥的Secret资源
最佳实践建议
- 禁止将任何明文密钥硬编码到Helm Chart的values.yaml或其他模板文件中,所有敏感信息必须通过安装参数、外部密钥管理系统注入
- GKE场景优先使用Workload Identity,从根本上消除服务账号密钥泄露的风险
- 如果必须使用密钥文件的方式,定期轮转密钥,每次轮转后重新执行
helm upgrade命令更新Secret即可 - 不要将密钥文件提交到任何代码仓库,本地存储建议添加到
.gitignore等忽略规则中
内容的提问来源于stack exchange,提问作者voila
相关产品推荐
相关产品推荐

