GKE中Pod返回‘error looking up service account’错误——如何在GKE中正确使用GCP服务账号?
解决GKE中"serviceaccount not found"的问题
看起来你混淆了GCP IAM服务账号和Kubernetes集群内的ServiceAccount——这是两个完全独立的资源,你遇到的错误是Kubernetes在尝试查找集群内的service/serviceaccount这个ServiceAccount,但你只创建了GCP层面的服务账号,所以才会提示找不到。
下面是具体的解决步骤:
第一步:创建Kubernetes集群内的ServiceAccount
首先在你的service命名空间下创建对应的Kubernetes ServiceAccount:
kubectl create serviceaccount serviceaccount -n service
第二步:选择合适的认证方式(推荐用Workload Identity)
方式1:使用GKE Workload Identity(推荐,更安全)
这是GKE官方推荐的认证方式,不需要手动挂载密钥文件,直接关联K8s SA和GCP IAM SA:
- 给你的GCP IAM服务账号绑定所需的IAM角色(比如你业务需要的
roles/storage.objectViewer等权限角色) - 允许K8s SA使用GCP IAM SA的身份:
gcloud iam service-accounts add-iam-policy-binding YOUR_GCP_SA_EMAIL \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:YOUR_PROJECT_ID.svc.id.goog[service/serviceaccount]" - 给K8s SA添加注解关联GCP IAM SA:
kubectl annotate serviceaccount serviceaccount \ iam.gke.io/gcp-service-account=YOUR_GCP_SA_EMAIL -n service - 修改你的Deployment,指定使用这个K8s SA,同时可以移除之前的密钥挂载配置:
在Deployment的spec.template.spec下添加:serviceAccountName: serviceaccount
方式2:继续使用密钥挂载(不推荐,但可临时解决)
如果你还是想沿用之前的密钥挂载方式,需要确保你的Deployment没有显式指定不存在的ServiceAccount:
- 检查Deployment的
spec.template.spec下是否有serviceAccountName: serviceaccount这一行,如果有,要么删除它(Pod会使用命名空间下默认的defaultServiceAccount),要么确保你已经执行了第一步的命令创建对应的K8s SA。
错误根源说明
你之前的操作都是针对GCP IAM服务账号的,但Kubernetes的Pod在启动时会尝试使用指定的集群内ServiceAccount——如果Deployment里指定了serviceAccountName: serviceaccount,但这个SA在service命名空间下不存在,就会触发这个"not found"错误。
内容的提问来源于stack exchange,提问作者fuzzi
相关产品推荐
相关产品推荐

