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

7 minuti di lettura
0

Il pod Amazon Elastic Kubernetes Service (Amazon EKS) si trova in stat ErriMagePull o ImagePullBackOff.

Breve descrizione

Se esegui il comando kubectl get pods e i tuoi pod sono in stato ImagePullBackOff, questi non funzioneranno correttamente. Lo stato ImagePullBackOff indica che un container non può essere avviato perché non è stato possibile recuperare o estrarre un'immagine. Per ulteriori informazioni, consulta I pod del connettore Amazon EKS sono in stato ImagePullBackOff.

Potresti ricevere un errore ImagePull se:

  • Un nome, tag o digest immagine non sono corretti.
  • Le immagini richiedono credenziali per l'autenticazione.
  • Il registro non è accessibile.

Risoluzione

1. Controlla lo stato del pod, il messaggio di errore e verifica che nome dell'immagine, tag e codice SHA siano corretti

Per visualizzare lo stato di un pod, esegui il comando kubectl get pods:

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

Per ottenere dettagli su un messaggio di errore del pod, esegui il comando kubectl describe pod:

$ 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" Assicurati che tag e nome dell'immagine esistano e siano corretti. Se il registro delle immagini richiede l'autenticazione, assicurati di essere autorizzato ad accedervi. Per verificare che l'immagine utilizzata nel pod sia corretta, esegui il seguente comando:

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

nginxx:latest

Per comprendere i valori di stato del pod, consulta la Pod phase (Fase pod) sul sito web Kubernetes.

Per ulteriori informazioni, consulta How can I troubleshoot the pod status in Amazon EKS? (Come posso risolvere i problemi relativi allo stato del pod in Amazon EKS?)

2. Immagini di Amazon Elastic Container Registry (Amazon ECR)

Se stai cercando di estrarre immagini da Amazon ECR utilizzando Amazon EKS, potrebbe essere necessario applicare una configurazione aggiuntiva. Se l'immagine è archiviata in un registro privato di Amazon ECR, assicurati di specificare nel pod le credenziali ImagePullSecrets. Queste credenziali sono utilizzate per l'autenticazione con il registro privato.

Crea un segreto denominato regcred:

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

Assicurati di sostituire le seguenti credenziali:

  • <your-registry-server>, il tuo FQDN del registro Docker privato. Usa https://index.docker.io/v1/ per DockerHub.
  • <your-name>, il tuo nome utente Docker.
  • <your-pword>, la tua password Docker.
  • <your-email>, la tua email Docker.

Hai impostato correttamente le tue credenziali Docker nel cluster come segreto denominato regcred.

Per comprendere il contenuto del segreto regcred, visualizzalo in formato YAML:

kubectl get secret regcred --output=yaml

Nell'esempio seguente, un pod ha bisogno di accedere alle tue credenziali 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.registry.example 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 segreto denominato regcred.

Per altre opzioni per la creazione di un segreto, consulta create a Pod that uses a Secret to pull an image (creare un Pod che utilizza un segreto per estrarre un'immagine) sul sito web Kubernetes.

3. Risoluzione dei problemi di registro

Nell'esempio seguente, il registro è inaccessibile a causa di un problema di connettività di rete perché kubelet non è in grado di raggiungere l'endpoint del registro privato:

$ 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

L'errore "Failed to pull image..." (Impossibile estrarre l'immagine...) significa che kubelet ha provato a connettersi all'endpoint del registro Docker, senza riuscirvi a causa di un timeout di connessione.

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

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

$ 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

Il limite di volume del registro Docker è di 100 richieste di immagini container ogni sei ore per gli utenti anonimi, e di 200 per gli account Docker. L'accesso per le richieste di immagini in eccesso rispetto a questi limiti viene negato fino alla scadenza della finestra di sei ore. Per gestire l'utilizzo e comprendere i limiti di volume del registro, consulta Understanding Your Docker Hub Rate Limit (Comprendere il limite di volume dell’hub di Docker) sul sito web di Docker.


Informazioni correlate

Risoluzione dei problemi di Amazon EKS

Come posso risolvere i problemi di Amazon ECR con Amazon EKS?

Best practice di sicurezza per Amazon EKS

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa