在Minikube上尝试从Docker Hub拉取/运行Docker镜像失败

9

我对Kubernetes非常新,并且之前已经使用过Docker。 我正在尝试实现以下内容:

  1. 启动Minikube
  2. 使用Kube-ctl从docker hub启动docker镜像

我已经启动了minikube,一切看起来都在运行中,然后我执行了以下命令:

kubectl run nginx --image=nginx(请注意,我在我的机器上没有此镜像,并且我希望k8为我获取它)

现在,当我这样做时,它会启动pod,但状态为 ImagePullBackOff 。 所以我在其上运行了 kubectl describe pod 命令,结果如下所示:

Events:
  Type     Reason     Age              From               Message
  ----     ------     ----             ----               -------
  Normal   Scheduled  8m               default-scheduler  Successfully assigned default/ngix-67c6755c86-qm5mv to minikube
  Warning  Failed     8m               kubelet, minikube  Failed to pull image "nginx": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.64.1:53: read udp 192.168.64.2:52133->192.168.64.1:53: read: connection refused
  Normal   Pulling    8m (x2 over 8m)  kubelet, minikube  Pulling image "nginx"
  Warning  Failed     8m (x2 over 8m)  kubelet, minikube  Error: ErrImagePull
  Warning  Failed     8m               kubelet, minikube  Failed to pull image "nginx": rpc error: code = Unknown desc = Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.64.1:53: read udp 192.168.64.2:40073->192.168.64.1:53: read: connection refused
  Normal   BackOff    8m (x3 over 8m)  kubelet, minikube  Back-off pulling image "nginx"
  Warning  Failed     8m (x3 over 8m)  kubelet, minikube  Error: ImagePullBackOff

然后我搜索了一下,看是否有人遇到过类似的问题,结果发现有些人确实遇到过,并通过重新启动minikube使用以下更多标志来解决它:

minikube start --vm-driver="xhyve" --insecure-registry="$REG_IP":80

当我在Minikube内部执行nslookup时,可以解析出以下信息:

Server:         10.12.192.22
Address:        10.12.192.22#53

Non-authoritative answer:
hub.docker.com  canonical name = elb-default.us-east-1.aws.dckr.io.
elb-default.us-east-1.aws.dckr.io       canonical name = us-east-1-elbdefau-1nlhaqqbnj2z8-140214243.us-east-1.elb.amazonaws.com.
Name:   us-east-1-elbdefau-1nlhaqqbnj2z8-140214243.us-east-1.elb.amazonaws.com
Address: 52.205.36.130
Name:   us-east-1-elbdefau-1nlhaqqbnj2z8-140214243.us-east-1.elb.amazonaws.com
Address: 3.217.62.246
Name:   us-east-1-elbdefau-1nlhaqqbnj2z8-140214243.us-east-1.elb.amazonaws.com
Address: 35.169.212.184

仍然没有运气。我在这里做错了什么吗?


你尝试过使用 docker pull nginx 手动拉取镜像吗?我认为问题在于你无法在你的环境中从 Docker Hub 拉取镜像。请更改另一个可以拉取镜像的注册表。 - wineinlib
1
错误信息提示minikube VM中运行的Docker守护程序无法解析registry-1.docker.io主机名,因为DNS名称服务器配置为使用用于DNS解析的DNS NameServer(192.168.64.1:53)拒绝连接。如果您执行minikube ssh,然后运行nslookup hub.docker.com,会得到什么结果? - Amit Kumar Gupta
我已经更新了我的问题,并附上了nslookup信息。 - Lost
1
对我来说,Docker守护程序试图通过位于“192.168.64.1”的名称服务器解析“registry-1.docker.io”很奇怪,但是当您在VM上进行“nslookup”时,它使用的是位于“10.12.192.22”的名称服务器。我在互联网上搜索了“minkube Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.64.1:53”,并发现有人发表了这个评论,似乎与您的问题相同,并且似乎特定于“xhyve”。 - Amit Kumar Gupta
@AmitKumarGupta,你的直觉是正确的。这是一个100%的XHyve问题。重新安装了minikube并配置它使用Virtual box,一切看起来都很好。如果你愿意,你可以把你的评论转换成一个答案。 - Lost
4个回答

6
该错误信息提示Docker守护程序在minikube VM中无法解析registry-1.docker.io主机名,因为DNS解析(使用192.168.64.1:53进行配置的DNS名称服务器)拒绝连接。我感到奇怪的是,Docker守护程序正在尝试通过位于192.168.64.1的名称服务器解析registry-1.docker.io,但是当您在VM上进行nslookup时,它在使用10.12.192.22的名称服务器。我在互联网上搜索了“minkube Get registry-1.docker.io/v2:dial tcp:lookup registry-1.docker.io on 192.168.64.1:53”,找到了一个问题,有人在此评论中提出相同的问题,并且似乎特定于xhyve。

该评论中的人说:

这个问题看起来像是xhyve问题,在virtualbox中没有看到。

还有

切换到virtualbox解决了我的问题。

我停止了minikube,删除了它,启动它而不使用--vm-driver=xhyve(minikube默认使用virtualbox驱动程序),然后docker build -t hello-node:v1 .正常工作,没有错误


5
在我的情况下,这是由于在我的Mac上使用Homebrew运行dns服务器dnsmasq导致minikube内部的DNS请求失败。停止使用dnsmasq后,一切正常。

你救了我的一天!我在 Fedora 33 上使用 Docker 作为驱动程序。也许防火墙也应该被禁用。 - Bastien Adam
还需要重新启动Mac。 - MarCrazyness

0

我在本地的minikube设置中遇到了问题,我无法拉取任何我添加到简单部署清单中的镜像。

$ kubectl get pods
NAME              READY   STATUS             RESTARTS   AGE
test1             0/1     ImagePullBackOff   0          68s

尝试执行以下测试:
apiVersion: v1
kind: Pod
metadata:
  name: test1
  labels:
    site: blog
spec:
  containers:
    - name: web
      image: nginx:latest

只有在重新启动minikube之后才能解决这个问题。 也许在这种情况下,dnsmasq确实是原因。


0

你已经完成了以下步骤:

  1. 使用默认设置运行minikube。
  2. 使用docker构建你的镜像。
  3. (*) 配置minikube指向你本地的docker镜像仓库。

但现在,minikube无法从公共的“容器”注册表(如docker hub)中拉取镜像。

停止并重新启动minikube,然后将其指向你本地的docker镜像仓库。执行此操作的命令(包括(*))如下:

minikube stop
minikube start
minikube -p minikube docker-env
eval $(minikube -p minikube docker-env)

自从运行上述命令后,我能够通过在yaml规范中设置image: alpine来从hub.docker.com拉取nginx、alpine和frens。

问题只是我的网络连接短暂中断。因此,如果您没有dns/vpn/xhyve的复杂情况,而它突然停止工作,修复起来就很容易。


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