Comment résoudre les erreurs ErrImagePull et ImagePullBackoff relatives à l'état du pod dans Amazon EKS ?

Lecture de 6 minute(s)
0

L'état de mon pod Amazon Elastic Kubernetes Service (Amazon EKS) est ErrImagePull ou ImagePullBackoff.

Brève description

Si vous exécutez la commande kubectl get pods et que vos pods sont à l’état ImagePullBackOff, cela indique qu'ils ne fonctionnent pas correctement. L'état ImagePullBackOff signifie qu'un conteneur n'a pas démarré car une image n'a pas pu être récupérée ou extraite. Pour résoudre ce problème, utilisez les solutions suivantes.

Pour en savoir plus, consultez la page Les pods du connecteur Amazon EKS sont à l'état ImagePullBackOff.

Résolution

Confirmez les informations de l'image

Procédez comme suit pour confirmer le message d'erreur relatif à l'état du pod et vérifier que le nom de l'image, la balise et l'algorithme de hachage sécurisé (SHA) sont corrects :

  1. Pour obtenir l'état du pod, exécutez la commande suivante :

    $ kubectl get pods -n defaultNAME                              READY   STATUS             RESTARTS   AGE
    nginx-7cdbb5f49f-2p6p2            0/1     ImagePullBackOff   0          86s
  2. Pour obtenir plus de détails sur l’échec du pod, exécutez la commande suivante :

    $ 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. Vérifiez que la balise et le nom de votre image existent et qu'ils sont corrects.

  4. Si le registre d'images nécessite une authentification, vérifiez que vous disposez bien des autorisations nécessaires pour y accéder. Pour vérifier que l'image utilisée dans le pod est correcte, exécutez la commande suivante :

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

Pour comprendre les valeurs liées à l'état des pods, consultez la page Pod phase sur le site Web de Kubernetes, ainsi que la page Comment résoudre les problèmes liés à l’état d’un pod dans Amazon EKS ?

Résolution de problèmes liés aux registres privés

Si vous récupérez des images depuis un registre privé avec Amazon EKS, il est possible qu’une configuration supplémentaire soit nécessaire. Utilisez l’option imagePullSecrets du manifeste de charge de travail pour spécifier les informations d'identification. Ces informations d'identification s'authentifient auprès du registre privé. Cela permet au pod d'extraire des images du référentiel privé spécifié.

Pour afficher le contenu du secret, utilisez la commande suivante pour l'afficher au format YAML :

kubectl get secret <secret_name> --output=yaml

Dans l'exemple suivant, le pod doit accéder aux informations d'identification de votre registre Docker dans regcred :

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

Remplacez your-private-image par le chemin d'accès à une image dans un registre privé comme dans l’exemple suivant :

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

Pour pouvoir extraire l'image du registre privé, Kubernetes doit disposer des informations d'identification. Le champ imagePullSecrets du fichier de configuration indique que Kubernetes doit récupérer les informations d'identification d’un secret nommé regcred.

Pour en savoir plus, consultez la page Récupération d'une image d'un registre privé sur le site Web de Kubernetes.

Résolution d'autres problèmes de registre

Erreur « Failed to pull image »

L'erreur « Failed to pull image... » signifie que kubelet a tenté de se connecter au point de terminaison du registre privé et a échoué en raison d'un délai de connexion.

Dans l'exemple suivant, le registre est inaccessible car kubelet ne parvient pas à atteindre le point de terminaison du registre privé :

$ 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

Pour résoudre cette erreur, vérifiez votre sous-réseau, vos groupes de sécurité et votre ACL réseau qui autorisent la communication avec le point de terminaison du registre.

Limite de débit de registre dépassée

Dans l'exemple suivant, la limite de débit de registre a été dépassée :

$ 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"

Toute tentative d'extraction d’une image du référentiel public Docker Hub sera interrompue si vous avez atteint la limite de taux d'extraction. Pour en savoir plus, consultez la page Docker Hub rate limit sur le site Web de Docker Hub.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an