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

Lesedauer: 6 Minute
0

Mein Amazon Elastic Kubernetes Service (Amazon EKS)-Pod befindet sich im Status errimagePull oder imagePullBackOff.

Kurzbeschreibung

Wenn Sie den kubectl-Befehl get pods ausführen und sich Ihre Pods im Status ImagePullBackOff befinden, werden die Pods nicht richtig ausgeführt. Der Status ImagePullBackOff bedeutet, dass ein Container nicht gestartet wurde, weil ein Bild nicht abgefragt oder abgerufen werden konnte. Verwenden Sie die folgenden Lösungen, um dieses Problem zu beheben.

Weitere Informationen finden Sie unter Amazon EKS-Connector-Pods befinden sich im Status imagePullBackOff.

Behebung

Bestätigen der Bildinformationen

Gehen Sie wie folgt vor, um zu überprüfen, ob die Pod-Status-Fehlermeldung angezeigt wird, und stellen Sie sicher, dass der Image-Name, das Tag und der Secure Hash Algorithm (SHA) korrekt sind:

  1. Führen Sie den folgenden Befehl aus, um den Pod-Status abzurufen:

    $ kubectl get pods -n defaultNAME                              READY   STATUS             RESTARTS   AGE
    nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s
  2. Führen Sie den folgenden Befehl aus, um Details zum Pod-Ausfall abzurufen:

    $ 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"
  3. Vergewissern Sie sich, dass Ihr Image-Tag und -Name existieren und korrekt sind.

  4. Wenn die Image-Registrierung eine Authentifizierung erfordert, bestätigen Sie, 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
    nginx:latest

Informationen zu den Pod-Statuswerten finden Sie unter Pod-Phase auf der Kubernetes-Website und Wie kann ich den Pod-Status in Amazon EKS bveheben?

Problembehandlung bei privaten Registern

Wenn Sie Images aus einer privaten Registrierung mit Amazon EKS abrufen, ist möglicherweise eine zusätzliche Konfiguration erforderlich. Verwenden Sie ImagePullSecrets auf dem Workload-Manifest, um die Anmeldeinformationen anzugeben. Diese Anmeldeinformationen authentifizieren sich beim privaten Register. Dadurch kann der Pod Images aus dem angegebenen privaten Repository abrufen.

Um den Inhalt des Secrets anzuzeigen, verwenden Sie den folgenden Befehl, um ihn in YAML anzuzeigen:

kubectl get secret <secret_name> --output=yaml

Im folgenden Beispiel benötigt ein Pod Zugriff auf Ihre Docker-Registeranmeldeinformationen 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-image durch den Pfad zu einem Image in einem privaten Register, ähnlich dem folgenden:

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

Um das Image aus dem privaten Register 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 Informationen finden Sie unter Abrufen eines Images aus einem privaten Register auf der Kubernetes-Website.

Beheben zusätzlicher Registerprobleme

Das Imageproblem konnte nicht abgerufen werden

Der Fehler „Bild konnte nicht abgerufen werden..." bedeutet, dass Kubelet versucht hat, eine Verbindung zum privaten Registerendpunkt herzustellen, und aufgrund eines Verbindungstimeouts fehlgeschlagen ist.

Im folgenden Beispiel kann nicht auf den Register zugegriffen werden, da Kubelet den Endpunkt des privaten Registers 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

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

Das Registerratenlimit wurde überschritten

Im folgenden Beispiel wurde das Registerratenlimit ü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"

Wenn Sie versuchen, ein Image aus dem öffentlichen Docker Hub-Repository abzurufen, nachdem Sie das Abrufratenlmit erreicht haben, werden Sie gestoppt. Weitere Informationen finden Sie unter Docker Hub-Ratenlimit auf der Docker Hub-Website.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 7 Monaten