Come posso risolvere gli errori di stato del pod ErrImagePull e ImagePullbackoff in Amazon EKS?

6 minuti di lettura
0

Lo stato del mio pod Amazon Elastic Kubernetes Service (Amazon EKS) è ErrImagePull o ImagePullbackoff.

Breve descrizione

Se esegui il comando kubectl** get pods** e i tuoi pod sono nello stato ImagePullbackOff, allora i pod non funzionano correttamente. Lo stato ImagePullbackOff indica che un container non è stato avviato perché non è stato possibile recuperare o estrarre un'immagine. Per risolvere questo problema, prova le seguenti risoluzioni.

Per altre informazioni, consulta la pagina I Pods del connettore Amazon EKS sono in stato ImagePullBackOff.

Soluzione

Conferma delle informazioni sull'immagine

Usa i seguenti passaggi per confermare il messaggio di errore sullo stato del pod e verifica che il nome dell'immagine, il tag e Secure Hash Algorithm (SHA) siano corretti:

  1. Per recuperare lo stato del pod, esegui il seguente comando:

    $ kubectl get pods -n defaultNAME                              READY   STATUS             RESTARTS   AGE
    nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s
  2. Per avere i dettagli sull'errore del pod, esegui il seguente comando:

    $ 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. Conferma che il tag e il nome dell'immagine esistono e che sono corretti.

  4. Se il registro delle immagini richiede l'autenticazione, conferma di avere l'autorizzazione ad accedervi. Per verificare che l'immagine utilizzata nel pod sia corretta, esegui il comando seguente:

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

Per comprendere i valori dello stato del pod, consulta Pod phase sul sito web Kubernetes e Come faccio a risolvere i problemi relativi allo stato dei pod in Amazon EKS?

Risolvere i problemi relativi ai registri privati

Se recuperi immagini da un registro privato con Amazon EKS, potrebbe essere necessaria una configurazione aggiuntiva. Usa ImagePullSecrets sul manifesto del carico di lavoro per specificare le credenziali. Queste credenziali vengono autenticate con il registro privato. Ciò consente al pod di estrarre immagini dal repository privato specificato.

Per visualizzare il contenuto del Secret, usa il seguente comando in modo da vederlo in YAML:

kubectl get secret <secret_name> --output=yaml

Nell'esempio seguente, un pod deve accedere alle credenziali del registro Docker in regcred:

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

Sostituisci your-private-image con il percorso di un'immagine in un registro privato simile al seguente:

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

Per estrarre l'immagine dal registro privato, Kubernetes richiede le credenziali. Il campo ImagePullSecrets nel file di configurazione specifica che Kubernetes deve ottenere le credenziali da un Secret chiamato regcred.

Per altre informazioni, consulta Pull an Image from a Private Registry sul sito web di Kubernetes.

Risolvere problemi aggiuntivi relativi al registro

Problema di estrazione dell'immagine non riuscita

L'errore "Failed to pull image..." significa che kubelet ha tentato di connettersi all'endpoint privato del registro e non è riuscito a causa di un timeout della connessione.

Nell'esempio seguente, il registro è inaccessibile perché kubelet non è in grado di raggiungere l'endpoint privato del registro:

$ 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

Per risolvere questo errore, controlla la sottorete, i gruppi di sicurezza e l'ACL di rete che consentono la comunicazione con l'endpoint del registro.

Limite di frequenza di registro superato

Nell'esempio seguente, il limite di frequenza di registro è stato superato:

$ 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"

Se provi a estrarre un'immagine dal repository pubblico di Docker Hub dopo aver raggiunto il limite di pull rate, avviene un'interruzione. Per altre informazioni, consulta l'articolo Docker Hub rate limit sul sito web di Docker Hub.

AWS UFFICIALE
AWS UFFICIALEAggiornata 6 mesi fa