GKE部署Spring Boot应用遇ErrImagePull:403禁止获取OAuth令牌
问题
按照《在Google Kubernetes Engine上部署Spring Boot Java应用》教程操作时,部署Docker镜像到Kubernetes后Pod无法启动,出现ErrImagePull错误。
部署命令:
kubectl create deployment questy-java --image=us-central1-docker.pkg.dev/quizdev/codelabrepo/questy-java:v1
执行kubectl describe pod questy-java-54dbd6ccd4-5cb94查看事件,核心错误:
failed to authorize: failed to fetch oauth token: unexpected status: 403 Forbidden
已尝试操作:
- 确认VPC网络的Private Google Access已启用
- 安装gke-gcloud-auth-plugin后重新部署
- 创建新的Artifact Registry仓库并重新部署
- 重新构建Docker镜像并部署到新仓库
- 通过Google Cloud Console直接部署镜像
- 执行
gcloud auth configure-docker us-central1-docker.pkg.dev - 确认镜像路径正确,本地可成功执行
docker pull us-central1-docker.pkg.dev/quizdev/codelabrepo/questy-java:v1拉取镜像
原因分析
问题核心是GKE集群的节点服务账号没有权限访问Artifact Registry镜像仓库。本地能拉取镜像是因为使用了个人Google账号的权限,但GKE节点默认使用的是Compute Engine默认服务账号(或自定义节点服务账号),该账号缺少Artifact Registry Reader角色,导致节点尝试拉取镜像时无法通过授权,返回403 Forbidden错误。
最优解决方法
给GKE节点使用的服务账号添加Artifact Registry Reader角色,这是符合GCP最佳实践的优雅方案,无需手动管理镜像拉取密钥:
获取节点服务账号
执行以下命令查看集群使用的节点服务账号:gcloud container clusters describe [你的集群名称] --zone [集群所在区域] | grep serviceAccount默认情况下,这个账号格式为
[项目编号]-compute@developer.gserviceaccount.com。添加权限
执行以下命令给该服务账号添加Artifact Registry读取权限:gcloud projects add-iam-policy-binding [你的项目ID] \ --member="serviceAccount:[节点服务账号完整名称]" \ --role="roles/artifactregistry.reader"
权限生效后,删除现有Pod让Kubernetes重新创建,新Pod即可正常拉取镜像:
kubectl delete pod questy-java-54dbd6ccd4-5cb94
内容的提问来源于stack exchange,提问作者fascynacja
相关产品推荐
相关产品推荐

