我正试图在本地运行我的第一个kubernetes pod。 我运行了以下命令(来自here):
export ARCH=amd64
docker run -d \
--volume=/:/rootfs:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:rw \
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
--volume=/var/run:/var/run:rw \
--net=host \
--pid=host \
--privileged \
gcr.io/google_containers/hyperkube-${ARCH}:${K8S_VERSION} \
/hyperkube kubelet \
--containerized \
--hostname-override=127.0.0.1 \
--api-servers=http://localhost:8080 \
--config=/etc/kubernetes/manifests \
--cluster-dns=10.0.0.10 \
--cluster-domain=cluster.local \
--allow-privileged --v=2
然后,我试图运行以下内容:
kubectl create -f ./run-aii.yaml
生成-aii.yaml:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: aii
spec:
replicas: 2
template:
metadata:
labels:
run: aii
spec:
containers:
- name: aii
image: aii
ports:
- containerPort: 5144
env:
- name: KAFKA_IP
value: kafka
volumeMounts:
- mountPath: /root/script
name: scripts-data
readOnly: true
- mountPath: /home/aii/core
name: core-aii
readOnly: true
- mountPath: /home/aii/genome
name: genome-aii
readOnly: true
- mountPath: /home/aii/main
name: main-aii
readOnly: true
- name: kafka
image: kafkazoo
volumeMounts:
- mountPath: /root/script
name: scripts-data
readOnly: true
- mountPath: /root/config
name: config-data
readOnly: true
- name: ws
image: ws
ports:
- containerPort: 3000
volumes:
- name: scripts-data
hostPath:
path: /home/aii/general/infra/script
- name: config-data
hostPath:
path: /home/aii/general/infra/config
- name: core-aii
hostPath:
path: /home/aii/general/core
- name: genome-aii
hostPath:
path: /home/aii/general/genome
- name: main-aii
hostPath:
path: /home/aii/general/main
现在,当我跑步时:kubectl get pods
我得到了:
NAME READY STATUS RESTARTS AGE
aii-806125049-18ocr 0/3 ImagePullBackOff 0 52m
aii-806125049-6oi8o 0/3 ImagePullBackOff 0 52m
aii-pod 0/3 ImagePullBackOff 0 23h
k8s-etcd-127.0.0.1 1/1 Running 0 2d
k8s-master-127.0.0.1 4/4 Running 0 2d
k8s-proxy-127.0.0.1 1/1 Running 0 2d
nginx-198147104-9kajo 1/1 Running 0 2d
BTW:docker images
返回:
REPOSITORY TAG IMAGE ID CREATED SIZE
ws latest fa7c5f6ef83a 7 days ago 706.8 MB
kafkazoo latest 84c687b0bd74 9 days ago 697.7 MB
aii latest bd12c4acbbaf 9 days ago 1.421 GB
node 4.4 1a93433cee73 11 days ago 647 MB
gcr.io/google_containers/hyperkube-amd64 v1.2.4 3c4f38def75b 11 days ago 316.7 MB
nginx latest 3edcc5de5a79 2 weeks ago 182.7 MB
docker_kafka latest e1d954a6a827 5 weeks ago 697.7 MB
spotify/kafka latest 30d3cef1fe8e 12 weeks ago 421.6 MB
wurstmeister/zookeeper latest dc00f1198a44 3 months ago 468.7 MB
centos latest 61b442687d68 4 months ago 196.6 MB
centos centos7.2.1511 38ea04e19303 5 months ago 194.6 MB
gcr.io/google_containers/etcd 2.2.1 a6cd91debed1 6 months ago 28.19 MB
gcr.io/google_containers/pause 2.0 2b58359142b0 7 months ago 350.2 kB
sequenceiq/hadoop-docker latest 5c3cc170c6bc 10 months ago 1.766 GB
为什么我会得到ImagePullBackOff ??
答案 0 :(得分:19)
默认情况下,Kubernetes会在公共Docker注册表中查找图像。如果您的图像不存在,则无法将其拉出。
您可以使用registry cluster addon运行本地Kubernetes注册表。
然后使用localhost:5000
标记您的图片:
docker tag aii localhost:5000/dev/aii
将图像推送到Kubernetes注册表:
docker push localhost:5000/dev/aii
并更改run-aii.yaml以使用localhost:5000/dev/aii
图片而不是aii
。现在Kubernetes应该能够提取图像。
或者,您可以通过其中一个提供此功能的提供程序(AWS ECR,GCR等)运行私有Docker注册表,但如果这是用于本地开发,则可以更快速,更轻松地使用本地Kubernetes进行设置Docker注册表。
答案 1 :(得分:4)
我遇到了同样的问题,因为我已经通过.yml文件从docker镜像创建了一个pod,但是当我需要test-app时,我错误输入了名称,即test-app:1.0.1: 1.0.2在我的.yml文件中。所以我做kubectl delete pods --all
删除了有问题的pod,然后重新编译kubectl create -f name_of_file.yml
解决了我的问题。
答案 2 :(得分:4)
当群集上不存在映像并且k8s引擎将提取相应的注册表时,就会出现问题。 k8s Engine启用了提到的3种 ImagePullPolicy :
最佳实践:始终建议在docker文件和k8s部署文件中标记新映像。这样它就可以将新图像拉入容器。
答案 3 :(得分:3)
一个可能导致ImagePullBackOff
的问题尤其是如果您是从私有注册表中提取的,则是在pod中没有配置私有注册表的imagePullSecret
。
身份验证错误可能会导致imagePullBackOff
。
答案 4 :(得分:2)
我也遇到了这个问题,当我检查我从私人注册表中提取的图像时,该图像已被删除 如果我们描述pod,它将显示拉动事件和它试图拉动的图像
kubectl describe pod <POD_NAME>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 18h (x35 over 20h) kubelet, gsk-kub Pulling image "registeryName:tag"
Normal BackOff 11m (x822 over 20h) kubelet, gsk-kub Back-off pulling image "registeryName:tag"
Warning Failed 91s (x858 over 20h) kubelet, gsk-kub Error: ImagePullBackOff
答案 5 :(得分:1)
尽管有所有其他很棒的答案,但直到我发现一条评论指出了这一点Updating images 之前,都没有帮助我:
<块引用>默认的拉取策略是 IfNotPresent
,这会导致 kubelet 跳过拉取已经存在的图像。
这正是我想要的,但似乎不起作用。
进一步阅读如下:
<块引用>如果您想始终强制拉动,可以执行以下操作之一:
imagePullPolicy
并使用 :latest
作为要使用的图像的标记。当我用一个版本(我已经推送到 minikube 的 Docker 守护程序)替换 latest
时,它运行良好。
$ kubectl create deployment presto-coordinator \
--image=warsaw-data-meetup/presto-coordinator:beta0
deployment.apps/presto-coordinator created
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
presto-coordinator 1/1 1 1 3s
查找部署的 pod(使用 kubectl get pods
)并使用 kubectl describe pod
查找有关 pod 的更多信息。
答案 6 :(得分:1)
向我想从 DockerHub 拉取的映像添加适当的标签后,我的问题得到了解决。
以前:
containers:
- name: nginx
image: alex/my-app-image
更正版本:
containers:
- name: nginx
image: alex/my-app-image:1.1
该镜像只有一个版本,即 1.1。因为我一开始跳过了,所以它抛出了一个错误。
正确提及版本后,效果很好!!
答案 7 :(得分:0)
在具有2048GB内存的hyperv上使用minikube时,我遇到了类似的问题。 我发现在HyperV管理器中,内存需求高于分配的需求。
因此,我停止了minikube,并分配了4096-6144GB之间的某个空间。之后一切正常,所有pod都在运行!
我不知道这能否在每种情况下都能解决问题。但是,只需查看分配给minikube的内存和磁盘即可。
答案 8 :(得分:0)
您还可以在容器的规范中指定options.map
:
imagePullPolicy: Never
答案 9 :(得分:-1)
尝试创建replicationcontroller
时遇到此错误。问题是,我在模板定义中错误地拼写了Nginx图像名称。
注意:当kubernetes无法从存储库中提取指定的图像时,会发生此错误。