Salta al contenuto

Come posso risolvere i problemi relativi a un agente Amazon ECS disconnesso?

7 minuti di lettura
0

Le mie istanze di container per Amazon Elastic Container Service (Amazon ECS) sono disconnesse.

Breve descrizione

È normale che in fase di funzionamento l'agente del container Amazon ECS si disconnetta e si riconnetta più volte nell'arco di un'ora. Questi eventi di cambiamento non sono motivo di preoccupazione. Eventi di collegamento che durano solo pochi minuti non sono necessariamente indicativi di problemi dell'agente del container o dell'istanza di container.

Tuttavia, se l'agente del container rimane disconnesso più a lungo, l'istanza di container non può funzionare nell’ambito del cluster Amazon ECS. Questo problema potrebbe essere causato da uno dei seguenti motivi:

  • Problemi di rete impediscono la comunicazione tra l'istanza e Amazon ECS.
  • L'agente del container non ha le autorizzazioni AWS Identity and Access Management (AWS IAM) necessarie per comunicare con gli endpoint di Amazon ECS.
  • Sono presenti problemi con l'host o il daemon Docker all'interno dell'istanza di container.
  • È presente un conflitto di risorse nell'host sottostante.

Nota: è consigliabile utilizzare la versione più recente dell'agente del container Amazon ECS.

Risoluzione

Nota: la seguente risoluzione si applica alle AMI Amazon Linux 2 ottimizzate per Amazon ECS.

Puoi utilizzare le chiavi SSH per collegarti alle istanze Amazon EC2. Se non hai generato le chiavi SSH, puoi utilizzare Gestione sessione, una funzionalità di AWS Systems Manager, per collegarti all'istanza. Per impostazione predefinita, l'Agente Systems Manager è installato sulle AMI Amazon Linux 2 e sulle AMI Amazon Linux 2 di base ottimizzate per ECS.

Verifica che l'agente del container sia in esecuzione sull'istanza di container

Per verificare lo stato e la connettività dell'agente del container Amazon ECS, esegui uno di questi comandi sull'istanza di container:

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

L'output specifica active (running) (attivo (in esecuzione)) ed è simile al seguente:

ecs.service - Amazon Elastic Container Service - container agent   Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-02-15 15:51:09 UTC; 37min ago
     Docs: https://aws.amazon.com/documentation/ecs/
  Process: 30039 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS)
  Process: 29987 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS)
  Process: 30077 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS)
 Main PID: 30123 (amazon-ecs-init)
    Tasks: 5
   Memory: 3.7M
   CGroup: /system.slice/ecs.service
           └─30123 /usr/libexec/amazon-ecs-init start

CONTAINER ID   IMAGE                                            COMMAND    CREATED      STATUS                PORTS     NAMES
eb1dc8d4ab3b   amazon/amazon-ecs-agent:latest   "/agent"        3 days ago   Up 3 days (healthy)                        ecs-agent

Se il problema è causato da un agente disconnesso, esegui questo comando per riavviare l'agente ECS:

$ sudo systemctl restart ecs

Nota: non viene restituito alcun output dopo aver eseguito i comandi precedenti.

Per verificare che l'agente sia in esecuzione, esegui questo comando:

sudo systemctl status ecs

Verifica che il servizio Docker sia in esecuzione nell'istanza di container

Per verificare che il servizio Docker sia in esecuzione nell'istanza di container interessata, esegui questo comando:

sudo systemctl status docker

L'output specifica active (running) (attivo (in esecuzione)) ed è simile al seguente:

docker.service - Docker Application Container Engine   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-02-11 17:42:32 UTC; 3 days ago
     Docs: https://docs.docker.com
  Process: 4307 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 4296 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 4315 (dockerd)
    Tasks: 24
   Memory: 360.5M
   CGroup: /system.slice/docker.service
           ├─4315 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
           ├─6010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
           └─6016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80

Se il servizio Docker è inattivo, esegui questo comando per riavviare il servizio Docker:

sudo systemctl restart docker

Nota: non viene restituito alcun output dopo aver eseguito i comandi precedenti.

Per verificare che il servizio Docker sia stato riavviato, esegui questo comando:

sudo systemctl status docker

Esamina i file di log per l'agente del container e per Docker

Se l'istanza di container è ancora disconnessa, rivedi i file di log dell'host del container per l'agente del container e per Docker.

Controlla nei seguenti file di log parole chiave come"error", "warn" o "agent transition state":

  • Visualizza i log più recenti dell'agente del container Amazon ECS in /var/log/ecs/ecs-agent.log
    Nota:
    puoi visualizzare il log ruotato filtrando in /var/log/ecs/ecs-agent-log.timestamp
  • Visualizza il log di avvio di Amazon ECS in /var/log/ecs/ecs-init.log
  • Visualizza i log di esecuzione dei dati utente in /var/log/ecs/ecs-init.log
  • Visualizza i log del daemon Docker con il comando sudo journalctl -u docker

Se utilizzi Linux, puoi anche rivedere il codice di uscita per ulteriori informazioni sul container dell'agente arrestato. Per ulteriori informazioni, consulta exitcodes sul sito web GitHub.

Per ottenere il codice di uscita, esegui questo comando:

docker inspect your container ID

Sostituisci your container ID con l'ID del container arrestato.

Nota: puoi utilizzare il programma di raccolta di log di Amazon ECS per raccogliere i log generali del sistema operativo, i log di Docker e i log dell'agente del container per Amazon ECS.

Verifica che il profilo dell'istanza IAM abbia le autorizzazioni necessarie

Se l'agente del container è ancora disconnesso, verifica che il profilo dell'istanza IAM associato all'istanza di container abbia le autorizzazioni IAM necessarie:

  1. Utilizza SSH o Gestione sessione per connetterti all'istanza.

  2. Per visualizzare i metadati dell'istanza nel profilo dell'istanza associato all'istanza, esegui questo comando:

    curl http://169.254.169.254/latest/meta-data/iam/info

    L'output è simile al seguente:

    {
      "Code" : "Success",
      "LastUpdated" : "2022-02-16T22:42:17Z",
      "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
      "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN"
    }
  3. Verifica che il ruolo IAM abbia le autorizzazioni corrette per le istanze di container.

  4. Per verificare errori di credenziali specifici, esegui un comando simile a quello riportato qui sotto per controllare nel log dell'agente del container un elenco di log ECS:

    cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-##

    Sostituisci YYYY-MM-DD-## il timestamp corrispondente.

Nota: il log dell'agente del container viene ruotato ogni ora. Il suffisso cambia automaticamente per riflettere la data e l'ora correnti. Aggiorna il comando per includere l'intervallo di date e l'ID del log relativi al momento in cui si è verificato il problema.

Verifica che l'istanza di container disponga di risorse sufficienti per eseguire l'agente ECS

Se le attività hanno un utilizzo elevato di memoria/CPU, l'istanza di container potrebbe non disporre di risorse sufficienti per eseguire l'agente ECS.

L'agente del container Amazon ECS utilizza la funzione ReadMemInfo() di Docker per eseguire query sulla quantità di memoria disponibile per il sistema operativo.

Esegui questo comando sull'istanza di container per visualizzare la memoria totale riconosciuta dal sistema operativo:

free -b

Esempio di output per un'istanza t2.large che esegue l'AMI Amazon Linux ottimizzata per Amazon ECS:

                          total        used         free                   shared     buff/cache    available
Mem:                    8361193472   298577920     7325388800              405504      737226752    7844274176
Swap:                     0              0           0

Puoi scegliere di riservare memoria per l'agente del container Amazon ECS e altri processi di sistema critici nelle istanze di container. Riservare memoria aiuta a garantire che i container dell'attività non si contendano la stessa memoria. Per ulteriori informazioni, consulta Riservare la memoria delle istanze di container Amazon ECS Linux.

Verifica che la variabile di ambiente ECS_CLUSTER abbia il nome del cluster corretto

Se il parametro di configurazione dell'agente del container Amazon ECS ECS_CLUSTER ha il nome del cluster errato, l'istanza di container non può unirsi al cluster. Per controllare il contenuto del file /etc/ecs/ecs.config in modo da verificare il parametro, esegui questo comando:

cat /etc/ecs/ecs.config

Verifica che l'agente ECS sia in grado di comunicare con gli endpoint di ECS

Per connetterti con gli endpoint di ECS, le liste di controllo degli accessi alla rete e il gruppo di sicurezza delle istanze di container devono consentire le connessioni in uscita sulla porta 443 (HTTPS).

Per controllare le connessioni in uscita agli endpoint di ECS (ACS/TCS), esegui uno di questi comandi sull'istanza di container:

sudo yum install telnet -y$ telnet ecs.region.amazonaws.com 443

-oppure-

$ curl https://ecs.region.amazonaws.com

Applica le seguenti best practice:

Informazioni correlate

Risoluzione dei problemi legati ad Amazon ECS

Ruolo IAM delle istanze di container Amazon ECS

Visualizzazione dei log degli agenti container Amazon ECS

AWS UFFICIALEAggiornata un anno fa