Was bedeutet der ImagePullBackOff-Status auf einem Kubernetes-Pod?

69

Ich versuche, meinen ersten Kubernetes-Pod lokal auszuführen. Ich habe den folgenden Befehl ausgeführt (von hier aus ):

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

Dann habe ich versucht, Folgendes auszuführen:

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

Wenn ich jetzt renne: kubectl get pods Ich bekomme:

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

Übrigens: docker imagesRückkehr:

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

Warum bekomme ich das ImagePullBackOff?

ItayB
quelle
1
Ist aiiein privates Image, das Sie erstellt haben?
Pixel Elephant
Ja, aii, kafkazoo und ws gehören mir
ItayB

Antworten:

37

Standardmäßig sucht Kubernetes in der öffentlichen Docker-Registrierung nach Bildern. Wenn Ihr Bild dort nicht vorhanden ist, kann es nicht abgerufen werden.

Sie können eine lokale Kubernetes-Registrierung mit dem Registrierungscluster-Addon ausführen .

Dann kennzeichnen Sie Ihre Bilder mit localhost:5000:

docker tag aii localhost:5000/dev/aii

Schieben Sie das Bild in die Kubernetes-Registrierung:

docker push localhost:5000/dev/aii

Und ändern Sie run-aii.yaml, um das localhost:5000/dev/aiiBild anstelle von zu verwenden aii. Jetzt sollte Kubernetes in der Lage sein, das Bild zu ziehen.

Alternativ können Sie eine private Docker-Registrierung über einen der Anbieter ausführen, die dies anbieten (AWS ECR, GCR usw.). Wenn dies jedoch für die lokale Entwicklung vorgesehen ist, ist die Einrichtung mit einer lokalen Kubernetes Docker-Registrierung schneller und einfacher.

Pixel Elefant
quelle
Beeindruckend! Vielen Dank! Ich werde es morgen versuchen und aktualisieren, wenn es funktioniert
ItayB
Ich habe docs.docker.com/registry/deploying ausprobiert (sieht einfacher aus) - aber wie / wo in Kubernetes kann ich meinen Registrierungsspeicherort festlegen?
ItayB
Kann ich die Docker-Registrierung (lokal) verwenden? soll ich es irgendwo in kubernetes konfigurieren? Starten Sie es richtig (mit dem langen Befehl oben)?
ItayB
11

Ein Problem, das ImagePullBackOffinsbesondere dann auftreten kann, wenn Sie aus einer privaten Registrierung abrufen, besteht darin, dass der Pod nicht mit dem imagePullSecretder privaten Registrierung konfiguriert ist .

Ein Authentifizierungsfehler kann eine imagePullBackOff.

Margach Chris
quelle
Wie kann man nach diesem Protokoll suchen?
Pseudozach
4
kubectl logs pod/pod-name -n <namespace>Wenn Sie mehr als 1 enthalten in der Hülsekubectl logs pod/pod-name -c container -n <namespace>
Margach Chris
2
Ein anderer Weg istkubectl get events -n <namespace>
Margach Chris
10

Ich hatte das gleiche Problem, das dazu führte, dass ich bereits einen Pod aus dem Docker-Image über die .yml-Datei erstellt hatte. Ich habe jedoch den Namen falsch eingegeben, dh Test-App: 1.0.1, als ich Test-App: 1.0.2 benötigte in meiner .yml Datei. Also habe ich kubectl delete pods --allden fehlerhaften Pod entfernt und dann den Fehler kubectl create -f name_of_file.ymlbehoben, der mein Problem gelöst hat.

user9200729
quelle
8

Sie können auch imagePullPolicy: Neverin der Containerspezifikation angeben :

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

Das Problem tritt auf, wenn das Image nicht im Cluster vorhanden ist und die k8s-Engine die entsprechende Registrierung abruft. Die k8s Engine ermöglicht drei Arten von ImagePullPolicy :

  1. Immer : Es zieht das Bild immer in den Container, unabhängig von Änderungen im Bild
  2. Niemals : Das neue Bild wird niemals auf den Container gezogen
  3. IfNotPresent : Das neue Bild wird im Cluster abgerufen, wenn das Bild nicht vorhanden ist.

Best Practices: Es wird immer empfohlen, das neue Image sowohl in der Docker-Datei als auch in der k8s-Bereitstellungsdatei zu kennzeichnen. Damit es das neue Bild in Container ziehen kann.

Sachin Mishra
quelle
2

Ich hatte ein ähnliches Problem bei der Verwendung von Minikube über Hyperv mit 2048 GB Speicher. Ich habe festgestellt, dass im HyperV-Manager der Speicherbedarf höher als zugewiesen war.

Also habe ich minikube gestoppt und irgendwo zwischen 4096-6144GB zugewiesen. Danach hat es gut funktioniert, alle Pods liefen!

Ich weiß nicht, ob dies das Problem in jedem Fall lösen kann. Aber schauen Sie sich nur den Speicher und die Festplatte an, die dem Minikube zugeordnet sind.

Ranvir
quelle
2

Ich hatte auch dieses Problem, als ich überprüfte, dass das Bild, das ich aus einer privaten Registrierung gezogen habe, entfernt wurde. Wenn wir den Pod beschreiben, wird das Pulling-Ereignis und das Bild angezeigt, das es zu ziehen versucht

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

Nithya
quelle
0

Trotz all der anderen tollen Antworten half mir keiner, bis ich einen Kommentar fand, der auf diese Aktualisierung der Bilder hinwies :

Die Standard-Pull-Richtlinie IfNotPresentbewirkt, dass das Kubelet das Abrufen eines Bildes überspringt, wenn es bereits vorhanden ist.

Genau das wollte ich, schien aber nicht zu funktionieren.

Das Lesen sagte weiter folgendes:

Wenn Sie immer einen Zug erzwingen möchten, können Sie einen der folgenden Schritte ausführen:

  • Lassen Sie das weg imagePullPolicyund verwenden Sie es :latestals Tag für das zu verwendende Bild.

Als ich durch latesteine Version ersetzt habe (die ich auf den Docker-Daemon von minikube übertragen hatte), hat es gut funktioniert.

$ 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

Suchen Sie den Pod der Bereitstellung (mit kubectl get pods) und verwenden Sie ihn kubectl describe pod, um mehr über den Pod zu erfahren.

Jacek Laskowski
quelle
-1

Ich hatte diesen Fehler, als ich versuchte, eine zu erstellen replicationcontroller. Das Problem war, dass ich den Nginx-Bildnamen in der Vorlagendefinition falsch geschrieben habe.

Hinweis : Dieser Fehler tritt auf, wenn kubernetes das angegebene Image nicht aus dem Repository abrufen kann.

Naveen Sadasivam
quelle