【发布时间】:2021-09-30 10:55:42
【问题描述】:
背景:
我有一个 GKE 集群,它突然无法从 GCR 拉取我的 docker 镜像;两者都在同一个 GCP 项目中。几个月来一直运行良好,拉取图像没有问题,现在在没有进行任何更改的情况下开始抛出错误。
(注意:我通常是我团队中唯一一个访问 Google Cloud 的人,尽管我团队中的其他人完全有可能在没有意识到的情况下进行了更改/无意中进行了更改)。
我看过其他一些关于这个主题的帖子,但其他人提供的解决方案没有帮助。其中两个帖子对我来说尤其突出,因为它们都是在大约 13/14 天前我的问题开始的同一天发布的。这到底是不是巧合,谁知道呢。。
This post 和我有同样的问题;不确定发布的 cmets 是否帮助他们解决了问题,但对我来说并没有解决。 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 UI,我可以看到标记的图像。
我已经通过 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...”的服务帐户已被删除。
认为错误可能是其他原因,我想我会尝试启动一个新集群。同样的错误 - 无法提取图像。
发送帮助..
我一直在绞尽脑汁试图排除故障,但现在我没有想法!非常感谢任何和所有帮助!
【问题讨论】:
-
计算引擎默认服务账号用于拉取镜像。该帐户是否具有
roles/storage.objectViewer权限? -
Compute Engine Service Agent 有
Storage Object Admin,Kubernetes Engine Service Agent 有Storage Object Viewer。我可以看到这两个分别有roles/storage.objectAdmin和roles/storage.objectViewer -
转到节点池并检查安全部分中的服务帐户是什么。授予该服务帐户的存储权限。还要检查应该有错误的服务帐户的访问日志
标签: docker kubernetes google-cloud-platform google-kubernetes-engine google-container-registry