Wie kann ich die Pod-Status-Fehler ErrImagePull und ImagePullBackoff in Amazon EKS beheben?

Lesedauer: 7 Minute
0

Mein Pod-Status für Amazon Elastic Kubernetes Service (Amazon EKS) hat den Status ErrImagePull oder ImagePullBackoff.

Kurzbeschreibung

Wenn Sie den kubectl-Befehl get pods ausführen und Ihre Pods den ImagePullBackOff-Status haben, werden die Pods nicht richtig ausgeführt. Der ImagePullBackOff-Status bedeutet, dass ein Container nicht gestartet werden konnte, weil ein Image nicht abgerufen werden konnte. Weitere Informationen finden Sie unter Amazon-EKS-Connector-Pods haben den ImagePullBackOff-Status.

In folgenden Fällen wird möglicherweise ein ImagePull-Fehler angezeigt:

  • Ein Image-Name, ein Tag oder ein Auszug sind falsch.
  • Für die Images sind Anmeldeinformationen erforderlich, um sich zu authentifizieren.
  • Es kann nicht auf das Registry zugegriffen werden.

Lösung

1. Überprüfen Sie den Pod-Status und die Fehlermeldung und stellen Sie sicher, dass der Image-Name, das Tag und der SHA korrekt sind

Um den Status eines Pods abzurufen, führen Sie den kubectl-Befehl get pods aus:

$ kubectl get pods -n default
NAME                              READY   STATUS             RESTARTS   AGE
nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s

Um die Details einer Pod-Fehlermeldung zu erhalten, führen Sie den kubectl-Befehl describe pod aus:

$ kubectl describe pod nginx-7cdbb5f49f-2p6p2

...
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  4m23s                 default-scheduler  Successfully assigned default/nginx-7cdbb5f49f-2p6p2 to ip-192-168-149-143.us-east-2.compute.internal
  Normal   Pulling    2m44s (x4 over 4m9s)  kubelet            Pulling image "nginxx:latest"
  Warning  Failed     2m43s (x4 over 4m9s)  kubelet            Failed to pull image "nginxx:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for nginxx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     2m43s (x4 over 4m9s)  kubelet            Error: ErrImagePull
  Warning  Failed     2m32s (x6 over 4m8s)  kubelet            Error: ImagePullBackOff
  Normal   BackOff    2m17s (x7 over 4m8s)  kubelet            Back-off pulling image "nginxx:latest"

$ kubectl describe pod nginx-55d75d5f56-qrqmp ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m20s default-scheduler Successfully assigned default/nginx-55d75d5f56-qrqmp to ip-192-168-149-143.us-east-2.compute.internal Normal Pulling 40s (x4 over 2m6s) kubelet Pulling image "nginx:latestttt" Warning Failed 39s (x4 over 2m5s) kubelet Failed to pull image "nginx:latestttt": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:latestttt not found: manifest unknown: manifest unknown Warning Failed 39s (x4 over 2m5s) kubelet Error: ErrImagePull Warning Failed 26s (x6 over 2m5s) kubelet Error: ImagePullBackOff Normal BackOff 11s (x7 over 2m5s) kubelet Back-off pulling image "nginx:latestttt" Stellen Sie sicher, dass Ihr Image-Tag und Name existieren und korrekt sind. Wenn für das Image-Registry eine Authentifizierung erforderlich ist, stellen Sie sicher, dass Sie berechtigt sind, darauf zuzugreifen. Führen Sie den folgenden Befehl aus, um zu überprüfen, ob das im Pod verwendete Image korrekt ist:

$ kubectl get pods nginx-7cdbb5f49f-2p6p2  -o jsonpath="{.spec.containers[*].image}" | \sort

nginxx:latest

Informationen zu den Pod-Statuswerten finden Sie unter Pod-Phase auf der Kubernetes-Website.

Weitere Informationen finden Sie unter Wie kann ich die Pod-Status-Fehler in Amazon EKS beheben?

2. Images von Amazon Elastic Container Registry (Amazon ECR)

Wenn Sie versuchen, mithilfe von Amazon EKS Images aus Amazon ECR abzurufen, ist möglicherweise eine zusätzliche Konfiguration erforderlich. Wenn Ihr Image in einer privaten Amazon-ECR-Registry gespeichert ist, stellen Sie sicher, dass Sie die Anmeldeinformationen imagePullSecrets auf dem Pod angeben. Diese Anmeldeinformationen werden verwendet, um sich bei dem privaten Registry zu authentifizieren.

Erstellen Sie ein Secret namens regcred:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

Achten Sie darauf, die folgenden Anmeldeinformationen zu ersetzen:

  • <your-registry-server> ist Ihr privates Docker-Registry-FQDN. Verwenden Sie https://index.docker.io/v1/ für DockerHub.
  • <your-name> ist Ihr Docker-Benutzername.
  • <your-pword> ist Ihr Docker-Passwort.
  • <your-email> ist Ihre Docker-E-Mail.

Sie haben Ihre Docker-Anmeldeinformationen im Cluster erfolgreich als Secret mit dem Namen regcred eingerichtet.

Um den Inhalt des regcred-Secret zu verstehen, schauen Sie sich das Secret im YAML-Format an:

kubectl get secret regcred --output=yaml

Im folgenden Beispiel benötigt ein Pod Zugriff auf Ihre Docker-Anmeldeinformationen in regcred:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

Ersetzen Sie your.private.registry.example durch den Pfad zu einem Image in einem privaten Registry, das dem folgenden ähnelt:

your.private.registry.example.com/bob/bob-private:v1

Um das Image aus dem privaten Registry abzurufen, benötigt Kubernetes die Anmeldeinformationen. Das Feld imagePullSecrets in der Konfigurationsdatei gibt an, dass Kubernetes die Anmeldeinformationen von einem Secret namens regcred abrufen muss.

Weitere Optionen zum Erstellen eines Secrets finden Sie unter Erstellen eines Pods, der ein Secret verwendet, um ein Image auf der Kubernetes-Website abzurufen.

3. Registry-Fehlerbehebung

Im folgenden Beispiel ist das Registry aufgrund eines Netzwerkverbindungsproblems nicht zugänglich, da kubelet den privaten Registry-Endpunkt nicht erreichen kann:

$ kubectl describe pods nginx-9cc69448d-vgm4m

...
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  16m                default-scheduler  Successfully assigned default/nginx-9cc69448d-vgm4m to ip-192-168-149-143.us-east-2.compute.internal
  Normal   Pulling    15m (x3 over 16m)  kubelet            Pulling image "nginx:stable"
  Warning  Failed     15m (x3 over 16m)  kubelet            Failed to pull image "nginx:stable": rpc error: code = Unknown desc = Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  Warning  Failed     15m (x3 over 16m)  kubelet            Error: ErrImagePull
  Normal   BackOff    14m (x4 over 16m)  kubelet            Back-off pulling image "nginx:stable"
  Warning  Failed     14m (x4 over 16m)  kubelet            Error: ImagePullBackOff

Der Fehler „Image konnte nicht abgerufen werden ...“ bedeutet, dass Kubelet versucht hat, eine Verbindung zum Docker-Registry-Endpunkt herzustellen, und dies aufgrund eines Verbindungs-Timeouts fehlgeschlagen ist.

Um diesen Fehler zu beheben, überprüfen Sie Ihr Subnetz, Ihre Sicherheitsgruppen und Ihre Netzwerk-ACL, die die Kommunikation mit dem angegebenen Registry-Endpunkt ermöglichen.

Im folgenden Beispiel wurde das Registry-Ratenlimit überschritten:

$ kubectl describe pod nginx-6bf9f7cf5d-22q48

...
Events:
  Type     Reason                  Age                   From               Message
  ----     ------                  ----                  ----               -------
  Normal   Scheduled               3m54s                 default-scheduler  Successfully assigned default/nginx-6bf9f7cf5d-22q48 to ip-192-168-153-54.us-east-2.compute.internal
  Warning  FailedCreatePodSandBox  3m33s                 kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "82065dea585e8428eaf9df89936653b5ef12b53bef7f83baddb22edc59cd562a" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Warning  FailedCreatePodSandBox  2m53s                 kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "20f2e27ba6d813ffc754a12a1444aa20d552cc9d665f4fe5506b02a4fb53db36" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Warning  FailedCreatePodSandBox  2m35s                 kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "d9b7e98187e84fed907ff882279bf16223bf5ed0176b03dff3b860ca9a7d5e03" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Warning  FailedCreatePodSandBox  2m                    kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "c02c8b65d7d49c94aadd396cb57031d6df5e718ab629237cdea63d2185dbbfb0" network for pod "nginx-6bf9f7cf5d-22q48": networkPlugin cni failed to set up pod "nginx-6bf9f7cf5d-22q48_default" network: add cmd: failed to assign an IP address to container
  Normal   SandboxChanged          119s (x4 over 3m13s)  kubelet            Pod sandbox changed, it will be killed and re-created.
  Normal   Pulling                 56s (x3 over 99s)     kubelet            Pulling image "httpd:latest"
  Warning  Failed                  56s (x3 over 99s)     kubelet            Failed to pull image "httpd:latest": rpc error: code = Unknown desc = Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
  Warning  Failed                  56s (x3 over 99s)     kubelet            Error: ErrImagePull
  Normal   BackOff                 43s (x4 over 98s)     kubelet            Back-off pulling image "httpd:latest"
  Warning  Failed                  43s (x4 over 98s)     kubelet            Error: ImagePullBackOff

Das Docker-Registry-Ratenlimit liegt bei 100 Container-Image-Anfragen pro sechs Stunden für anonyme Nutzung und 200 für Docker-Konten. Image-Anfragen, die diese Grenzwerte überschreiten, wird der Zugriff verweigert, bis das sechsstündige Fenster abgelaufen ist. Informationen zur Verwaltung der Nutzung und zum Verstehen der Registry-Ratenlimits finden Sie auf der Docker-Website unter Grundlegendes zu Ihrem Docker-Hub-Ratenlimit.


Ähnliche Informationen

Amazon-EKS-Fehlerbehebung

Wie behebe ich Probleme mit Amazon ECR bei Amazon EKS?

Bewährte Sicherheitsmethoden für Amazon EKS

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr