Como posso solucionar os erros de status do pod ErrImagePull e ImagePullBackoff no Amazon EKS?

8 minuto de leitura
0

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?)

Práticas recomendadas de segurança para o Amazon EKS

AWS OFICIAL
AWS OFICIALAtualizada há um ano