Warum bleibt meine Amazon ECS-Aufgabe im Status PENDING hängen?

Lesedauer: 6 Minute
0

Meine Amazon Elastic Container Service (Amazon ECS)-Aufgabe ist im Status PENDING hängen geblieben.

Kurzbeschreibung

Die folgenden Szenarien führen häufig dazu, dass Amazon ECS-Aufgaben im Status PENDING hängen bleiben:

  • Der Docker-Daemon reagiert nicht.
  • Das Docker-Image ist groß.
  • Der Amazon ECS-Container-Agent hat während eines Aufgabenstarts die Konnektivität mit dem Amazon ECS-Service verloren.
  • Der Amazon ECS-Container-Agent braucht lange, um eine bestehende Aufgabe zu beenden.
  • Ihr Amazon Virtual Private Cloud (Amazon VPC)-Routing ist nicht richtig konfiguriert.
  • Ein essentieller Container hängt von nicht-essentiellen Containern ab, deren Status nicht HEALTHY ist.

Lösung

Führen Sie die folgenden Schritte zur Fehlerbehebung durch, um zu sehen, warum Ihre Aufgabe im Status PENDING hängen bleibt.

Hinweis: Wenn Sie beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS CLI-Version verwenden.

Der Docker-Daemon reagiert nicht

Gehen Sie bei CPU-Problemen wie folgt vor:

1.Verwenden Sie Amazon CloudWatch-Metriken, um festzustellen, ob Ihre Container-Instance die maximale CPU-Auslastung überschritten hat.

2.Erhöhen Sie die Größe Ihrer Container-Instance nach Bedarf.

Gehen Sie bei Speicherproblemen wie folgt vor:

1.Führen Sie den Befehl free aus, um zu sehen, wie viel Speicher für Ihr System verfügbar ist.

2.Erhöhen Sie die Größe Ihrer Container-Instance nach Bedarf.

Gehen Sie bei E/A-Problemen wie folgt vor:

1.Führen Sie den Befehl iotop aus.

2.Finden Sie heraus, welche Aufgaben in welchen Diensten die meisten IOPS verwenden. Verwenden Sie dann Einschränkungen und Strategien für die Aufgabenplatzierung, um diese Aufgaben auf verschiedene Container-Instances zu verteilen.

-oder-

Verwenden Sie CloudWatch, um einen Alarm für Ihre BurstBalance-Metriken im Amazon Elastic Block Store (Amazon EBS) zu erstellen. Verwenden Sie dann eine AWS Lambda-Funktion oder Ihre eigene benutzerdefinierte Logik, um die Aufgaben auszugleichen.

Das Docker-Image ist groß

Das Herunterladen größerer Images dauert länger und erhöht die Zeit, in der sich die Aufgabe im Status PENDING befindet.

Um die Übergangszeit zu beschleunigen, passen Sie den Parameter ECS_IMAGE_PULL_BEHAVIOR an, um die Vorteile des Image-Caching zu nutzen.

Hinweis: Setzen Sie beispielsweise den Parameter ECS_IMAGE_PULL_BEHAVIOR in /etc/ecs/ecs.config auf prefer-cached. Wenn prefer-cached angegeben ist, wird das Image remote abgerufen, wenn kein zwischengespeichertes Image vorhanden ist. Andernfalls wird das zwischengespeicherte Image auf der Instance verwendet.

Der Amazon ECS-Container-Agent hat während eines Starts die Konnektivität mit dem Amazon ECS-Service verloren

1.Führen Sie einen der folgenden Befehle auf Ihrer Container-Instance aus, um den Status und die Konnektivität des Amazon ECS-Container-Agents zu überprüfen.

Führen Sie den folgenden Befehl für Amazon Linux 1 aus:

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

Führen Sie den folgenden Befehl für Amazon Linux 2 aus:

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

Hinweis: In der Ausgabe wird aktiv/läuft angezeigt.

2.Um Metadaten zu laufenden Aufgaben in Ihrer ECS-Container-Instance anzuzeigen, führen Sie die folgenden Befehle auf Ihrer Container-Instance aus:

$ curl http://localhost:51678/v1/metadata

Sie erhalten die folgende Ausgabe:

{
  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

3.Führen Sie den folgenden Befehl auf Ihrer Container-Instance aus, um Informationen zu laufenden Aufgaben anzuzeigen:

$ curl http://localhost:51678/v1/tasks

Sie erhalten die folgende Ausgabe:

{
  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

4.Wenn das Problem mit einem getrennten Agent zusammenhängt, starten Sie Ihren Container-Agent mit einem der folgenden Befehle neu.

Führen Sie den folgenden Befehl für Amazon Linux 1 aus:

$ sudo stop ecs
$ sudo start ecs

Führen Sie den folgenden Befehl für Amazon Linux 2 aus:

$ sudo systemctl stop ecs
$ sudo systemctl start ecs

Sie erhalten eine Ausgabe, die dem folgenden Beispiel ähnelt:

ecs start/running, process xxxx

5.Um die Agent-Konnektivität zu ermitteln, überprüfen Sie die folgenden Protokolle während des jeweiligen Zeitrahmens auf Schlüsselwörter wie Fehler, Warnung oder Agent-Übergangsstatus:

Sehen Sie sich das Amazon ECS-Container-Agent-Protokoll unter /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh an.
Sehen Sie sich das Amazon ECS-Init-Protokoll unter /var/log/ecs/ecs-init.log an.
Sehen Sie sich die Docker-Protokolle unter /var/log/docker an.

Hinweis: Sie können zudem den Amazon ECS Logs Collector verwenden, um allgemeine Betriebssystemprotokolle, Docker-Protokolle und Container-Agent-Protokolle für Amazon ECS zu sammeln.

Der Amazon ECS-Container-Agent benötigt lange, um eine bestehende Aufgabe zu beenden

Wenn Ihr Container-Agent neue Aufgaben zum Start von Amazon ECS erhält (von PENDING bis RUNNING), muss er möglicherweise ältere Aufgaben beenden. In diesem Fall startet der Agent diese neuen Aufgaben erst, wenn die alten Aufgaben zuerst beendet wurden.

Um das Stopp- und Start-Timeout von Containern auf Container-Instance-Ebene zu steuern, legen Sie die folgenden beiden Parameter fest:

1.Passen Sie in /etc/ecs/ecs.config den Wert des Parameters ECS_CONTAINER_STOP_TIMEOUT an. Dieser Parameter legt die Zeit fest, die vergeht, bis Amazon ECS Ihre Container zwangsweise beendet, wenn sie nicht automatisch beendet werden.

Hinweis: Der Standardwert für Linux und Windows ist 30 s.

2.Passen Sie in /etc/ecs/ecs.config den Wert des Parameters ECS_CONTAINER_START_TIMEOUT an. Dieser Parameter legt die Zeit fest, die vergeht, bis der Amazon ECS-Container-Agent nicht mehr versucht, den Container zu starten.

Hinweis: Der Standardwert ist 3 m für Linux und 8 m für Windows.

Wenn Ihre Agent-Version 1.26.0 oder höher ist, können Sie die vorherigen Stopp- und Start-Timeout-Parameter pro Aufgabe definieren. Hierdurch kann die Aufgabe in den Status STOPPED übergehen. Nehmen wir beispielsweise an, dass Container A davon abhängig ist, dass Container B den Status COMPLETE, SUCCESS oder HEALTHY erreicht. Wenn Sie keinen startTimeout-Wert für Container B angeben und Container B innerhalb dieser Zeit nicht den gewünschten Status erreicht, wird Container A nicht gestartet.

Ein Beispiel für Container-Abhängigkeit finden Sie im Beispiel: Container-Abhängigkeit auf AWS GitHub.

Ihr Amazon VPC-Routing ist nicht richtig konfiguriert

Überprüfen Sie die Konfiguration für das VPC-Subnetz, in dem Ihre Amazon ECS- oder Fargate-Aufgaben ausgeführt werden. Wenn das Subnetz nicht richtig konfiguriert ist, hat es keinen Zugriff auf Amazon ECS oder Amazon ECR. Um dieses Problem zu beheben, stellen Sie sicher, dass die Routing-Tabelle für Ihr Subnetz über ein Internet-Gateway oder ein NAT-Gateway verfügt. Wenn Sie eine Aufgabe in einem Subnetz starten, das keine Ausgangsroute zum Internet hat, verwenden Sie AWS PrivateLink. Auf diese Weise können Sie mit privaten IP-Adressen privat auf Amazon ECS-APIs zugreifen.

Ein essentieller Container hängt von nicht-essentiellen Containern ab, deren Status nicht HEALTHY ist

Wenn sich Ihre nicht essentiellen Container nicht im Zustand HEALTHY befinden und ein essentieller Container von ihnen abhängt, bleibt Ihre Aufgabe im Status PENDING hängen. In diesem Fall wird die folgende Meldung angezeigt:

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

Um dieses Problem zu beheben, stellen Sie sicher, dass Ihre abhängigen (nicht essentiellen) Container wie erwartet funktionieren. Wenn Sie das zugrundeliegende Problem nicht lösen können, sollten Sie diese Container essentiell machen, um zu vermeiden, dass eine Aufgabe zu lange in PENDING hängen bleibt.

Ähnliche Informationen

Containern-Abhängigkeit

Amazon ECS-Container-Agent (AWS GitHub)

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr