kubectl获取pods - kubectl获取pods - 状态ImagePullBackOff

时间:2016-05-18 14:36:43

标签: docker kubernetes

我正试图在本地运行我的第一个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 ??

10 个答案:

答案 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

  1. 始终:始终将容器中的图像拉出,而不管图像中的变化如何
  2. 从不:它将永远不会将新图像拖到容器上
  3. IfNotPresent :如果图像不存在,它将在群集中拉出新图像。

最佳实践:始终建议在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无法从存储库中提取指定的图像时,会发生此错误。