为什么在此Kubernetes部署中出现ErrImagePull错误?

t5zmwmid  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(3)|浏览(735)

我正在尝试使用Minikube、Docker Registry和一个演示节点项目创建一个本地Kubernetes部署。
我做的第一件事是安装Docker v1.12.3,然后是Minikube v0.12.2。
然后我通过运行以下命令创建了一个Docker Registry容器(通过this tutorial,只运行下面的第一个命令)

docker run -d -p 5000:5000 --name registry registry:2

接下来,我运行以下minikube命令来创建本地kubernetes集群:

minikube start --vm-driver="virtualbox" --insecure-registry="0.0.0.0:5000"

我的项目结构如下所示:

.
├── Dockerfile
└── server.js

我的Dockerfile看起来像这样:

FROM node:7.1.0
EXPOSE 8080
COPY server.js .
CMD node server.js

然后,我构建了自己的Docker映像,并将其推送到我的私人存储库中:

docker build -t hello-node .
docker tag hello-node localhost:5000/hello-node
docker push localhost:5000/hello-node

然后,我尝试使用以下命令运行部署:

kubectl run hello-node --image=localhost:5000/hello-node --port=8888

但我得到了这个:

sudo kubectl get pods --all-namespaces                                                                                                                             
NAMESPACE     NAME                          READY     STATUS         RESTARTS   AGE
default       hello-node-3745105022-gzs5a   0/1       ErrImagePull   0          11m
kube-system   kube-addon-manager-minikube   1/1       Running        4          10d
kube-system   kube-dns-v20-2x64k            3/3       Running        12         10d
kube-system   kubernetes-dashboard-mjpjv    1/1       Running        4          10d

我想我可能错过了某种Docker注册认证,但当我在谷歌上搜索时,我找不到我理解的东西。有人能给我指出正确的方向吗?

编辑

在使用ssh访问kubernetes VM上的bash并使用以下命令从我的私有注册表中提取hello-node映像后:

minikube ssh
Boot2Docker version 1.11.1, build master : 901340f - Fri Jul  1 
22:52:19 UTC 2016
Docker version 1.11.1, build 5604cbe
docker@minikube:~$ sudo docker pull localhost:5000/hello-node
Using default tag: latest
Pulling repository localhost:5000/hello-node
Error while pulling image: Get http://localhost:5000/v1/repositories/hello-node/images: dial tcp 127.0.0.1:5000: getsockopt: connection refused

localhost:5000是否是在kubernetes主机虚拟机中使用的正确地址?

hc8w905p

hc8w905p1#

看起来您是在主机上运行注册表,但实际上,您需要在VM内部运行注册表。您可以通过在shell中首先运行此命令eval $(minikube docker-env),将Docker客户端指向minikube VM内部的Docker守护进程。
然后,您可以在主机上运行docker build命令,但它将在虚拟机内部进行构建。
实际上,如果您的目标只是运行映像的本地版本,您应该运行eval $(minikube docker-env)以指向VM中的docker守护进程,并在pod YAML中设置imagePullPolicy: IfNotPresent。然后,kubernetes将使用本地构建的映像(如果可用)。

k5ifujac

k5ifujac2#

有一个同样的问题与Docker-Desktop > Kubernetes,我试图设置imagePullPolicyNever,它只是工作。
正如我从kubectl describe pod mypd中了解到的,Kubectl试图拉取映像,当然,远程服务器上不存在此映像,因此失败。
上述属性将避免连接到注册表,并将使用来自Docker本Map像缓存的图像。

spec:
  template:
    spec:
      containers:
        - image: my/local-image
          imagePullPolicy: Never
c6ubokkw

c6ubokkw3#

这篇文章解决了我的类似错误https://medium.com/swlh/how-to-run-locally-built-docker-images-in-kubernetes-b28fbc32cc1d
imagePullPolicy: Never相加

spec:
  template:
    metadata:
      name: hello-world-pod
    spec:
      containers:
      - name: hello-world
        image: forketyfork/hello-world
        imagePullPolicy: Never
      restartPolicy: Never

然后将本地容器注册表链接到minikube docker容器注册表。
运行以下命令:
eval $(minikube -p minikube docker-env)
现在再次构建您的Docker映像和kubectl服务,就是这样!

相关问题