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" ]
CMD
oderCMD-SHELL
- um den Befehl mit der Standard-Shell des Containers auszuführencurl -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:8000
fü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 „ 8000
nach“ .http://localhost: