为什么我在此 Kubernetes 部署中收到 ErrImagePull 错误?

问题描述 投票:0回答:4

我正在尝试使用 Minikube、Docker 注册表和演示节点项目创建本地 Kubernetes 部署。

我做的第一件事是安装 Docker v1.12.3,然后安装 Minikube v0.12.2。

然后我通过运行此命令创建了一个 Docker 注册表容器(通过本教程,仅运行下面的第一个命令)

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 主机虚拟机中使用的正确地址吗?

docker kubernetes docker-registry
4个回答
57
投票

看起来您正在主机上运行注册表。事实上,您需要在虚拟机内运行注册表。您可以先运行此命令,将 docker 客户端指向 minikube VM 内的 docker 守护进程


eval $(minikube docker-env)
在你的壳里。

然后,您可以在主机上运行 docker build 命令,但它将在虚拟机内构建。

事实上,如果您的目标只是运行镜像的本地版本,您应该运行

eval $(minikube docker-env)
以指向虚拟机中的 docker 守护进程,并在 pod YAML 中设置
imagePullPolicy: IfNotPresent
。然后,kubernetes 将使用本地构建的镜像(如果可用)。


6
投票

Docker-Desktop > Kubernetes
有同样的问题,我尝试将
imagePullPolicy
设置为
Never
,它就成功了。

据我从

kubectl describe pod mypd
了解到,
Kubectl
正在尝试拉取图像,当然该图像在远程服务器上不存在,因此失败。

上述属性将避免连接到注册表,并将使用 docker 本地图像缓存中的图像。

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

2
投票

这篇文章解决了我类似的错误 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 服务 ,就是这样!


0
投票

对于 minikube,请按照以下步骤操作

  1. 使用
    pullPolicy: IfNotPresent
  2. 更新values.yaml
  3. 使用
    minikube image load
  4. 在 minikube 中手动上传图像
  5. 验证图像是否在 minikube vm 中使用 ssh 上传
  6. 卸载并重新安装现有部署。您可以使用
    kubectl get deployment -w
  7. 查看现有的部署
© www.soinside.com 2019 - 2024. All rights reserved.