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

Nat*_*nes 27 docker kubernetes docker-registry

我正在尝试使用Minikube,Docker Registry和演示节点项目创建本地Kubernetes部署.

我做的第一件事是安装Docker v 1.12.3,然后安装Minikube v0.12.2.

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

docker run -d -p 5000:5000 --name registry registry:2
Run Code Online (Sandbox Code Playgroud)

接下来,我运行了这个minikube命令来创建一个本地kubernetes集群:

minikube start --vm-driver="virtualbox" --insecure-registry="0.0.0.0:5000"
Run Code Online (Sandbox Code Playgroud)

我的项目结构如下所示:

.
??? Dockerfile
??? server.js
Run Code Online (Sandbox Code Playgroud)

我的Dockerfile看起来像这样:

FROM node:7.1.0
EXPOSE 8080
COPY server.js .
CMD node server.js
Run Code Online (Sandbox Code Playgroud)

然后我构建了自己的docker镜像并将其推送到我的私有存储库:

docker build -t hello-node .
docker tag hello-node localhost:5000/hello-node
docker push localhost:5000/hello-node
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用此命令运行部署:

kubectl run hello-node --image=localhost:5000/hello-node --port=8888
Run Code Online (Sandbox Code Playgroud)

但后来我明白了:

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
Run Code Online (Sandbox Code Playgroud)

我想我可能会错过某种docker注册表身份验证,但是当我在Google上搜索时,我找不到我理解的东西.有人可以指点我正确的方向吗?

编辑

使用ssh访问bashkubernetes VM并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
Run Code Online (Sandbox Code Playgroud)

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

小智 34

看起来您正在主机上运行注册表.实际上,您需要在VM中运行注册表.您可以通过先 eval $(minikube docker-env) 在shell中运行此命令,将docker客户端指向minikube VM内的docker守护程序 .

然后,您可以在主机上运行docker build命令,但它将在VM内部构建.

实际上,如果您的目标是简单地运行映像的本地版本,则应运行eval $(minikube docker-env)指向VM中的docker守护程序,并imagePullPolicy: IfNotPresent在您的pod中设置YAML.然后,kubernetes将使用本地构建的图像(如果可用).

  • Windows PowerShell 等效项是什么? (4认同)
  • 我遇到这个问题时,我的想法与@user3335999 相同。稍微挖掘一下,Windows 10 的等效项是 `minikube docker-env | 调用表达式`。来源:[此网页](https://medium.com/@maumribeiro/running-your-own-docker-images-in-minikube-for-windows-ea7383d931f6) (4认同)

JSS*_*JSS 9

有同样的问题Docker-Desktop > Kubernetes,我尝试设置imagePullPolicyNever,它就工作了。

据我了解kubectl describe pod mypdKubectl正在尝试提取图像,当然该图像在远程服务器上不存在,因此失败。

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

spec:
  template:
    spec:
      containers:
        - image: my/local-image
          imagePullPolicy: Never
Run Code Online (Sandbox Code Playgroud)