将 docker 映像从 GCR 拉入 GKE 时出错“无法拉取映像.... 403 禁止”

问题描述

​​背景:

我有一个 GKE 集群,它突然无法从 GCR 中提取我的 docker 镜像;两者都在同一个 GCP 项目中。几个月来它一直运行良好,提取图像没有问题,现在已经开始在没有做任何更改的情况下抛出错误。

(注意:我通常是我团队中唯一一个访问 Google Cloud 的人,尽管我团队中的其他人完全有可能在没有意识到的情况下进行了更改/无意中进行了更改。

我已经看过一些关于这个主题的其他帖子,但其他人提供的解决方案没有帮助。其中两个帖子对我来说特别突出,因为它们都是在大约 13/14 天前我的问题开始的同一天发布的。这究竟是巧合,谁知道呢..

This post 和我有同样的问题;不确定发布的评论是否帮助他们解决了问题,但对我来说还没有解决。 This post 好像也是同样的问题,但是发帖人说等了一段时间后自己解决了。

问题:

几天前我第一次注意到集群上的问题。通过将映像推送到 GCR 然后弹回 Pod kubectl rollout restart deployment 来部署新映像。

然后所有 pod 都返回 ImagePullBackOff,说他们无法从 GCR 获取图像:

kubectl get pods

XXX-XXX-XXX     0/1     ImagePullBackOff   0          13d
XXX-XXX-XXX     0/1     ImagePullBackOff   0          13d
XXX-XXX-XXX     0/1     ImagePullBackOff   0          13d
...

kubectl describe pod XXX-XXX-XXX

Normal   BackOff           20s                kubelet                                Back-off pulling image "gcr.io/<GCP_PROJECT>/XXX:dev-latest"
Warning  Failed            20s                kubelet                                Error: ImagePullBackOff
Normal   Pulling           8s (x2 over 21s)   kubelet                                Pulling image "gcr.io/<GCP_PROJECT>/XXX:dev-latest"
Warning  Failed            7s (x2 over 20s)   kubelet                                Failed to pull image "gcr.io/<GCP_PROJECT>/XXX:dev-latest": rpc error: code = Unknown desc = failed to pull and unpack image "gcr.io/<GCP_PROJECT>/XXX:dev-latest": failed to resolve reference "gcr.io/<GCR_PROJECT>/XXX:dev-latest": unexpected status code [manifests dev-latest]: 403 Forbidden
Warning  Failed            7s (x2 over 20s)   kubelet                                Error: ErrImagePull

我知道图像肯定存在于 GCR 中 -

  • 我可以将映像拉到我自己的机器上(还从我的机器上删除了所有 docker 映像以确认它确实在拉)
  • 如果我在 chrome 上查看 GCR 用户界面,我可以看到标记的图像。

我已经通过 SSH 连接到集群节点之一并尝试手动 docker pull,但没有成功:

docker pull gcr.io/<GCP_PROJECT>/XXX:dev-latest
Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation,and you may have invalid credentials. To authenticate your request,follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication

(还对公共 mongodb 映像进行了 docker pull 以确认 正在工作,并且它特定于 GCR。

所以这让我相信这是服务帐户没有正确权限的问题,如“错误 400/403”部分下的 in the cloud docs。这似乎表明该服务帐户已被删除,或已被手动编辑。

在故障排除期间,我试图确切地找出哪个服务帐户 GKE 从 GCR 中提取。在文档中概述的步骤中,它说:The name of your Google Kubernetes Engine service account is as follows,where PROJECT_NUMBER is your project number:

service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com

我找到了服务帐户并检查了政策 - 它确实有 roles/container.serviceAgent 的服务帐户,但没有像我从文档中的描述所期望的那样特别提到 kubernetes.. 'Kubernetes Engine 服务代理'(除非那是他们所描述的那个,在这种情况下,无论如何我之前都没有更好的...)。

一定没有正确的角色,所以我按照步骤重新启用(禁用然后启用 Kubernetes API)。再次运行 cloud projects get-iam-policy <GCP_PROJECT> 并比较两个输出(之前/之后),唯一的区别是“@cloud-filer...”的服务帐户已被删除。

考虑可能是其他错误,我想我会尝试启动一个新集群。同样的错误 - 无法拉取图像。

发送帮助..

我一直在绞尽脑汁试图解决问题,但现在我已经没有想法了!非常感谢任何帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)