You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:55:55