GKE无法从GCR中拉取镜像。

4
这是一个真正的难题,因为一切都在昨天之前运行良好多年。我有一个谷歌云帐户并正确设置了计费。我在我的GCR注册表中有私有镜像,我可以从我的笔记本电脑(MacBook Pro with Big Sur 11.4)上执行“docker pull”和“docker push”而没有任何问题。
我在此详细说明的问题是,在谷歌云控制台中删除项目后,昨天开始发生的,然后使用相同名称从头开始创建它。以前的项目没有问题拉取GCR镜像,新项目无法拉取相同的镜像。我现在已经使用云控制台创建了新的空测试项目,使用各种名称,并使用默认GKE值创建了新的群集。但是所有这些新问题仍然存在。
当我使用kubectl在GKE上创建使用同一项目中的任何GCR镜像的部署时,我会收到ErrImagePull错误。当我“describe”无法加载镜像的pod时,错误(隐藏了项目ID)如下:
当我使用来自笔记本电脑的kubectl时(包括清除并创建具有正确凭据的新.kube/config文件后),出现了“Failed to pull image "gcr.io/test-xxxxxx/test:1.0.0": rpc error: code = Unknown desc = failed to pull and unpack image "gcr.io/test-xxxxxx/test:1.0.0": failed to resolve reference "gcr.io/test-xxxxxx/test:1.0.0": unexpected status code [manifests 1.0.0]: 401 Unauthorized.”错误,但是当我使用云控制台选择“部署到GKE”以获取GCR映像来设置部署时,情况完全相同...没有涉及kubectl。
如果我ssh进入任何这些新集群中的节点并尝试“docker pull” GCR映像(在同一项目中),则会出现类似的错误:“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”.

我从多篇文章中了解到,GKE无需设置特殊授权即可从同一项目中拉取GCR镜像,并且过去从未遇到过此问题。

希望我不是唯一一个陷入孤岛的人。提前感谢您的帮助!


你好。你的GKE节点池SA在项目中拥有哪些IAM角色?你的理解是正确的,你不需要额外做任何事情,但是节点池的SA需要适当的角色来访问GCR。你正在使用默认的SA吗?还是自定义SA? - Armando Cuevas
感谢您的帮助!我对服务账户与节点池之间的关系非常困惑。我从未指定过自定义SA。在我设置的每个测试项目中,都有一个名为“计算机引擎默认服务账户”的SA。当我查看其“权限”时,在“具有访问此服务账户权限的成员”下,我看到3个条目:它,“Google API服务代理”和我(所有者)。我应该去哪里看?我很想回答“您的GKE节点池的SA在项目中拥有哪些IAM角色”,但不知道该去哪里看。 - user2344885
我刚刚确认我的测试集群的节点池都在使用“默认”SA。 - user2344885
我的SA被称为“Compute Engine默认服务帐户”,拥有Editor的角色。 - user2344885
1个回答

3

我尝试实施设置,在 GKE 集群和集群节点上都遇到了同样的错误。这是因为在集群节点上,访问 Cloud Storage API 被“禁用”,可以在“Cloud API 访问范围”部分下的节点(VM 实例)详细信息中进行验证。

我们可以通过将“访问范围”更改为“为每个 API 设置访问权限”,并在创建集群时在节点池 -> 默认池 -> 安全性部分修改对特定 API 的访问来纠正此问题。在我们的情况下,我们需要至少具有“只读”访问 Cloud Storage API 来启用对存储图像所在的 Cloud Storage 的访问。有关更多信息,请查看更改实例的服务帐号和访问范围


谢谢!我刚刚发现了同样的事情,虽然我能够选择“设置API访问权限”,并仅启用“云平台”,这应该比启用所有云API的完全访问更安全。我不知道为什么现在需要这样做。我已经在GCP上使用相同版本的Kubernetes很长时间了,在此之前从未有过这种情况。 - user2344885
可能会有用的信息:“# Google建议使用具有云平台范围和通过IAM角色授予权限的自定义服务帐户。”:https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_node_pool(尽管我还没有找到来自Google的文档证明这一点,但看到这些文档会很好)。 - jamiet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接