GCP跨项目部署无法拉取Artifact Registry镜像的排查求助
镜像拉取失败的原因及解决方法
核心问题:权限授予的项目错误
你在项目A中给节点默认服务账号配置了Artifact Registry Reader角色,但镜像存储在项目B的Artifact Registry中。GCP的IAM权限是项目级别的,项目A的服务账号需要在项目B中被授予读取权限,才能访问项目B的资源。
解决步骤
获取项目A的节点默认服务账号邮箱
节点默认服务账号格式为:[项目A的编号]-compute@developer.gserviceaccount.com
可以通过GCP控制台项目A的「IAM与管理」→「服务账号」找到,或者用命令:gcloud projects describe [项目A ID] --format='value(projectNumber)'拼接成完整邮箱。
在项目B中授予服务账号权限
登录GCP控制台的项目B,进入「Artifact Registry」→ 选择对应的仓库 → 点击「权限」→ 添加成员:- 输入项目A的服务账号邮箱
- 授予
Artifact Registry Reader角色 - 保存配置
验证节点池访问范围
确认节点池的cloud-platform范围已正确配置,节点能通过该范围获取完整的云平台权限:gcloud container node-pools describe [节点池名称] --cluster=[集群名称] --zone=[区域] --format='value(config.oauthScopes)'输出中需包含
https://www.googleapis.com/auth/cloud-platform
额外排查点
- 检查Artifact Registry的访问模式:如果仓库是私有模式,确保项目A的集群节点网络能访问Artifact Registry的端点,必要时配置VPC私有访问或防火墙规则。
- 查看节点日志:登录节点执行
journalctl -u kubelet,查看镜像拉取时的详细认证日志,确认是否有其他权限限制。 - 临时测试:用
kubectl run直接创建Pod测试拉取,排除Deployment配置问题:kubectl run test-ubuntu --image=europe-west1-docker.pkg.dev/B/docker-repo/ubuntu:latest --command -- sleep 123456 -n customnamespace
内容的提问来源于stack exchange,提问作者Harry Myburgh
相关产品推荐
相关产品推荐

