Kubernetes容器上的ImagePullBackOff状态是什么意思?


69

我正在尝试在本地运行我的第一个kubernetes pod。我运行了以下命令(从此处开始):

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

顺便说一句: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?


1
aii您建立的私人图片吗?
Pixel Elephant

是的,aii,kafkazoo和ws是我的
ItayB

Answers:


38

默认情况下,Kubernetes在公共Docker注册表中查找图像。如果您的图像不存在,将无法拉出它。

您可以使用注册表集群插件运行本地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注册表进行设置会更快,更容易。


哇!谢谢!我明天会尝试并更新是否有效
ItayB

我已经尝试过docs.docker.com/registry/deploying(看起来更简单)-但是如何/在Kubernetes中设置注册表位置?
ItayB

我可以在本地使用Docker注册表吗?我应该在kubernetes中的某个地方配置它吗?我是否可以正确启动(使用上面的长命令)?
ItayB

11

ImagePullBackOff尤其是从私有注册表中拉出时,可能会导致的一个问题是,如果未使用私有注册表的Pod配置Pod imagePullSecret

身份验证错误可能会导致imagePullBackOff


如何检查该日志?
pseudozach '20

4
kubectl logs pod/pod-name -n <namespace>如果您的广告连播中包含1个以上的容器kubectl logs pod/pod-name -c container -n <namespace>
Margach Chris

2
另一种方式是kubectl get events -n <namespace>
Margach Chris

10

我遇到了同样的问题,导致该问题的原因是我已经通过.yml文件从docker映像创建了一个pod,但是当我需要test-app:1.0.2时,我输入了错误的名称,即test-app:1.0.1。在我的.yml文件中。因此,我确实kubectl delete pods --all删除了有问题的Pod,然后重新进行了处理kubectl create -f name_of_file.yml,从而解决了我的问题。


8

您还可以imagePullPolicy: Never在容器的规范中指定:

containers:
- name: nginx
  imagePullPolicy: Never
  image: custom-nginx
  ports:
  - containerPort: 80

5

当群集上不存在该映像并且k8s引擎将提取相应的注册表时,就会出现问题。k8s Engine启用了上述3种ImagePullPolicy

  1. 始终:始终将图像拉入容器中,无论图像是否更改
  2. 从不:从不将新图像拖到容器上
  3. IfNotPresent:如果图像不存在,它将在群集中拉出新图像。

最佳实践:始终建议在docker文件和k8s部署文件中标记新映像。这样它就可以将新图像拉入容器。


2

在具有2048GB内存的hyperv上使用minikube时,我遇到了类似的问题。我发现在HyperV管理器中,内存需求高于分配的需求。

因此,我停止了minikube,并分配了4096-6144GB之间的某个空间。之后一切正常,所有pod都运行了!

我不知道这能否在所有情况下都能解决问题。但是,只需查看分配给minikube的内存和磁盘即可。


2

我也遇到了这个问题,当我检查我从私人注册表中提取的映像时,该映像已被删除。

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


0

尽管有其他所有很棒的答案,但是直到我找到指出此更新图像的评论时,没有一个帮助我:

默认的拉取策略是IfNotPresent使kubelet跳过拉取已存在的图像。

那正是我想要的,但似乎没有用。

阅读进一步说:

如果您想始终强制拉动,则可以执行以下操作之一:

  • 省略imagePullPolicy:latest用作要使用的图像的标签。

当我替换latest为一个版本(已推送到minikube的Docker守护程序)时,它运行良好。

$ 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

(使用kubectl get podskubectl describe pod找到部署的容器,然后使用来在容器中查找更多信息。


-1

尝试创建时出现此错误replicationcontroller。问题是,我在模板定义中错误地拼写了Nginx图像名称。

注意:当kubernetes无法从存储库中提取指定的图像时,会发生此错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.