Come posso risolvere gli errori di stato del pod ErrImagePull e ImagePullbackOff in Amazon EKS?
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?
Contenuto pertinente
- AWS UFFICIALEAggiornata 3 mesi fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 7 mesi fa