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



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

run-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

为什么我得到图像拉回 ??

默认情况下,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 注册表进行设置会更快、更容易。

一个可能导致ImagePullBackOff的问题,尤其是在从私有注册表中提取时,如果 Pod 未配置私有注册表的imagePullSecret

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

我遇到了同样的问题,导致它的原因是我已经通过 .yml 文件从 docker 映像创建了一个 pod,但是我输入了错误的名称,即 test-app:1.0.1 当我需要 test-app:1.0.2 时在我的 .yml 文件中。所以我kubectl delete pods --all移除有故障的 pod,然后重做kubectl create -f name_of_file.yml解决了我的问题。

您也可以

在容器的规范中指定imagePullPolicy: Never

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

当映像不存在集群并且 k8s 引擎将拉取相应的注册表时,会出现此问题。k8s 引擎支持上述 3 种类型的 ImagePullPolicy

    始终
  1. :无论图像如何更改,它始终将图像拉取到容器中
  2. 从不:它永远不会在容器上拉取新映像
  3. 如果
  4. 不存在 :如果图像不存在,它将在集群中拉取新图像。

最佳实践:始终建议在 docker 文件和 k8s 部署文件中标记新映像。以便它可以在容器中拉取新映像。

我也遇到了这个问题,当我检查我从私有注册表中提取的图像被删除时如果我们描述 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

调试步骤:
kubectl get pod [name] -o yaml

运行此命令以获取 pod 的 YAML 配置(获取已部署的 Kubernetes 服务的 YAML?就我而言,它位于本节下:

状态:
等待:消息:"rpc 错误:代码 = 未知 desc = 来自守护程序的错误响应:获取https://repository:9999/v2/abc/location/image/manifests/tag:未经授权:BAD_CREDENTIAL'
原因:ErrImagePull

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

默认拉取策略是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

找到部署的容器(使用 kubectl get pods (,然后使用 kubectl describe pod 了解有关容器的更多信息。

在将适当的标签添加到我想从 DockerHub 中提取的图像时,我的问题得到了解决。

以前:

containers:
      - name: nginx
        image: alex/my-app-image

更正版本:

containers:
      - name: nginx
        image: alex/my-app-image:1.1

该映像只有一个版本,即 1.1。由于我最初跳过了它,它引发了一个错误。

正确提及版本后,它工作正常!!

对我来说,

我登录到 docker 私有注册表并尝试拉取公共映像,因此尝试docker logout为我解决了这个问题。

因此,您还可以验证正在使用的映像(无论是公共映像还是私有映像(,然后尝试docker logindocker logout

在具有

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

所以我停止了minikube,并分配了4096-6144GB之间的某个地方。之后工作正常,所有豆荚都在运行!

我不知道这是否可以在每种情况下确定问题。但是只要看看分配给minikube的内存和磁盘。

我遇到了同样的问题。

imagePullBackOff 意味着它无法从注册表中提取 docker 映像或注册表冒烟问题。

解决方案如下。

1.  Check you image registry name.
2.  check image pull secrets.
3.  check image is present with same tag or name.
4.  check you registry is working. 

ImagepullBackoff mesns 你没有在你的 yaml 中传递 secret 或 secret 是错误的,可能是你的图像名称是错误的。

如果您从私有注册表中提取映像,则必须提供映像拉取机密,然后它将能够拉取映像。

在部署 Pod 之前,您还需要创建 Secrete。 您可以使用以下命令创建 secrete。

 kubectl create secret docker-registry regcred --docker-server=artifacts.exmple.int --docker-username=<username> --docker-password=<password> -n <namespace>

您可以在 YAML 中传递机密,如下所示。

 imagePullSecrets:
 - name: regcred
我在

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

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

我遇到了同样的问题。

[mayur@mayur_cloudtest ~]$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
nginx-598b589c46-zcr5d   0/1     ImagePullBackOff    0          6m21s

后来我发现创建 pod 的 docker 正在使用一个私有的镜像注册表,而 Nginx 并不在其中。

我已将 docker 注册表更改为默认值并重新加载了守护程序。发布该问题已解决。

[mayur@mayur_cloudtest ~]$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-598b589c46-7cbjf   1/1     Running   0          33s
[mayur@mayur_cloudtest ~]$
[mayur@mayur_cloudtest ~]$
[mayur@mayur_cloudtest ~]$ kubectl exec -it nginx-598b589c46-7cbjf -- /bin/bash
root@nginx-598b589c46-7cbjf:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
root@nginx-598b589c46-7cbjf:/#

就我而言,在更新到 MacOS Monterey 后,Kubernetes 无法与我在 localhost:5000 上运行的私人注册表进行通信。它以前运行良好。原因是Apple Airplay现在侦听端口5000。为了解决这个问题,我禁用了苹果Airplay接收器。

转到系统偏好设置>共享>禁用Airplay接收器的复选框。

来源链接: https://developer.apple.com/forums/thread/682332

要处理此错误,只需创建 Kubernetes 机密并在 manifest.yaml 文件中使用它

如果是私有存储库,则必须使用用户机密

要生成密钥 -

kubectl create secret docker-registry docker-secrets --docker-server=https://index.docker.io/v1/ --docker-username=ExamplaName --docker-password=ExamplePassword --docker-email=example@gmail.com
对于 --

docker-server,请使用 https://index.docker.io/v1/

apiVersion: v1
kind: Pod
metadata:
   name: test-pod
spec:
   containers:
   - name: test
     image: ExampleUsername/test:tagname
     ports:
     - containerPort: 3015
   imagePullSecrets:
   - name: docker-secrets

最新更新