如何使用Workload Identity将Cloud SQL服务账号绑定至GKE Kubernetes服务账号
问题根因
你遇到的报错是两个错误逻辑叠加导致的:
p848827672298-eef1pd@gcp-sa-cloud-sql.iam.gserviceaccount.com是Google托管的Cloud SQL服务账号,归属Google官方的Cloud SQL服务项目,并不在你自己的GCP项目下,你在自己项目下操作该SA的IAM策略自然会提示资源不存在。- 你混淆了Workload Identity的绑定对象:你需要绑定的是你自己项目下有权限触发Cloud SQL导出的GCP服务账号,不是Cloud SQL的托管服务账号。你之前给Cloud SQL托管SA授予的存储桶权限保留即可,那是Cloud SQL服务执行导出时写入存储桶用的,和你的CronJob调用身份无关。
正确操作步骤
- 步骤1:在你自己的GCP项目中新建专用服务账号,例如命名为
cloud-sql-exporter@<你的项目ID>.iam.gserviceaccount.com - 步骤2:给该自建服务账号授予必要权限:
- Cloud SQL导出权限:可以授予预置角色
roles/cloudsql.editor,如果要最小权限可以自定义包含cloudsql.instances.export权限的角色 - 不需要给该SA授予存储桶权限,存储桶写入由Cloud SQL托管SA完成
- Cloud SQL导出权限:可以授予预置角色
- 步骤3:执行Workload Identity绑定命令,注意替换尖括号内的实际值:
gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:<你的GCP项目ID>.svc.id.goog[<K8S命名空间>/<K8S服务账号>]" \ cloud-sql-exporter@<你的GCP项目ID>.iam.gserviceaccount.com - 步骤4:给你的CronJob使用的K8S服务账号添加注解:
annotations: iam.gke.io/gcp-service-account: cloud-sql-exporter@<你的GCP项目ID>.iam.gserviceaccount.com - 步骤5:确认CronJob的Pod模板中指定了使用上述配置完成的K8S服务账号,重新部署CronJob后即可正常执行导出操作。
内容的提问来源于stack exchange,提问作者rlandster
相关产品推荐
相关产品推荐

