Der Ecs-Dienst aktualisiert die Aufgabendefinition nicht

8

Im ecs-Cluster läuft ein Dienst mit 2 ec2-Instanzen. Und ich aktualisiere die Aufgabendefinition, um das neue Docker-Image aufzunehmen. Die alte Aufgabendefinition wird jedoch weiterhin ausgeführt, obwohl eine neue Aufgabendefinition vorhanden ist.

Ich habe die folgenden Befehle verwendet, um die Aufgabendefinition und den Dienst zu aktualisieren.

aws ecs register-task-definition --family service90-task --cli-input-json file://service90-task.json

aws ecs update-service --cluster service90-cluster --service service90-service --desired-count 0

TASK_REVISION=`aws ecs describe-task-definition --task-definition service90-task | egrep "revision" | tr "/" " " | awk '{print $2}' | sed 's/"$//'`

aws ecs update-service --cluster service90-cluster --service service90-service --task-definition service90-task:${TASK_REVISION} --desired-count 2

Ich habe es mehrmals versucht, kann aber nicht herausfinden, wo ich falsch gelaufen bin. Ich möchte, dass der ecs-Dienst die neue Aufgabendefinition anstelle der alten ausführt.

Lahiru Liyanapathirana
quelle

Antworten:

7

Wie ich später herausfand, liegt der Grund dafür, dass die Aufgabe nicht aktualisiert wird, darin, dass die gewünschte Anzahl auf 2 gesetzt ist und nur 2 EC2-Instanzen verfügbar sind. Der ECS-Agent versucht also, die gewünschte Anzahl beizubehalten, obwohl die Aufgabe aktualisiert wurde.

Lösung - Haben Sie eine zusätzliche EC2-Instanz (in diesem Fall 3 EC2-Instanzen). Oder haben Sie eine zusätzliche Instanz als die bevorzugte Anzahl von Aufgaben.

Auf diese Weise kann die neue Aufgabendefinition auf der zusätzlichen Instanz ausgeführt werden. Nachdem es auf der zusätzlichen EC2-Instanz stabilisiert wurde, trennt der ECS-Agent die Verbindung auf den beiden anderen Instanzen für die alte Taskdefinition, während der Load-Balancer den Datenverkehr zur aktualisierten Instanz umleitet. Der ECS-Agent ersetzt die alte Aufgabendefinition durch die neuen. Und dann behält es die gewünschte Anzahl als 2 bei.

Lahiru Liyanapathirana
quelle
2

Eine alternative Lösung besteht darin, die Minimum healthy percentBereitstellungsoption des Dienstes auf festzulegen 0, was dazu führt, dass die vorhandenen Aufgaben vor der Bereitstellung der neuen Version gestoppt werden.

Dies ermöglicht die Verwendung einzelner ec2-Instanzcluster mit den damit verbundenen Kosteneinsparungen usw.

Nicht für die Produktion geeignet, da zwischen den Bereitstellungen Ausfallzeiten auftreten

Nick Hammond
quelle
Tage der Untersuchung und des Neustarts des Servers, gelöst durch diese Antwort! Danke :)
Neara
2

So aktualisieren Sie eine Aufgabendefinition in den im Dienst ausgeführten "Aufgaben" Sie müssen die Aufgaben löschen und eine neue Aufgabe starten.

Auf diese Weise löse ich das Problem der Aktualisierung der Aufgabendefinition in Aufgaben

Ich habe folgenden Code geschrieben:

    # Register a new Task definition 
    aws ecs register-task-definition --family testing-cluster --cli-input-json file://scripts/taskdefinition/testingtaskdef.json --region $AWS_REGION

    # Update Service in the Cluster
    aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE --task-definition testing-cluster --desired-count 1 --region $AWS_REGION 



    DECRIBED_SERVICE=$(aws ecs describe-services --region $AWS_REGION --cluster $CLUSTER_NAME --services $SERVICE);
    CURRENT_DESIRED_COUNT=$(echo $DECRIBED_SERVICE | jq --raw-output ".services[0].desiredCount")
    #    - echo $CURRENT_DESIRED_COUNT

    CURRENT_TASK_REVISION=$(echo $DECRIBED_SERVICE | jq -r ".services[0].taskDefinition")
    echo "Current Task definition in Service" + $CURRENT_TASK_REVISION

    CURRENT_RUNNING_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].runningCount")
    echo $CURRENT_RUNNING_TASK

    CURRENT_STALE_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].deployments | .[] | select(.taskDefinition != \"$CURRENT_TASK_REVISION\") | .taskDefinition")
    echo "Task defn apart from current service Taskdefn" +  $CURRENT_STALE_TASK
    #   - echo $CURRENT_STALE_TASK

    tasks=$(aws ecs --region $AWS_REGION list-tasks --cluster $CLUSTER_NAME | jq -r '.taskArns | map(.[40:]) | reduce .[] as $item (""; . + $item + " ")')
    echo "Tasks are as follows" 
    echo $tasks
    TASKS=$(aws ecs --region $AWS_REGION describe-tasks --cluster $CLUSTER_NAME --task $tasks);
    #    - echo $TASKS
    OLDER_TASK=$(echo $TASKS | jq -r ".tasks[] | select(.taskDefinitionArn!= \"$CURRENT_TASK_REVISION\") | .taskArn | split(\"/\") | .[1] ")
    echo "Older Task running  " + $OLDER_TASK
    for old_task in $OLDER_TASK; do
        aws ecs --region us-east-1 stop-task --cluster $CLUSTER_NAME --task $old_task
    done    

    # Run new tasks with the updated new Task-definition
    aws ecs --region $AWS_REGION run-task --cluster $CLUSTER_NAME --task-definition $CURRENT_TASK_REVISION
Roopa
quelle
0

Ich habe mich schon lange am Kopf gekratzt und bis letzte Woche nirgendwo eine praktikable Lösung gefunden.

AWS hat gerade seine neue API veröffentlicht, in der die Option --force zum Entfernen von Diensten verfügbar ist . Das Problem mit der Zielgruppe besteht einfach darin, dass die bei Ihrer Aufgabe registrierte Zielgruppe bereits gelöscht wurde und Sie keine neue Zielgruppe daran binden können. Da diese Aufgabe und dieser Dienst jetzt beschädigt sind, können Sie sie nur löschen. Sie können sie nicht mehr aktualisieren.

Mit diesem Befehl können Sie Ihren Dienst jetzt löschen. es war letzte Woche unmöglich!

aws ecs delete-service --service my-http-service --force true

Hoffe das hilft

neocorp
quelle