在GKE中使用Workload Identity(.NET)无法获取访问令牌
GKE Workload Identity令牌获取404问题排查方案
验证IAM服务账号状态
执行命令确认目标IAM SA是否存在且状态正常:gcloud iam service-accounts describe <sa_name>@<project_id>.iam.gserviceaccount.com若返回
NOT_FOUND,说明SA已被删除,需重新创建并关联K8s SA;状态正常则继续下一步。检查Workload Identity绑定关系
- 查看IAM SA的IAM策略,确认是否授予K8s SA
roles/iam.workloadIdentityUser权限:
需确保存在成员绑定:gcloud iam service-accounts get-iam-policy <sa_name>@<project_id>.iam.gserviceaccount.comserviceAccount:<project_id>.svc.id.goog[<namespace>/<k8s_sa_name>] - 检查K8s SA的注解配置:
确认kubectl describe serviceaccount <k8s_sa_name> -n <namespace>iam.gke.io/gcp-service-account注解值与目标IAM SA完全一致,无拼写错误。
- 查看IAM SA的IAM策略,确认是否授予K8s SA
确认节点池Workload Identity配置
检查节点池是否启用GKE元数据模式:gcloud container node-pools describe <node_pool_name> --cluster <cluster_name> --zone <zone>确保
workloadMetadataConfig.mode为GKE_METADATA。若未启用,更新节点池并重启Pod:gcloud container node-pools update <node_pool_name> --cluster <cluster_name> --zone <zone> --workload-metadata=GKE_METADATA验证Pod的服务账号挂载
查看Pod的服务账号配置:kubectl describe pod <pod_name> -n <namespace>确认
Service Account字段为目标K8s SA,且AutomountServiceAccountToken为true。若配置错误,重新部署Pod并指定正确的spec.serviceAccountName。修复IAM SA绑定异常
针对"Gaia id not found"错误,重新建立K8s SA与IAM SA的绑定:# 移除旧绑定 gcloud iam service-accounts remove-iam-policy-binding <sa_name>@<project_id>.iam.gserviceaccount.com \ --member="serviceAccount:<project_id>.svc.id.goog[<namespace>/<k8s_sa_name>]" \ --role="roles/iam.workloadIdentityUser" # 添加新绑定 gcloud iam service-accounts add-iam-policy-binding <sa_name>@<project_id>.iam.gserviceaccount.com \ --member="serviceAccount:<project_id>.svc.id.goog[<namespace>/<k8s_sa_name>]" \ --role="roles/iam.workloadIdentityUser"等待1-2分钟让IAM策略同步,重启测试Pod后重试令牌获取操作。
排查元数据服务器端点
列出所有可用的服务账号,确认默认SA是否存在:curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/若默认SA不在列表中,说明Pod的Workload Identity身份未正确注入,需重新检查节点池和Pod配置。
内容的提问来源于stack exchange,提问作者Alexey Zimarev
相关产品推荐
相关产品推荐

