在GKE Autopilot中访问Google Secrets Manager时出现403错误
GKE Autopilot下Secrets Manager访问403权限问题排查与解决
问题场景
在GKE Autopilot模式部署Golang应用,通过Workload Identity关联GCP服务账户访问Secrets Manager时,出现403权限错误:
rpc error: code = Unauthenticated desc = transport: per-RPC creds failed due to error: compute: Received 403 `Unable to generate access token; IAM returned 403 Forbidden: Permission 'iam.serviceAccounts.getAccessToken' denied on resource (or it may not exist).
已执行的操作流程:
- 创建Autopilot集群:
gcloud config set project goproject gcloud container clusters create-auto goproject-develop-gke --project goproject --region us-central1
- 为GCP服务账户绑定角色:
gcloud iam service-accounts add-iam-policy-binding goproject-service-account@goproject.iam.gserviceaccount.com \ --member "serviceAccount:goproject.svc.id.goog[default/goproject-sa]" \ --role "roles/iam.workloadIdentityUser" gcloud projects add-iam-policy-binding goproject \ --member "serviceAccount:goproject-service-account@goproject.iam.gserviceaccount.com" \ --role "roles/secretmanager.secretAccessor"
- 创建K8s服务账户:
kubectl create serviceaccount goproject-google-sa
- 为K8s服务账户添加IAM注解:
kubectl annotate serviceaccount goproject-google-sa \ iam.gke.io/gcp-service-account=goproject-service-account@goproject.iam.gserviceaccount.com
- 部署应用时指定使用
goproject-google-sa服务账户,代码使用Secrets Manager官方SDK访问凭证。
核心问题定位
Workload Identity绑定关系不匹配:在为GCP服务账户添加workloadIdentityUser角色时,指定的K8s服务账户是default/goproject-sa,但实际创建并在部署中使用的K8s服务账户是goproject-google-sa,导致权限映射未生效。
修复步骤
- 修正IAM绑定关系
先删除错误的绑定(可选,若不需要保留):
gcloud iam service-accounts remove-iam-policy-binding goproject-service-account@goproject.iam.gserviceaccount.com \ --member "serviceAccount:goproject.svc.id.goog[default/goproject-sa]" \ --role "roles/iam.workloadIdentityUser"
添加正确的绑定,对应实际使用的K8s服务账户:
gcloud iam service-accounts add-iam-policy-binding goproject-service-account@goproject.iam.gserviceaccount.com \ --member "serviceAccount:goproject.svc.id.goog[default/goproject-google-sa]" \ --role "roles/iam.workloadIdentityUser"
- 重启部署生效
让Pod重新加载服务账户权限:
kubectl rollout restart deployment/goproject-service
额外验证项
- 确认GCP服务账户
goproject-service-account@goproject.iam.gserviceaccount.com已正确配置roles/secretmanager.secretAccessor角色(已通过IAM页面验证,此部分无需调整) - GKE Autopilot默认启用元数据服务器,部署中的
nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"为冗余配置,可保留或移除
内容的提问来源于stack exchange,提问作者Inventor Andy
相关产品推荐
相关产品推荐

