kubernetes GKE集群的一个节点无法从dockerhub拉取镜像

sshcrbum  于 2023-05-28  发布在  Kubernetes
关注(0)|答案(2)|浏览(184)

这是一件很麻烦的事。
我创建了一个私有GKE集群,节点池为3个节点。然后我有一个副本集与3豆荚。这些Pod中的一些将被调度到一个节点。
所以其中一个pod总是得到ImagePullBackOff,我检查错误

Failed to pull image "bitnami/mongodb:3.6": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

并且调度到其余两个节点的Pod工作良好。
我ssh到那个节点,运行docker pull,一切正常。我无法找到解决此错误的其他方法。
我尝试draindelete该节点,并让集群重新创建该节点。但还是不行
请帮帮我
更新:根据GCP文档,它将无法从Docker Hub中提取图像。
但最奇怪的是,只有一个节点无法提取图像。

mznpcxlj

mznpcxlj1#

Kubernetes 1.11中报告了一个相关的错误
确保这不是你的案子

vof42yt1

vof42yt12#

我记得以前见过这个,以前也找到过答案。
https://cloud.google.com/container-registry/docs/pulling-cached-images
我只是稍微谈了一下,但我会解释一下,这样就容易理解了。
如果我启动一个私有GKE集群并创建3个部署:

  • 第1次使用图像:nginx:最新
  • 第二次使用图像:nginx:stable
  • 第3次使用图像:docker.io/busybox:1.36.0-glibc

nginx:latest(common tag)几乎总是有效
nginx:stable(popular tag)有时会工作
超级特定标记(很少使用的标记)几乎总是会在ImagePullBackOff中失败

为什么会这样?
1. Pod/节点无NAT网关/无Internet访问时会发生ImagePullBackOff

kubectl exec -it working-nginx-latest-pod -- curl yahoo.com
^--你可以证明没有互联网与此,注意curl google.com是一个坏的测试GKE,因为它仍然可以通过谷歌的内部网络/你会得到一个响应,因为谷歌的网络可以达到google.com无需通过互联网,这就是为什么我建议测试与非谷歌的网址如yahoo.com
(Google的网络偶尔也会做一些违反直觉/非标准的事情,比如通过内部网络路由公共IP地址,所以有时你可以访问公共IP地址w/o互联网接入,通常是Google服务的公共IP有时可以访问w/o互联网接入。

2.所以下一个问题是,但等待...当没有互联网接入时,nginx:latestnginx:stable如何能够拉取互联网/Docker Hub上存在的图像?基本上,为什么它对某些图像有效而对其他图像无效?

答案归结为图像的流行程度:标签对。它是否足够流行,可以缓存在www.example.com中mirror.gcr.io?
我在顶部分享的初始链接提到“Container Registry在www.example.com上缓存经常访问的公共Docker Hub镜像mirror.gcr.io”,所以基本上如果你引用一个流行镜像的公共标签,你有时甚至可以幸运地在没有互联网的情况下提取它,该高速缓存可以通过私有IP空间/没有互联网访问访问。
当运行在GKE私有集群上的pod给你ImagePullBackOff时,你会想,这是怎么回事?我知道这个图像是存在的!docker pull docker.io/busybox:1.36.0-glibc从我的本地机器上拉得很好,发生的事情是很少使用的标签不存在于他们的缓存中,这反映了流行图像的常见标签。
最好的解决方法是从pkg.dev(GCP的Artifact Registry,GKE应该能够访问w/o Internet访问)中提取所有映像,或者设置NAT网关/确保私有集群可以访问Internet。您可以使用kubectl exec -it working-nginx-latest-pod -- curl yahoo.com作为反馈循环,以检查集群是否具有Internet访问,同时修补VPC设置以添加NAT GW。
https://cloud.google.com/kubernetes-engine/docs/best-practices/networking#use-cloudnat
默认情况下,(GKE)“私有集群没有互联网访问。为了让Pod能够上网,请为每个地域开启云NAT。GKE子网中的主网段和辅网段至少要启用云NAT。”

相关问题