Come posso risolvere i problemi relativi a un agente Amazon ECS disconnesso?
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:
-
Utilizza SSH o Gestione sessione per connetterti all'istanza.
-
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/infoL'output è simile al seguente:
{ "Code" : "Success", "LastUpdated" : "2022-02-16T22:42:17Z", "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole", "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN" } -
Verifica che il ruolo IAM abbia le autorizzazioni corrette per le istanze di container.
-
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:
- A meno che l'applicazione non richieda una versione di Docker o un sistema operativo specifico che non corrisponde a quello in uso, utilizza l'AMI ottimizzata per Amazon ECS per eseguire i carichi di lavoro ECS.
- Utilizza la versione più recente dell'agente del container Amazon ECS. L'ultima versione include funzionalità avanzate e fornisce aggiornamenti importanti.
- Configura le attività con limiti di CPU e memoria.
Informazioni correlate
Risoluzione dei problemi legati ad Amazon ECS
- Argomenti
- Containers
- Lingua
- Italiano
