Como posso solucionar os erros de status do pod ErrImagePull e ImagePullBackoff no Amazon EKS?
Meu status de pod do Amazon Elastic Kubernetes Service (Amazon EKS) está no status ErrImagePull ou ImagePullBackoff.
Breve descrição
Se você executar o comando kubectl get pods e seus pods estiverem no status ImagePullBackOff, os pods não estarão funcionando corretamente. O status ImagePullBackOff significa que um contêiner não pôde ser iniciado porque uma imagem não pôde ser recuperada ou extraída. Para obter mais informações, consulte Os pods do Amazon EKS Connector estão no status ImagePullBackOff.
Você poderá receber um erro ImagePull se:
- O nome, a tag ou o resumo de uma imagem estiverem incorretos.
- As imagens exigirem credenciais para serem autenticadas.
- O registro não estiver acessível.
Resolução
1. Verifique o status do pod, a mensagem de erro e se o nome da imagem, a tag e o SHA estão corretos
Para obter o status de um pod, execute o comando kubectl get pods:
$ kubectl get pods -n default NAME READY STATUS RESTARTS AGE nginx-7cdbb5f49f-2p6p2 0/1 ImagePullBackOff 0 86s
Para obter os detalhes de uma mensagem de erro de pods, execute o 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" Certifique-se de que a tag e o nome da imagem existam e estejam corretos. Se o registro de imagens exigir autenticação, certifique-se se você está autorizado a acessá-lo. Para verificar se a imagem usada no pod está correta, execute o seguinte comando:
$ kubectl get pods nginx-7cdbb5f49f-2p6p2 -o jsonpath="{.spec.containers[*].image}" | \sort nginxx:latest
Para entender os valores do status do pod, consulte Pod phase (Fase do pod) no site do Kubernetes.
Para obter mais informações, consulte How can I troubleshoot the pod status in Amazon EKS? (Como posso solucionar o status do pod no Amazon EKS?)
2. Imagens do Amazon Elastic Container Registry (Amazon ECR)
Se você estiver tentando extrair imagens do Amazon ECR usando o Amazon EKS, talvez seja necessária uma configuração adicional. Se sua imagem estiver armazenada em um registro privado do Amazon ECR, certifique-se de especificar as credenciais imagePullSecrets no pod. Essas credenciais são usadas para se autenticar com o registro privado.
Crie um Secret (Segredo) chamado regcred:
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
Certifique-se de substituir as seguintes credenciais:
- <your-registry-server> é o seu FQDN do Private Docker Registry. Use https://index.docker.io/v1/ para DockerHub.
- <your-name> é o seu nome de usuário do Docker.
- <your-pword> é sua senha do Docker.
- <your-email> é o seu e-mail do Docker.
Você definiu com sucesso suas credenciais do Docker no cluster como um segredo chamado regcred.
Para entender o conteúdo do segredo regcred, visualize o segredo no formato YAML:
kubectl get secret regcred --output=yaml
No exemplo a seguir, um pod precisa acessar suas credenciais do Docker no regcred:
apiVersion: v1 kind: Pod metadata: name: private-reg spec: containers: - name: private-reg-container image: <your-private-image> imagePullSecrets: - name: regcred
Substitua your.private.registry.example pelo caminho para uma imagem em um registro privado semelhante ao seguinte:
your.private.registry.example.com/bob/bob-private:v1
Para extrair a imagem do registro privado, o Kubernetes exige as credenciais. O campo imagePullSecrets no arquivo de configuração especifica que o Kubernetes deve obter as credenciais de um segredo chamado regcred.
Para obter mais opções com a criação de um segredo, consulte como criar um pod que usa um segredo para extrair uma imagem no site do Kubernetes.
3. Solução de problemas do registro
No exemplo a seguir, o registro está inacessível devido a um problema de conectividade de rede porque o kubelet não consegue acessar o endpoint do registro privado:
$ 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
O erro “Failed to pull image...” (Falha ao extrair a imagem...) significa que o kubelet tentou se conectar ao endpoint do Docker Registry e falhou devido a um tempo limite de conexão.
Para solucionar esse erro, verifique sua sub-rede, os grupos de segurança e a ACL de rede que permitem a comunicação com o endpoint de registro especificado.
No exemplo a seguir, o limite da taxa de registro foi excedido:
$ 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
O limite da taxa de registro do Docker é de 100 solicitações de imagens de contêiner por seis horas para uso anônimo, e 200 para contas do Docker. Solicitações de imagem que excedam esses limites têm acesso negado até que decorra o tempo da janela de seis horas. Para gerenciar o uso e entender os limites da taxa de registro, consulte Understanding Your Docker Hub Rate Limit (Entender seu limite de taxa do Docker Hub) no site do Docker.
Informações relacionadas
Solução de problemas do Amazon EKS
How do I troubleshoot Amazon ECR issues with Amazon EKS? (Como soluciono problemas do Amazon ECR com o Amazon EKS?)

Conteúdo relevante
- AWS OFICIALAtualizada há 7 meses
- AWS OFICIALAtualizada há 8 meses
- AWS OFICIALAtualizada há um ano
- AWS OFICIALAtualizada há um mês