GKE Pod通过NodeJS访问Google Cloud Storage遇403权限错误排查
GKE Pod访问GCS 403权限错误排查与问题分析
配置中可能存在的问题
- 服务账号名称不匹配:你创建的K8s服务账号是
myxxx-svc-account,但部署配置里指定的serviceAccountName是myxxx-account,名称不一致会导致Pod fallback到默认的Compute Engine内置服务账号,这就是错误提示中“无法刷新内置服务账号令牌”的直接原因。 - Workload Identity绑定格式错误:K8s服务账号的注解
iam.gke.io/gcp-service-account必须填写GCP服务账号的完整邮箱(格式:[账号名]@[项目ID].iam.gserviceaccount.com),如果填写的是账号名而非邮箱,绑定会失效。 - 权限同步不及时:如果是在Pod启动后才给GCP服务账号添加的Storage相关角色,Pod内的身份令牌不会自动刷新,需要重启Pod才能获取新权限。
具体排查步骤
1. 验证服务账号绑定关系
- 查看K8s服务账号的注解:
确认kubectl describe serviceaccount myxxx-svc-account -n myxxxAnnotations下的iam.gke.io/gcp-service-account值是GCP服务账号的完整邮箱,而非单纯的账号名。 - 验证GCP服务账号的角色绑定:
输出应包含gcloud projects get-iam-policy [你的项目ID] --filter="bindings.members:serviceAccount:[GCP服务账号邮箱]" --format="value(bindings.role)"roles/iam.workloadIdentityUser、roles/storage.admin、roles/storage.objectAdmin三个角色。
2. 确认Pod使用的服务账号
查看Pod的实际服务账号:
kubectl describe pod [Pod名称] -n myxxx
在Service Account字段确认是myxxx-svc-account,如果显示default或其他名称,说明部署配置中的serviceAccountName配置错误,需要修正为正确的账号名。
3. 测试Pod内的身份验证
- 进入Pod内部:
kubectl exec -it [Pod名称] -n myxxx -- /bin/bash - 获取当前身份的访问令牌并验证:
如果返回的是Compute Engine内置服务账号(格式:# 获取令牌 TOKEN=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r '.access_token') # 检查令牌对应的账号 curl -s "https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=$TOKEN" | jq -r '.email'[项目编号]-compute@developer.gserviceaccount.com),说明Workload Identity绑定未生效,需要重新检查绑定配置。 - 测试GCS访问权限:
若返回403,说明GCP服务账号的Storage权限未正确配置;若返回存储桶信息,说明权限正常,问题出在代码或镜像配置。curl -H "Authorization: Bearer $TOKEN" https://storage.googleapis.com/storage/v1/b/[你的存储桶名称]
4. Docker镜像相关检查
- 检查代码是否硬编码了服务账号密钥:如果代码中通过
GOOGLE_APPLICATION_CREDENTIALS环境变量指定了本地密钥文件,或者直接加载了密钥内容,会覆盖Workload Identity的自动身份验证,导致使用错误的账号访问GCS。 - 确认
@google-cloud/storage库版本:旧版本可能存在Workload Identity兼容性问题,建议升级到最新稳定版(如^6.0.0及以上)。 - 检查Pod环境变量:确保未设置
GOOGLE_APPLICATION_CREDENTIALS,让SDK自动通过元数据服务器获取身份令牌。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

