¿Cómo puedo solucionar los errores ErrImagePull e ImagePullbackOff de estado del pod en Amazon EKS?

8 minutos de lectura
0

El estado de mi pod de Amazon Elastic Kubernetes Service (Amazon EKS) se encuentra en estado ErrImagePull o ImagePullbackOff.

Descripción breve

Si ejecuta el comando kubectl get pods (obtener comandos) y sus pods están en el estado ImagePullbackOff, significa que los pods no se ejecutan de forma correcta. El estado ImagePullbackOff significa que un contenedor no se pudo iniciar porque no se pudo recuperar ni extraer una imagen. Para más información, consulte Los pods de conectores de Amazon EKS están en estado ImagePullBackOff.

Es posible que reciba un error ImagePull si:

  • El nombre, la etiqueta o el resumen de una imagen son incorrectos.
  • Las imágenes requieren credenciales para autenticarse.
  • No se puede acceder al registro.

Resolución

1. Compruebe el estado del pod, el mensaje de error y que el nombre, la etiqueta y el SHA de la imagen son correctos

Para obtener el estado de un pod, ejecute el comando kubectl get pods (obtener comandos):

$ kubectl get pods -n default
NAME                              READY   STATUS             RESTARTS   AGE
nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s

Para obtener los detalles de un mensaje de error de pods, ejecute el comando kubectl describe pod (describir pods):

$ 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" Asegúrese de que la etiqueta y el nombre de la imagen existen y son correctos. Si el registro de imágenes requiere autenticación, asegúrese de tener autorización para acceder a él. Para comprobar que la imagen utilizada en el pod es correcta, ejecute el siguiente comando:

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

nginxx:latest

Para entender los valores del estado del pod, consulte la fase del pod en el sitio web de Kubernetes.

Para obtener más información, consulte ¿Cómo puedo solucionar problemas de estado del pod en Amazon EKS?

2. Imágenes de Amazon Elastic Container Registry (Amazon ECR)

Si está intentando extraer imágenes de Amazon ECR mediante Amazon EKS, es posible que necesite una configuración adicional. Si la imagen está almacenada en un registro privado de Amazon ECR, asegúrese de especificar las credenciales ImagePullSecrets en el pod. Estas credenciales se utilizan para autenticarse en el registro privado.

Cree un Secret (Secreto) llamado regcred:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

Asegúrese de reemplazar las siguientes credenciales:

  • <your-registry-server> es su FQDN de registro privado de Docker. Utilice https://index.docker.io/v1/ para DockerHub.
  • <your-name> es su nombre de usuario de Docker.
  • <your-pword> es su contraseña de Docker.
  • <your-email> es su correo electrónico de Docker.

Ha configurado correctamente sus credenciales de Docker en el clúster como un secreto denominado regcred.

Para entender el contenido del secreto regcred, consulte el secreto en formato YAML:

kubectl get secret regcred --output=yaml

En el siguiente ejemplo, un pod necesita acceder a sus credenciales 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

Reemplace your.private.registry.example por la ruta a una imagen de un registro privado similar al siguiente:

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

Para extraer la imagen del registro privado, Kubernetes necesita las credenciales. El campo ImagePullSecrets del archivo de configuración especifica que Kubernetes debe obtener las credenciales de un secreto denominado regcred.

Para obtener más opciones sobre la creación de un secreto, consulte Cómo crear un pod que utilice un secreto para extraer una imagen del sitio web de Kubernetes.

3. Solución de problemas de registro

En el siguiente ejemplo, no se puede acceder al registro debido a un problema de conectividad de red porque kubelet no puede llegar al punto de conexión 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

El error “No se pudo extraer la imagen...” significa que kubelet intentó conectarse al punto de conexión del registro de Docker y falló debido a un vencimiento del tiempo de espera de la conexión.

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 conexión del registro especificado.

En el siguiente ejemplo, se superó el límite de tasa de 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

El límite de tasa de registro de Docker es de 100 solicitudes de imágenes de contenedores cada seis horas para uso anónimo y 200 para cuentas de Docker. Se deniega el acceso a las solicitudes de imágenes que superen estos límites hasta que haya transcurrido el período de seis horas. Para gestionar el uso y entender los límites de tasa del registro, consulte Cómo entender el límite de tasa de Docker Hub en el sitio web de Docker.


Información relacionada

Solución de problemas de Amazon EKS

¿Cómo soluciono los problemas de Amazon ECR con Amazon EKS?

Prácticas recomendadas de seguridad para Amazon EKS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año