¿Cómo puedo solucionar los errores «ErriImagePull» e «ImagePullBackoff» del estado del pod en Amazon EKS?

6 minutos de lectura
0

El estado de mi pod de Amazon Elastic Kubernetes Service (Amazon EKS) es «ErriImagePull» o «ImagePullBackoff».

Descripción breve

Si ejecutas el comando de kubectl de get pods y tus pods tienen el estado ImagePullBackOff, quiere decir que los pods no se están ejecutando correctamente. El estado ImagePullBackOff significa que un contenedor no se ha iniciado porque no se ha podido recuperar o extraer una imagen. Para solucionar este problema, utilice las siguientes resoluciones.

Para obtener más información, consulte Los Pods conectores de Amazon EKS están en estado ImagePullBackOff.

Resolución

Confirmación de la información de la imagen

Siga estos pasos para confirmar el mensaje de error del estado del pod y verifique que el nombre de la imagen, la etiqueta y el algoritmo de hash seguro (SHA) sean correctos:

  1. Para obtener el estado del pod, ejecute el siguiente comando:

    $ kubectl get pods -n defaultNAME                              READY   STATUS             RESTARTS   AGE
    nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s
  2. Para obtener información sobre los errores del pod, ejecute el siguiente comando:

    $ 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"
  3. Confirme que la etiqueta y el nombre de la imagen existan y sean correctos.

  4. Si el registro de imágenes requiere autenticación, confirme que tiene autorización para acceder a él. Para comprobar que la imagen utilizada en el pod sea correcta, ejecute el siguiente comando:

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

Para comprender los valores del estado del pod, consulte Pod phase en el sitio web de Kubernetes y ¿Cómo puedo solucionar los problemas relacionados con el estado de los pods en Amazon EKS?

Solución de problemas de registros privados

Si recupera imágenes de un registro privado con Amazon EKS, es posible que necesite configuración adicional. Utilice imagePullSecrets en el manifiesto de carga de trabajo para especificar las credenciales. Estas credenciales se autentican en el registro privado. Esto permite que el pod extraiga imágenes del repositorio privado especificado.

Para ver el contenido del secreto en YAML, utilice el siguiente comando:

kubectl get secret <secret_name> --output=yaml

En el siguiente ejemplo, un pod necesita acceder a sus credenciales de registro de Docker en regcred:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: your-private-image
  imagePullSecrets:
  - name: regcred

Sustituya your-private-image por la ruta a una imagen de un registro privado, de forma similar a la siguiente:

your.private.registry.example.com/bob/bob-private:v1

Para extraer la imagen del registro privado, Kubernetes requiere las credenciales. En el campo imagePullSecrets del archivo de configuración se especifica que Kubernetes debe obtener las credenciales de un secreto llamado regcred.

Para obtener más información, consulte Pull an Image from a Private Registry en el sitio web de Kubernetes.

Solución de problemas de registro adicionales

Error «Failed to pull image»

El error «Failed to pull image...» significa que kubelet intentó conectarse al punto de enlace del registro privado y falló porque se agotó el tiempo de espera de la conexión.

En el siguiente ejemplo, no se puede acceder al registro porque kubelet no puede llegar al punto de enlace del 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

Para solucionar este error, compruebe la subred, los grupos de seguridad y la ACL de red que permiten la comunicación con el punto de enlace del registro.

Se ha superado el límite de tasa de extracción del registro

En el siguiente ejemplo, se ha superado el límite de tasa de extracción 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"

Si intenta extraer una imagen del repositorio público de Docker Hub después de alcanzar el límite de tasa de extracción, el proceso se detiene. Para obtener más información, consulte Docker Hub rate limit en el sitio web de Docker Hub.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año