Direkt zum Inhalt

Wie behebe ich ein Problem mit einem getrennten Amazon ECS-Agenten?

Lesedauer: 7 Minute
0

Meine Container-Instances für Amazon Elastic Container Service (Amazon ECS) sind nicht verbunden.

Kurzbeschreibung

Es ist normal, dass der Amazon ECS-Container-Agent im Rahmen des normalen Betriebs mehrmals innerhalb einer Stunde die Verbindung trennt und erneut herstellt. Diese Änderungsereignisse geben keinen Anlass zur Sorge. Verbindungsereignisse, die nur wenige Minuten andauern, deuten möglicherweise nicht auf Probleme mit dem Container-Agenten oder der Container-Instance hin.

Wenn der Container-Agent jedoch länger im getrennten Zustand bleibt, kann die Container-Instance nicht als Teil des Amazon ECS-Clusters betrieben werden. Dieses Problem kann aus einem der folgenden Gründe verursacht werden:

  • Netzwerkprobleme verhindern die Kommunikation zwischen der Instance und Amazon ECS.
  • Der Container-Agent verfügt nicht über die erforderlichen AWS Identity and Access Management (IAM)-Berechtigungen für die Kommunikation mit Amazon ECS-Endpunkten.
  • Es gibt Probleme mit dem Host- oder Docker-Daemon innerhalb der Container-Instance.
  • Auf dem zugrunde liegenden Host gibt es einen Ressourcenkonflikt.

Hinweis: Es hat sich bewährt, die neueste Version des Amazon ECS-Container-Agenten zu verwenden.

Lösung

Hinweis: Die folgende Lösung gilt für Amazon ECS-optimierte Amazon Linux 2-AMIs.

Du kannst SSH-Schlüssel verwenden, um eine Verbindung zu den Amazon EC2-Instances herzustellen. Wenn du die SSH-Schlüssel nicht generiert hast, kannst du den Session Manager, eine Funktion von AWS Systems Manager, verwendest, um eine Verbindung zu der Instance herzustellen. Standardmäßig ist Systems Manager Agent auf Amazon Linux 2-AMIs und Amazon Linux 2 ECS-optimierten Basis-AMI installiert.

Sicherstellen, dass der Container-Agent auf der Container-Instance ausgeführt wird

Führe einen der folgenden Befehle auf der Container-Instance aus, um den Status und die Konnektivität des Amazon ECS-Container-Agenten zu überprüfen:

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

Die Ausgabe gibt Aktiv (wird ausgeführt) an und sieht ähnlich wie folgt aus:

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

Wenn das Problem durch einen getrennten Agenten verursacht wird, führe den folgenden Befehl aus, um den ECS-Agenten neu zu starten:

$ sudo systemctl restart ecs

Hinweis: Nachdem du die vorherigen Befehle ausgeführt hast, wird keine Ausgabe zurückgegeben.

Führe den folgenden Befehl aus, um zu überprüfen, ob der Agent ausgeführt wird:

sudo systemctl status ecs

Sicherstellen, dass der Docker-Service auf der Container-Instance ausgeführt wird

Führe den folgenden Befehl aus, um zu überprüfen, ob der Docker-Service auf der betroffenen Container-Instance ausgeführt wird:

sudo systemctl status docker

Die Ausgabe gibt Aktiv (wird ausgeführt) an und sieht ähnlich wie folgt aus:

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

Wenn der Docker-Service inaktiv ist, führe den folgenden Befehl aus, um den Docker-Service neu zu starten:

sudo systemctl restart docker

Hinweis: Nachdem du die vorherigen Befehle ausgeführt hast, wird keine Ausgabe zurückgegeben.

Führe den folgenden Befehl aus, um zu überprüfen, ob der Docker-Service neu gestartet wurde:

sudo systemctl status docker

Die Protokolldateien für den Container-Agenten und Docker überprüfen

Wenn die Container-Instance immer noch nicht verbunden sind, dann überprüfe die Protokolldateien auf dem Container-Host für den Container-Agenten und Docker.

Suche in den folgenden Protokolldateien nach Schlüsselwörtern wie "error", "warn" oder"agent transition state":

  • Die neuesten Protokolle des Amazon ECS-Container-Agenten unter /var/log/ecs/ecs-agent.log ansehen Hinweis: Du kannst das rotierte Protokoll anzeigen, indem du nach /var/log/ecs/ecs-agent-log.timestamp filterst
  • Das Amazon ECS-Initialisierungsprotokoll unter /var/log/ecs/ecs-init.log ansehen.
  • Die Ausführungsprotokolle der Benutzerdaten unter /var/log/cloud-init.log ansehen
  • Die Docker-Daemon-Protokolle mit dem Befehl sudo journalctl -u docker ansehen

Wenn du Linux verwendest, kannst du auch den Beendencode überprüfen, um weitere Informationen zum gestoppten Agenten-Container zu erhalten. Weitere Informationen findest du unter Beedencodes auf der GitHub-Website.

Führe den folgenden Befehl aus, um den Beendencode abzurufen:

docker inspect your container ID

Ersetze die Container-ID durch die ID des gestoppten Containers.

Hinweis: Du kannst den Amazon ECS-Protokollsammler verwenden, um allgemeine Betriebssystemprotokolle, Docker-Protokolle und Container-Agent-Protokolle für Amazon ECS zu sammeln.

Sicherstellen, dass das IAM-Instance-Profil über die erforderlichen Berechtigungen verfügt

Wenn der Container-Agent immer noch nicht verbunden ist, stelle sicher, dass das mit der Container-Instance verknüpfte IAM-Instance-Profil über die erforderlichen IAM-Berechtigungen verfügt:

  1. Verwende SSH oder Session Manager, um eine Verbindung zur Instance herzustellen.

  2. Führe den folgenden Befehl aus, um die Instance-Metadaten im Instance-Profil anzuzeigen, das der Instance zugeordnet ist:

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

    Die Ausgabe sieht etwa wie folgt aus:

    {
      "Code" : "Success",
      "LastUpdated" : "2022-02-16T22:42:17Z",
      "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
      "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN"
    }
  3. Stelle sicher, dass die IAM-Rolle die richtigen Berechtigungen für die Container-Instances enthält.

  4. Um bestimmte Anmeldeinformationsfehler zu überprüfen, führe einen Befehl ähnlich dem folgenden aus, um das Protokoll des Container-Agenten auf eine Liste von ECS-Protokollen zu überprüfen:

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

    Ersetze YYYY-MM-DD-## durch den entsprechenden Zeitstempel.

Hinweis: Das Protokoll des Container-Agenten wird jede Stunde rotiert. Das Suffix ändert sich automatisch, um das aktuelle Datum und die aktuelle Uhrzeit widerzuspiegeln. Aktualisiere den Befehl, sodass er den Datumsbereich und die Protokoll-ID enthält, wann das Problem aufgetreten ist.

Sicherstellen, dass die Container-Instance über genügend Ressourcen verfügt, um den ECS-Agenten auszuführen

Wenn die Aufgaben eine hohe Speicher-/CPU-Auslastung haben, verfügt die Container-Instance möglicherweise nicht über genügend Ressourcen, um den ECS-Agenten auszuführen.

Der Amazon ECS-Container-Agent verwendet die Docker-Funktion ReadMemInfo(), um die Menge an Speicher abzufragen, die für das Betriebssystem verfügbar ist.

Führe den folgenden Befehl auf der Container-Instance aus, um den Gesamtspeicher anzuzeigen, der vom Betriebssystem erkannt wird:

free -b

Beispielausgabe für eine Instance t2.large, auf der das Amazon ECS-optimierte Amazon Linux AMI ausgeführt wird:

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

Du kannst sich dafür entscheiden, etwas Speicher zu reservieren, für den Amazon ECS-Container-Agenten und andere wichtige Systemprozesse auf den Container-Instances. Wenn du diesen Speicher reservierst, kannst du sicherstellen, dass die Container die Aufgabe nicht um denselben Speicher konkurrieren. Weitere Informationen findest unter Speicher für Amazon ECS Linux-Container-Instances reservieren.

Sicherstellen, dass die Umgebungsvariable ECS_CLUSTER den richtigen Clusternamen hat

Wenn der Amazon ECS-Container-Agent-Konfigurationsparameter ECS_CLUSTER den falschen Clusternamen hat, kann die Container-Instance dem Cluster nicht beitreten. Führe den folgenden Befehl aus, um den Inhalt der Datei /etc/ecs/ecs.config auf diesen Parameter zu überprüfen:

cat /etc/ecs/ecs.config

Sicherstellen, dass der ECS-Agent mit ECS-Endpunkten kommunizieren kann

Um eine Verbindung mit ECS-Endpunkten herzustellen, müssen die Netzwerk-Zugriffssteuerungslisten und die Container-Instance-Sicherheitsgruppe ausgehende Verbindungen auf Port 443 (HTTPS) zulassen.

Um die ausgehenden Verbindungen zu ECS-Endpunkten (ACS/TCS) zu überprüfen, führe einen der folgenden Befehle auf die Container-Instance aus:

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

-oder-

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

Überprüfe die folgenden bewährten Methoden:

Ähnliche Informationen

Problembehandlung bei Amazon ECS

Die Container-Instance-Rolle erstellen

Amazon ECS-Container-Agent-Protokolle anzeigen

AWS OFFICIALAktualisiert vor einem Jahr