Come posso risolvere gli errori di stato del pod ErrImagePull e ImagePullbackOff in Amazon EKS?
Ultimo aggiornamento: 28/02/2023
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"
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
Questo articolo è stato utile?
Hai bisogno della fattura o di supporto tecnico?