Pourquoi ma tâche Amazon ECS est-elle bloquée dans l'état PENDING (EN ATTENTE)?

Date de la dernière mise à jour : 17/12/2020

Ma tâche Amazon Elastic Container Service (Amazon ECS) est bloquée à l'état PENDING (EN ATTENTE).

Brève description

Voici quelques scénarios courants qui peuvent entraîner le blocage de votre tâche ECS dans l'état PENDING (EN ATTTENTE) :

  • Le démon Docker ne répond pas.
  • L'image Docker est volumineuse
  • L'agent de conteneur Amazon ECS a perdu la connectivité avec l’Amazon ECS service au milieu d'un lancement de tâche
  • L'agent de conteneur Amazon ECS met beaucoup de temps à arrêter une tâche existante

Pour déterminer pourquoi votre tâche est bloquée dans l'état PENDING (EN ATTENTE), procédez comme suit en fonction du problème que vous rencontrez.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes à partir de l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

Résolution

Le démon Docker ne répond pas

Pour les problèmes d'UC, procédez comme suit :

1.    Utilisez les métriques Amazon CloudWatch pour déterminer si votre instance de conteneur a dépassé l'usage maximal de l'UC.

2.    Augmentez la taille de votre instance de conteneur si nécessaire.

Pour les problèmes de mémoire, effectuez les opérations suivantes :

1.    Exécutez la commande free pour identifier quantité de mémoire disponible pour votre système.

2.    Augmentez la taille de votre instance de conteneur si nécessaire.

Pour les problèmes d'E/S, effectuez les opérations suivantes :

1.    Exécutez la commande iotop.

2.    Identifiez dans les services les tâches qui utilisent le plus d'IOPS. Ensuite, distribuez ces tâches vers des instances de conteneur distinctes à l'aide de stratégies et de contraintes de placement de tâches.

-ou-

Utilisez CloudWatch pour créer une alarme pour vos métriques Amazon Elastic Block Store (Amazon EBS) BurstBalance. Ensuite, utilisez une fonction AWS Lambda ou votre propre logique personnalisée pour équilibrer les tâches.

L'image Docker est volumineuse

Le téléchargement d'images plus volumineuses dure plus longtemps et augmente la durée pendant laquelle la tâche reste dans l'état PENDING (EN ATTENTE).

Pour accélérer le délai de transition, ajustez le paramètre ECS_IMAGE_PULL_BEHAVIOR pour tirer parti du cache d'image.

Remarque: par exemple, affectez au paramètre ECS_IMAGE_PULL_BEHAVIOR la valeur preferret-cached dans /etc/ecs/ecs.config. Si prest-cached est spécifié, l'image est extraite à distance si le cache ne contient aucune image. Sinon, l'image mise en cache sur l'instance est utilisée.

L'agent de conteneur Amazon ECS a perdu la connectivité avec l’Amazon ECS service au milieu d'un lancement

1.    Pour vérifier l'état et la connectivité de l'agent de conteneur Amazon ECS, exécutez l'une des commandes suivantes sur votre instance de conteneur.

Pour Amazon Linux 1:

$ sudo status ecs
$ sudo docker ps -f name=ecs-agent

Pour Amazon Linux 2:

$ sudo systemctl status ecs
$ sudo docker ps -f name=ecs-agent

Remarque : vous devriez voir actif/en cours d'exécution dans la sortie.

2.    Pour afficher les métadonnées sur les tâches en cours d'exécution dans votre instance de conteneur ECS, exécutez les commandes suivantes sur votre instance de conteneur :

$ curl http://localhost:51678/v1/metadata

Vous devez recevoir la sortie suivante :

{
  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

3.    Pour afficher des informations sur les tâches en cours d'exécution, exécutez la commande suivante sur votre instance de conteneur :

$ curl http://localhost:51678/v1/tasks

Vous devez recevoir la sortie suivante :

{
  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

4.    Si le problème est lié à un agent déconnecté, redémarrez votre agent de conteneur avec l'une des commandes suivantes.

Pour Amazon Linux 1:

$ sudo stop ecs
$ sudo start ecs

Pour Amazon Linux 2:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

Vous obtenez une sortie similaire à ce qui suit:

ecs start/running, process xxxx

5.    Pour déterminer la connectivité de l'agent, vérifiez les journaux suivants pendant la période appropriée pour les mots clés tels que « erreur », « avertir » ou « état de transition de l'agent »:

Affichez le journal de l'agent de conteneur Amazon ECS dans /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh.
Affichez le journal d'initialisation d'Amazon ECS dans /var/log/ecs/ecs-init.log.
Affichez les journaux Docker dans /var/log/docker.

Remarque : vous pouvez également utiliser le collecteur de journaux Amazon ECS pour collecter les journaux généraux du système d'exploitation, les journaux Docker et les journaux d'agent de conteneur pour Amazon ECS.

L'agent de conteneur Amazon ECS met beaucoup de temps à arrêter une tâche existante

Si l'agent de conteneur ECS a des tâches plus anciennes à arrêter lorsqu'il reçoit de nouvelles tâches à démarrer depuis Amazon ECS (de PENDING (EN ATTTETE) à RUNNING (EN COURS D'EXECUTION)), alors l'agent ne démarrera pas ces nouvelles tâches tant que les anciennes tâches ne seront pas arrêtées.

Vous pouvez définir les deux paramètres suivants pour contrôler le délai d'arrêt et de démarrage du conteneur au niveau de l'instance de conteneur :

1.    Dans /etc/ecs/ecs.config, définissez dans le paramètre ECS_CONTAINER_STOP_TIMEOUT le délai qui doit s'écouler avant l'arrête forcé de vos conteneurs s'ils ne s'arrêtent normalement seuls.

Remarque: la valeur par défaut pour Linux et Windows est 30 s.

2.    Dans /etc/ecs/ecs.config, définissez la valeur du paramètre ECS_CONTAINER_START_TIMEOUT sur la durée que vous souhaitez utiliser avant que l'agent de conteneur Amazon ECS arrête d'essayer de démarrer le conteneur.

Remarque: la valeur par défaut est 3 m pour Linux et 8 m pour Windows.

Si votre version d'agent est 1.26.0 ou une version ultérieure, vous pouvez définir les paramètres précédents de délai d'arrêt et de démarrage pour chaque tâche. Cela peut faire passer la tâche à l'état STOPPED (ARRÊTÉE). Par exemple, supposons que containerA ait une dépendance sur containerB atteignant un état COMPLETE (TERMINÉ), SUCCESS (SUCCÈS) ou HEALTHY (SAIN). Si vous ne spécifiez pas de valeur startTimeout pour containerB et que containerB n'atteint pas l'état souhaité dans ce délai, alors containerA ne démarre pas.

Pour obtenir un exemple de dépendance de conteneur, consultez Exemple: Dépendance de conteneur sur AWS GitHub.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?