Pourquoi ma tâche Amazon ECS est-elle bloquée dans l'état PENDING (EN ATTENTE)?
Date de la dernière mise à jour : 22/03/2022
Ma tâche Amazon Elastic Container Service (Amazon ECS) est bloquée dans 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.
- Votre routage Amazon Virtual Private Cloud (Amazon VPC) n'est pas correctement configuré.
Résolution
Pour savoir pourquoi votre tâche est bloquée à l'état PENDING (EN ATTENTE), effectuez les étapes de dépannage suivantes.
Remarque : si vous recevez des erreurs lors de l'exécution de commandes depuis l'AWS Command Line Interface (AWS CLI), assurez-vous d'utiliser la version la plus récente de l'AWS CLI.
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 temps 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 prefer-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 ATTTENTE) à 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 la valeur du paramètre ECS_CONTAINER_STOP_TIMEOUT en fonction du temps que vous voulez laisser s'écouler avant que vos conteneurs ne soient arrêtés de force s'ils ne s'arrêtent pas normalement tout seuls.
Remarque : la valeur par défaut pour Linux et Windows est 30 secondes.
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.
Votre routage Amazon VPC n'est pas correctement configuré
Vous avez peut-être configuré vos tâches Amazon ECS ou Fargate pour qu'elles s'exécutent dans un sous-réseau VPC qui n'a pas accès à Amazon ECS ou Amazon ECR en raison d'un VPC ou d'un sous-réseau mal configuré. Pour résoudre ce problème, assurez-vous que la table de routage de votre sous-réseau possède une passerelle Internet ou une passerelle NAT. Si vous lancez une tâche dans un sous-réseau qui n'a pas de route de sortie vers Internet, utilisez AWS PrivateLink pour accéder en privé aux API Amazon ECS à l'aide d'adresses IP privées.
Informations connexes
Cet article vous a-t-il été utile ?
Avez-vous besoin d'aide pour une question technique ou de facturation ?