Perché la mia attività Amazon ECS è bloccata nello stato PENDING?

6 minuti di lettura
0

La mia attività Amazon Elastic Container Service (Amazon ECS) è bloccata nello stato PENDING.

Breve descrizione

I seguenti scenari causano in genere il blocco delle attività di Amazon ECS nello stato PENDING:

  • Il daemon Docker non risponde.
  • L'immagine Docker è grande.
  • L'agente container Amazon ECS ha perso la connettività con il servizio Amazon ECS durante l'avvio di un'attività.
  • L'agente container Amazon ECS impiega molto tempo per interrompere un'attività esistente.
  • Il tuo routing Amazon Virtual Private Cloud (Amazon VPC) non è configurato correttamente.
  • Un container essenziale dipende da container non essenziali che non riescono a essere HEALTHY.

Risoluzione

Per scoprire perché la tua attività è bloccata nello stato PENDING, completa i seguenti passaggi per la risoluzione dei problemi.

Nota: se ricevi errori durante l'esecuzione dei comandi AWS Command Line Interface (AWS CLI), assicurati di utilizzare la versione più recente dell'interfaccia a riga di comando di AWS.

Il daemon Docker non risponde

Per problemi relativi alla CPU, completa i seguenti passaggi:

  1. Usa le metriche di Amazon CloudWatch per verificare se l'istanza del container ha superato la CPU massima.

  2. Aumenta le dimensioni dell'istanza container in base alle esigenze.

Per problemi di memoria, completa i seguenti passaggi:

  1. Esegui il comando free per vedere quanta memoria è disponibile per il tuo sistema.

  2. Aumenta le dimensioni dell'istanza container in base alle esigenze.

Per problemi di I/O, completa i seguenti passaggi:

  1. Esegui il comando iotop.

  2. Scopri quali attività in quali servizi utilizzano la maggior parte degli IOPS. Quindi, utilizza i vincoli e le strategie di posizionamento delle attività per distribuire queste attività su istanze di container distinte.

-oppure-

Usa CloudWatch per creare un allarme per le metriche BurstBalance di Amazon Elastic Block Store (Amazon EBS). Quindi, utilizza una funzione AWS Lambda o il tuo log personalizzato per bilanciare le attività.

L'immagine Docker è grande

Le immagini più grandi richiedono più tempo per il download e aumentano la quantità di tempo in cui l'attività rimane PENDING.

Per accelerare il tempo di transizione, ottimizza il parametro ECS_IMAGE_PULL_BEHAVIOR per sfruttare la memorizzazione nella cache delle immagini.

Nota: ad esempio, imposta il parametro ECS_IMAGE_PULL_BEHAVIOR su prefer-cached in /etc/ecs/ecs.config. Se viene specificato prefer-cached, l'immagine viene estratta in remoto quando non è presente alcuna immagine memorizzata nella cache. In caso contrario, viene utilizzata l'immagine memorizzata nella cache dell'istanza.

L'agente container Amazon ECS ha perso la connettività con il servizio Amazon ECS nel bel mezzo di un lancio

  1. Per verificare lo stato e la connettività dell'agente container Amazon ECS, esegui uno dei seguenti comandi sull'istanza del container.

Esegui il seguente comando per Amazon Linux 1:

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

Esegui il seguente comando per Amazon Linux 2:

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

Nota: nell'output viene visualizzatoattivo/in esecuzione.

  1. Per visualizzare i metadati sulle attività in esecuzione nell'istanza del container ECS, esegui i seguenti comandi sull'istanza del container:
$ curl http://localhost:51678/v1/metadata

Si ottiene il seguente risultato:

{
  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}
  1. Per visualizzare le informazioni sulle attività in esecuzione, esegui il comando seguente sull'istanza del container:
$ curl http://localhost:51678/v1/tasks

Si ottiene il seguente risultato:

{
  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}
  1. Se il problema riguarda un agente disconnesso, riavvia l'agente container con uno dei seguenti comandi.

Esegui il seguente comando per Amazon Linux 1:

$ sudo stop ecs
$ sudo start ecs

Esegui il seguente comando per Amazon Linux 2:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

Riceverai un output simile al seguente esempio:

ecs start/running, process xxxx
  1. Per determinare la connettività dell'agente, controlla i seguenti registri durante l'intervallo di tempo pertinente per parole chiave come errore, avviso o stato di transizione dell'agente:

Visualizza il registro dell'agente container di Amazon ECS all'indirizzo /var/log/ecs/ecs-agent.log.yyy-mm-dd-hh.
Visualizza il log di avvio di Amazon ECS all'indirizzo /var/log/ecs/ecs-init.log.
Visualizza i log Docker su /var/log/docker.

Nota: puoi anche utilizzare Amazon ECS logs collector per raccogliere log generali del sistema operativo, log Docker e log degli agenti container per Amazon ECS.

L'agente container Amazon ECS impiega molto tempo per interrompere un'attività esistente

Quando il tuo agente container riceve nuove attività da avviare da Amazon ECS (da PENDING a RUNNING), potrebbe dover interrompere le attività meno recenti. In questo caso, l'agente non avvia queste nuove attività finché le vecchie non vengono interrotte per prime.

Per controllare il timeout di arresto e avvio del container a livello di istanza del container, imposta i due parametri seguenti:

  1. In /etc/ecs/ecs.config, regola il valore del parametro ECS_CONTAINER_STOP_TIMEOUT. Questi parametri impostano il periodo di tempo che deve trascorrere prima che Amazon ECS chiuda forzatamente i container se questi non escono normalmente da soli.

Nota: il valore predefinito per Linux e Windows è 30s.

  1. In /etc/ecs/ecs.config, regolare il valore del parametro ECS_CONTAINER_START_TIMEOUT. Questo parametro imposta la quantità di tempo che trascorre prima che l'agente del container Amazon ECS interrompa il tentativo di avviare il container.

Nota: il valore predefinito è 3m per Linux e 8m per Windows.

Se la versione dell'agente è 1.26.0 o successiva, è possibile definire i parametri di timeout di arresto e avvio precedenti per attività. Ciò potrebbe far passare l'attività a uno stato STOPPED. Ad esempio, supponiamo che containerA dipenda dal fatto che containerB raggiunga lo stato COMPLETE, SUCCESS o HEALTHY. Se non specifichi un valore startTimeout per containerB e containerB non raggiunge lo stato desiderato entro quel tempo, containerA non si avvia.

Per un esempio di dipendenza dal container, consulta Esempio: Dipendenza del container da AWS GitHub.

Il tuo routing Amazon VPC non è configurato correttamente

Verifica la configurazione della sottorete VPC in cui vengono eseguite le tue attività Amazon ECS o Fargate. Se la sottorete non è configurata correttamente, non ha accesso ad Amazon ECS o Amazon ECR. Per risolvere questo problema, assicurati che la tabella di routing per la tua sottorete disponga di un gateway Internet o di un gateway NAT. Se avvii un'attività in una sottorete che non dispone di una via di uscita verso Internet, utilizza AWS PrivateLink. Ciò consente di accedere privatamente alle API Amazon ECS con indirizzi IP privati.

Un container essenziale dipende da container non essenziali che non riescono a essere HEALTHY

Se i container non essenziali non si trovano in uno stato HEALTHY e un container essenziale dipende da essi, l'attività si blocca in PENDING. In questo caso, viene visualizzato il seguente messaggio:

"stoppedReason":"Service ABCXYZ: task last status remained in PENDING too long."

Per risolvere questo problema, assicurati che i container dipendenti (non essenziali) funzionino come previsto. Se non riesci a risolvere il problema sottostante, rendi questi container essenziali per evitare un'attività bloccata in PENDING per troppo tempo.

Informazioni correlate

Dipendenza dal container

Agente container Amazon ECS (AWS GitHub)

AWS UFFICIALE
AWS UFFICIALEAggiornata 10 mesi fa