为什么我在此 Kubernetes 部署中收到 ErrImagePull 错误?
Why am I getting an ErrImagePull error in this Kubernetes deployment?
我正在尝试使用 Minikube、Docker 注册表和演示节点项目创建本地 Kubernetes 部署。
我做的第一件事是安装 Docker v1.12.3,然后是 Minikube v0.12.2。
然后我通过 运行ning 这个命令创建了一个 Docker 注册表容器(通过 this tutorial,仅 运行ning 下面的第一个命令)
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
我的 Docker 文件如下所示:
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 主机 VM 中使用的正确地址吗?
看起来您正在 运行在主机上安装注册表。实际上,您需要 运行 VM 内部的注册表。您可以先通过 运行 执行此命令,将您的 docker 客户端指向 minikube VM 内的 docker 守护程序
eval $(minikube docker-env)
在你的 shell.
然后,您可以在您的主机上运行 docker 构建命令,但它会在 VM 内构建。
事实上,如果您的目标只是 运行 图像的本地版本,您应该 运行 eval $(minikube docker-env)
指向 docker 守护进程您的 VM,并在您的 pod YAML 中设置 imagePullPolicy: IfNotPresent
。然后,kubernetes 将使用本地构建的镜像(如果可用)。
与 Docker-Desktop > Kubernetes
有同样的问题,我尝试将 imagePullPolicy
设置为 Never
,它成功了。
正如我从 kubectl describe pod mypd
了解到的,Kubectl
试图拉取图像,当然这个图像不存在于远程服务器上,因此失败。
以上 属性 将避免连接到注册表,并将使用来自 docker 本地图像缓存的图像。
spec:
template:
spec:
containers:
- image: my/local-image
imagePullPolicy: Never
我正在尝试使用 Minikube、Docker 注册表和演示节点项目创建本地 Kubernetes 部署。
我做的第一件事是安装 Docker v1.12.3,然后是 Minikube v0.12.2。
然后我通过 运行ning 这个命令创建了一个 Docker 注册表容器(通过 this tutorial,仅 运行ning 下面的第一个命令)
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
我的 Docker 文件如下所示:
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 主机 VM 中使用的正确地址吗?
看起来您正在 运行在主机上安装注册表。实际上,您需要 运行 VM 内部的注册表。您可以先通过 运行 执行此命令,将您的 docker 客户端指向 minikube VM 内的 docker 守护程序
eval $(minikube docker-env)
在你的 shell.
然后,您可以在您的主机上运行 docker 构建命令,但它会在 VM 内构建。
事实上,如果您的目标只是 运行 图像的本地版本,您应该 运行 eval $(minikube docker-env)
指向 docker 守护进程您的 VM,并在您的 pod YAML 中设置 imagePullPolicy: IfNotPresent
。然后,kubernetes 将使用本地构建的镜像(如果可用)。
与 Docker-Desktop > Kubernetes
有同样的问题,我尝试将 imagePullPolicy
设置为 Never
,它成功了。
正如我从 kubectl describe pod mypd
了解到的,Kubectl
试图拉取图像,当然这个图像不存在于远程服务器上,因此失败。
以上 属性 将避免连接到注册表,并将使用来自 docker 本地图像缓存的图像。
spec:
template:
spec:
containers:
- image: my/local-image
imagePullPolicy: Never