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

Date de la dernière mise à jour : 20/08/2019

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

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 ECS a perdu la connectivité avec le service Amazon ECS au milieu d'un lancement de tâche.
  • L'arrêt d'une tâche par l'agent de conteneur ECS dure longtemps.

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.

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.

Remarque : pour modifier le type d'instance, vous devrez peut-être supprimer les fichiers d'état de l'agent (/var/lib/ecs/data/ecs_agent_data.json) afin de permettre à l'agent de se réenregistrer dans le cluster ECS.

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 ECS a perdu la connectivité avec le service Amazon ECS au milieu d'un lancement

1.    Pour vérifier le statut et la connectivité de l'agent de conteneur, 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 : la sortie attendue doit être active/running (active/en cours d'exécution).

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 devez recevoir une sortie similaire à celle-ci :

ecs start/running, process xxxx

5.    Pour déterminer la connectivité de l'agent, recherchez dans les journaux suivants au cours de la période concernée, des mots clés tels que « error » (erreur), « warn » (avertissement) ou « agent transition state » (état de transition de l'agent) :

Consultez le journal de l'agent de conteneur ECS dans /var/log/ecs/ecs-agent.log.aaaa-mm-jj-hh.
Affichez le journal d'initialisation 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 de l'agent de conteneur Amazon ECS.

L'arrêt d'une tâche par l'agent de conteneur ECS dure longtemps.

Si l'agent de conteneur ECS a des tâches plus anciennes à arrêter lorsqu'il reçoit de nouvelles tâches à démarrer du backend ECS de PENDING (EN ATTTETE) à RUNNING (EN COURS D'EXECUTION), l'agent ne démarre pas les nouvelles tâches tant que les anciennes tâches ne sont 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 dans le paramètre ECS_CONTAINER_START_TIMEOUT le délai qui doit s'écouler avant que l'agent de conteneur ECS cesse 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, le conteneur A dépend du passage à l'état COMPLETE (TERMINÉ), SUCCESS (SUCCÈS) ou HEALTHY (SAIN) du conteneur B. Si une valeur startTimeout est spécifiée pour le conteneur B et que le conteneur B n'atteint pas l'état souhaité dans ce délai, le conteneur A abandonne et ne démarre pas.

Pour obtenir un exemple de dépendance de conteneur, consultez Exemple : dépendance de conteneur.


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

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?