You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 给你的GCP IAM服务账号绑定所需的IAM角色(比如你业务需要的roles/storage.objectViewer等权限角色)
  2. 允许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]"
    
  3. 给K8s SA添加注解关联GCP IAM SA:
    kubectl annotate serviceaccount serviceaccount \
      iam.gke.io/gcp-service-account=YOUR_GCP_SA_EMAIL -n service
    
  4. 修改你的Deployment,指定使用这个K8s SA,同时可以移除之前的密钥挂载配置:
    在Deployment的spec.template.spec下添加:
    serviceAccountName: serviceaccount
    

方式2:继续使用密钥挂载(不推荐,但可临时解决)

如果你还是想沿用之前的密钥挂载方式,需要确保你的Deployment没有显式指定不存在的ServiceAccount:

  • 检查Deployment的spec.template.spec下是否有serviceAccountName: serviceaccount这一行,如果有,要么删除它(Pod会使用命名空间下默认的default ServiceAccount),要么确保你已经执行了第一步的命令创建对应的K8s SA。

错误根源说明

你之前的操作都是针对GCP IAM服务账号的,但Kubernetes的Pod在启动时会尝试使用指定的集群内ServiceAccount——如果Deployment里指定了serviceAccountName: serviceaccount,但这个SA在service命名空间下不存在,就会触发这个"not found"错误。

内容的提问来源于stack exchange,提问作者fuzzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:44:04