Golang访问GCS本地正常GKE Pod报403权限错误求助
问题重现
本地通过JSON凭证读取GCS存储桶文件正常,但GKE Pod中执行时触发权限错误:
googleapi: Error 403: Caller does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist)., forbidden
核心代码片段:
bkt := configs.GCPClient.Bucket(bucketName) it := bkt.Objects(ctx, nil) for { attrs, err := it.Next() if err == iterator.Done { break } if err != nil { return files } fmt.Println(attrs.Name) }
排查步骤
确认Pod使用的服务账号
执行命令查看Pod关联的K8s服务账号:kubectl describe pod <你的Pod名称> | grep ServiceAccount若未手动指定,Pod会默认使用所在命名空间的
default服务账号。检查GCP服务账号的IAM权限
如果使用Workload Identity,先确认K8s服务账号已绑定对应的GCP服务账号,再检查该GCP服务账号是否拥有storage.objects.list权限(可通过roles/storage.objectViewer等预设角色或自定义角色赋予):# 查看GCP服务账号的IAM绑定关系 gcloud iam service-accounts get-iam-policy <GCP服务账号邮箱> # 直接查看存储桶的IAM权限配置 gsutil iam get gs://<你的存储桶名称>确保输出结果中包含目标服务账号,且关联的角色覆盖所需权限。
排查凭证加载逻辑
本地运行依赖本地JSON凭证文件,但GKE环境下应通过元数据服务自动获取凭证。检查代码是否硬编码了本地JSON凭证路径或强制指定GOOGLE_APPLICATION_CREDENTIALS环境变量:- 若存在这类硬编码配置,需删除相关代码,让GCP SDK自动使用Pod所属服务账号的凭证。
验证权限生效状态
IAM权限变更通常需要1-5分钟才能完全生效,若刚完成权限配置,等待片刻后重新测试Pod。检查节点服务账号权限(未启用Workload Identity时)
若未启用Workload Identity,Pod会默认使用GKE节点的服务账号。检查该节点服务账号是否拥有存储桶的访问权限:gcloud compute service-accounts describe <节点服务账号邮箱>
内容的提问来源于stack exchange,提问作者Krushna Bate

