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

Lecture de 7 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 présentent le statut ImagePullbackoff, cela signifie qu'ils ne fonctionnent pas correctement. Le statut ImagePullBackOff signifie qu'un conteneur n'a pas pu démarrer, car une image n'a pas pu être récupérée ou extraite. Pour plus d'informations, consultez la section Les connecteurs Amazon EKS ont le statut ImagePullbackOff.

Vous pouvez recevoir une erreur ImagePull si :

  • Le nom, la balise ou le résumé d'une image sont incorrects.
  • Les images nécessitent des informations d'identification pour être authentifiées.
  • Le registre n'est pas accessible.

Résolution

1. Vérifiez le statut du pod, le message d'erreur et vérifiez que le nom, la balise et le SHA de l'image sont corrects

Pour obtenir le statut d'un pod, exécutez la commande kubectl****get pods :

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

Pour obtenir les détails d'un message d'erreur relatif à un pod, exécutez la commande 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 décrit le 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" Assurez-vous que la balise et le nom de votre image existent et sont corrects. Si le registre d'images nécessite une authentification, assurez-vous que vous êtes autorisé à 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

nginxx:latest

Pour comprendre les valeurs d'état du pod, consultez la section Phase du pod sur le site Web de Kubernetes.

Pour plus d'informations, consultez l'article Comment résoudre les problèmes liés à l'état du pod dans Amazon EKS ?

2. Images Amazon Elastic Container Registry (Amazon ECR)

Si vous essayez d'extraire des images d'Amazon ECR à l'aide d'Amazon EKS, une configuration supplémentaire peut être requise. Si votre image est stockée dans un registre privé Amazon ECR, assurez-vous de spécifier les informations d'identification ImagePullSecrets sur le pod. Ces informations d'identification sont utilisées pour s'authentifier auprès du registre privé.

Créez un Secret nommé itregcred :

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

Assurez-vous de remplacer les informations d’identification suivantes :

  • <your-registry-server> est le FQDN de votre registre Docker privé. Utilisez https://index.docker.io/v1/ pour DockerHub.
  • <your-name> est votre nom d'utilisateur Docker.
  • <your-pword> est votre mot de passe Docker.
  • <your-email> est votre adresse e-mail Docker.

Vous avez correctement défini vos informations d'identification Docker dans le cluster en tant que secret nommé regcred.

Pour comprendre le contenu du secret regcred, visualisez le secret au format YAML :

kubectl get secret regcred --output=yaml

Dans l'exemple suivant, un pod doit accéder à vos informations d'identification 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.registry.example par le chemin d'accès à une image dans un registre privé similaire au suivant :

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

Pour extraire l'image du registre privé, Kubernetes a besoin des informations d'identification. Le champ ImagePullSecrets du fichier de configuration indique que Kubernetes doit obtenir les informations d'identification à partir d'un secret nommé regcred.

Pour plus d'options concernant la création d'un secret, consultez la section Création d'un pod utilisant un secret pour extraire une image sur le site Web de Kubernetes.

3. Résolution des problèmes de registre

Dans l'exemple suivant, le registre est inaccessible en raison d'un problème de connectivité réseau car kubelet n'est pas en mesure d'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

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

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 de registre spécifié.

Dans l'exemple suivant, la limite de débit du 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"
  Warning  Failed                  43s (x4 over 98s)     kubelet            Error: ImagePullBackOff

La limite du débit du registre Docker est de 100 demandes d'images de conteneur par six heures pour une utilisation anonyme et de 200 pour les comptes Docker. Les demandes d'images dépassant ces limites se voient refuser l'accès jusqu'à l'expiration de la fenêtre de six heures. Pour gérer l'utilisation et comprendre les limites de débit du registre, consultez la section Comprendre la limite de débit de votre Docker Hub sur le site Web de Docker.


Informations connexes

Résolution des erreurs Amazon EKS

Comment puis-je dépanner les problèmes d'Amazon ECR avec Amazon EKS ?

Bonnes pratiques de sécurité pour Amazon EKS

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