动态创建的GKE Deployment无法通过服务账号认证
GKE Workload Identity 动态创建Deployment权限问题排查
关键排查步骤
- 确认动态Deployment的服务账号配置
检查Ruby代码生成的Deployment模板中,spec.template.spec.serviceAccountName是否和正常运行的Deployment完全一致。如果该字段缺失或配置错误,Pod会使用命名空间的默认服务账号,而默认账号可能未绑定openc3-sa@<PROJECTID>.iam.gserviceaccount.com。 - 验证Workload Identity绑定状态
重新执行绑定命令确保关联生效(即使之前配置过,动态创建的Pod可能未同步最新绑定):
执行后等待1-2分钟,再重新创建Deployment测试。gcloud iam service-accounts add-iam-policy-binding openc3-sa@<PROJECTID>.iam.gserviceaccount.com \ --member "serviceAccount:<PROJECTID>.svc.id.goog[<NAMESPACE>/<K8S-SERVICE-ACCOUNT>]" \ --role "roles/iam.workloadIdentityUser" - 检查Pod的身份挂载情况
进入动态创建的Pod,执行以下命令确认Workload Identity凭证是否正确挂载:
正常应返回ls /var/run/secrets/google.com/serviceaccount/token、ca.crt等文件,若不存在说明Pod未启用Workload Identity。 - 验证存储桶的IAM策略
即使服务账号有项目级Storage Admin,存储桶可能存在单独的IAM限制。执行命令检查桶的权限:
确认gsutil iam get gs://<YOUR-BUCKET-NAME>openc3-sa@<PROJECTID>.iam.gserviceaccount.com在桶的IAM列表中,或项目级权限已继承到桶。
Ruby代码配置检查
确保动态创建Deployment时正确指定服务账号,示例代码片段:
deployment_spec = { apiVersion: "apps/v1", kind: "Deployment", metadata: { name: "your-dynamic-deployment" }, spec: { template: { spec: { serviceAccountName: "your-working-k8s-sa", # 必须和正常Deployment使用的一致 containers: [ { name: "your-container", image: "your-image:tag" } ] } } } } kubeclient.create_deployment(deployment_spec)
错误日志:
/usr/lib/ruby/gems/3.1.0/gems/google-cloud-storage-1.43.0/lib/google/cloud/storage/service.rb:913:in 'rescue in execute': forbidden: openc3-sa@<PROJECTID>.iam.gserviceaccount.com does not have storage.buckets.get access to the Google Cloud Storage bucket. (Google::Cloud::PermissionDeniedError)
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

