从GKE集群调用Cloud Functions遭遇403错误,求解决方案
解决GKE通过Workload Identity调用Cloud Functions的403权限问题
核心问题定位
你遇到的iam.serviceAccounts.getOpenIdToken权限被拒错误,本质是GKE工作负载使用的K8s服务账号(KSA)未被授权以目标Cloud Functions的服务账号(SA2)身份生成OpenID令牌,大概率是角色绑定的对象、方向出现了偏差。
分步排查与修复
1. 确认K8s服务账号与SA2的绑定关系
先检查你的KSA注解格式是否正确,必须是SA2的完整邮箱地址:
annotations: iam.gke.io/gcp-service-account: sa2@你的项目ID.iam.gserviceaccount.com
再执行命令验证绑定是否生效:
gcloud iam service-accounts get-iam-policy sa2@你的项目ID.iam.gserviceaccount.com
查看输出里有没有类似这样的主体,且该主体拥有roles/iam.workloadIdentityUser角色:
principalSet://iam.googleapis.com/projects/你的GCP项目ID/locations/global/workloadIdentityPools/集群所属项目ID.svc.id.goog/namespaces/KSA所在命名空间/serviceaccounts/KSA名称
2. 修正权限角色的授予对象
Workload Identity的核心是KSA直接关联SA2,别把权限给错了SA1(默认Compute Engine账号):
- 给KSA对应的GCP主体授予SA2的
roles/iam.serviceAccountTokenCreator权限,执行命令:
gcloud iam service-accounts add-iam-policy-binding sa2@你的项目ID.iam.gserviceaccount.com \ --member="principal://iam.googleapis.com/projects/你的GCP项目ID/locations/global/workloadIdentityPools/集群所属项目ID.svc.id.goog/subject/ns/KSA命名空间/sa/KSA名称" \ --role="roles/iam.serviceAccountTokenCreator"
3. 确保工作负载用对了KSA
检查你的Deployment/StatefulSet配置,确认serviceAccountName指定的是加了注解的KSA,不是默认的default账号:
spec: serviceAccountName: 你的目标KSA名称
如果之前没指定,修改后重新部署:
kubectl apply -f 你的部署文件.yaml
4. 给SA2添加Cloud Functions调用权限
别漏了让SA2能调用目标函数,执行命令添加权限:
gcloud functions add-iam-policy-binding 你的函数名称 \ --member="serviceAccount:sa2@你的项目ID.iam.gserviceaccount.com" \ --role="roles/cloudfunctions.invoker"
5. 刷新身份配置缓存
绑定生效可能需要几分钟,或者直接重启工作负载让新配置生效:
kubectl rollout restart deployment/你的部署名称
内容的提问来源于stack exchange,提问作者AndrewJaeyoung
相关产品推荐
相关产品推荐

