HealthCheck bei ECS-Aufgabe ohne ELB

HealthCheck bei ECS-Aufgabe ohne ELB

Wir haben einen Docker-Container (Spring Boot), der in einem ECS-Cluster ausgeführt wird. Wir führen ihn ohne Elastic Load Balancing aus.

Wir möchten den Dienst ohne Ausfallzeiten aktualisieren, sodass die alte Aufgabe gestoppt wird, wenn die neue Aufgabe aktiv und fehlerfrei ist. Wir haben versucht, der Aufgabendefinition eine Integritätsprüfung hinzuzufügen, aber das funktioniert nicht. Ich habe diese grundlegenden Integritätsprüfungsbefehle ausprobiert.

[ "CMD-SHELL","exit 0" ]
[ "CMD-SHELL","exit 1" ]

Ich würde erwarten, dass im ersten Fall eine Aufgabe mit einem GESUNDHEITSZUSTAND entsteht und im zweiten Fall die Integritätsprüfungen fehlschlagen. In beiden Fällen startet die neue Aufgabe einwandfrei, allerdings mit einem UNBEKANNTEN Integritätszustand.

Hat das etwas damit zu tun, dass wir keinen ELB verwenden? Die Dokumentation ist nicht sehr gut und meine Google-Suchen haben nichts Nützliches ergeben.

Antwort1

Die Antwort von Raja und die von Andrew bearbeitete Antwort sind für ECS/FARGATE etwas daneben. Sie ist ohne Klammern und ohne Anführungszeichen:

CMD-SHELL, curl -f http://localhost/ || exit 1

Dies ist das richtige Format für die Eingabe von Integritätsprüfinformationen in die Aufgabendefinitionen von ECS.

GÜLTIGE DOKUMENTATIONhttps://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_healthcheck

KEINE GÜLTIGE DOKUMENTATION für ECS/FARGATE https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_HealthCheck.html

Antwort2

Der Given-Befehl ist syntaktisch ungültig.

es sollte sein

[ "CMD-SHELL", "curl -f http://localhost/ || exit 1" ]
  • CMDoder CMD-SHELL- um den Befehl mit der Standard-Shell des Containers auszuführen
  • curl -f http://localhost/ – tatsächlicher Befehl, der innerhalb des Containers ausgeführt werden muss, um die Integritätsprüfung zu validieren.
  • exit 1 - Wenn der Curl-Befehl fehlschlägt, wird die Shell beendet

Sie sollten Ihren Befehl also wie unten beschrieben ändern.

[ "CMD-SHELL", "echo hi || exit 1" ]

„echo hi“ ist der Befehl zur Integritätsprüfung. In meinem Beispiel können Sie anstelle von „echo hi“ jeden beliebigen Befehl ausführen, der den Exit-Status 0 zurückgeben sollte, wenn er in Ihrem Container erfolgreich ausgeführt wird.

Antwort3

Wenn Sie ecs-cli verwenden, um Ihre Fargate-Dienste bereitzustellen, müssen Sie meiner Erfahrung nach auf etwas aktualisieren, das den Healthcheck in der Aufgabendefinition unterstützt. Ich habe auch festgestellt, dass die Verwendung von CMD-SHELL nicht erforderlich ist. Tatsächlich wird es unterbrochen, wenn Sie es hinzufügen, indem Ihre CMD-SHELL mit einer anderen CMD-SHELL im resultierenden JSON der generierten Aufgabendefinition umschlossen wird (wie in der AWS-Konsole angezeigt).

Was bei mir funktioniert hat, war ein Upgrade von 1.4.0 auf 1.7.0 von ecs-cli und das anschließende Hinzufügen von healthcheck in der Datei ecs-params.yml unter dem Dienst:

task_definition:
  ecs_network_mode: awsvpc
  task_role_arn: arn:aws:iam::........
  task_execution_role: arn:aws:iam::........
  task_size:
    cpu_limit: 2048
    mem_limit: 4GB
  services:
    foo:
      healthcheck:
        command: ps cax | grep "[p]ython"
        interval: 30s
        timeout: 10s
        retries: 2
      essential: true

Antwort4

Wenn Ihre „Portzuordnungen“ beispielsweise 8000:8000für „ECS EC2“ oder 8000 tcp„ECS Fargate“ sind, lautet der „Befehl“ von „HEALTHCHECK“:

CMD-SHELL, curl -f http://localhost:8000/ || exit 1

Vergessen Sie in diesem Fall nicht „ 8000nach“ .http://localhost:

verwandte Informationen