将扩展底座图像从GCR拉入GKE时出错&无法拉入图像...403禁止; [英] Error pulling docker image from GCR into GKE "Failed to pull image .... 403 Forbidden"
问题描述
背景:
我有一个GKE集群,它突然不能从GCR中拉出我的docker图像;两者都在同一个GCP项目中。几个月来,它一直运行良好,拉取图像没有任何问题,现在已经开始抛出错误,没有进行任何更改。
(注意:我通常是我的团队中唯一访问Google Cloud的人,尽管我团队中的其他人完全有可能在没有意识到的情况下进行了更改/无意中进行了更改)。
我看过其他一些关于这个主题的帖子,但其他帖子中提供的解决方案并没有帮助。其中有两个帖子对我来说特别突出,因为它们都是在我13/14天前开始发行问题的同一天发布的。这是不是巧合,谁知道呢..
This post和我有相同的问题;不确定发表的评论是否帮助他们解决了问题,但我没有解决这个问题。This post似乎也是同样的问题,但发帖者说等了一段时间后就自动解决了。
几天前,我第一次注意到集群上的这个问题。已通过将映像推送到GCR,然后反弹Podkubectl 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
Troubleshooting步骤:
我知道GCR中肯定存在该图像-
- 我可以将图像拉到我自己的机器上(还从我的机器上删除了所有坞站图像,以确认它真的在拉)
- 如果我在Chrome上查看GCR用户界面,则可以看到标记的图像。
我已通过SSH连接到其中一个集群节点,并尝试手动对接拉取,但未成功:
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拉取,以确认正在工作,并且它特定于GCR)。
因此,这使我认为这是服务帐户没有正确权限的问题,如in the cloud docs在‘Error 400/403’部分下所示。这似乎表明该服务帐户已被删除或手动编辑。
在我的故障排除过程中,我试图找出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引擎服务代理角色’(除非这就是他们所描述的角色,在这种情况下,我之前也不会更好。)。
一定没有正确的角色,所以我随后按照步骤重新启用(禁用然后启用Kubernetes API)。再次运行cloud projects get-iam-policy <GCP_PROJECT>
并区分两个输出(在此之前/之后),唯一的区别是服务帐户为‘@cloud-filer...’已删除。
考虑到错误可能是其他原因,我想我应该尝试创建一个新的集群。相同错误-无法拉入图像。
我绞尽脑汁试图解决问题,但现在我没有办法了!非常感谢大家的帮助!
推荐答案
现在已解决此问题。
服务帐户具有正确的角色/权限,但由于某种原因停止工作。
我为该服务帐户手动创建了一个密钥,将该密钥添加到Kube群集中,并将服务帐户设置为使用该密钥。
仍然不知道为什么它没有这样做,或者为什么它一开始就停止工作,但它正在工作...
修复来自this guide,从"创建和使用GCR凭据"开始。
这篇关于将扩展底座图像从GCR拉入GKE时出错&无法拉入图像...403禁止;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!