如何确认Kubernetes服务运行所用的GCP服务账号?
解决GCP Cloud SQL 403权限问题及服务账号确认方法
一、确认服务实际使用的服务账号
针对GKE上的服务,可通过以下方式确认:
- 查看Pod的ServiceAccount配置:执行
kubectl get pods <pod-name> -n <namespace> -o yaml,找到spec.serviceAccountName字段,这就是K8s层面的服务账号名称。如果该字段为空,说明使用的是当前命名空间下的default服务账号。 - 查看Pod环境变量:进入Pod内部执行
echo $GOOGLE_APPLICATION_CREDENTIALS,若存在该变量,路径指向的密钥文件对应GCP服务账号;若不存在,说明Pod使用的是GKE节点的服务账号(集群创建时指定的节点默认账号),或是K8s服务账号绑定的GCP服务账号。 - 通过GCP日志排查:在Cloud Logging中搜索服务请求日志,找到含
authenticationInfo的条目,其中的principalEmail就是实际发起请求的服务账号邮箱。
二、服务账号与Kubernetes的关系
- 集群/命名空间不共用单一服务账号:每个K8s命名空间默认会生成独立的
default服务账号,不同命名空间的default账号相互隔离。你也可以在任意命名空间创建自定义K8s服务账号。 - K8s与GCP服务账号的绑定逻辑:GKE中可通过工作负载身份(Workload Identity)将K8s服务账号绑定到GCP服务账号。若未配置该功能,Pod会默认使用GKE节点的服务账号。
- 权限生效前提:只有服务实际使用的账号(绑定的GCP账号或节点账号)拥有Cloud SQL相关权限时,服务才能正常访问API。你之前给指定账号加权限但未生效,大概率是服务实际用了其他账号。
额外建议
确认实际使用的服务账号后,给其分配Cloud SQL Client角色即可(遵循最小权限原则,无需同时加Admin/Editor),等待1-2分钟权限生效后再测试请求。
内容的提问来源于stack exchange,提问作者Andrew Cheong
相关产品推荐
相关产品推荐

