Служба Ecs не обновляет определение задачи

8

В кластере ecs у меня есть служба, работающая с двумя экземплярами ec2. И я обновляю определение задачи, чтобы взять новый образ докера. Но старое определение задачи все еще выполняется, хотя существует новое определение задачи.

Я использовал следующие команды для обновления определения задачи и службы.

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

Я пытался несколько раз, но не могу понять, где я ошибся. Я хочу, чтобы служба ecs запускала новое определение задачи вместо старого.

Лахиру Лиянапатирана
источник

Ответы:

7

Как я выяснил позже, причина не обновления задачи заключается в том, что желаемое количество равно 2, и доступны только 2 экземпляра EC2. Таким образом, агент ECS пытается сохранить желаемый счет, даже если задача была обновлена.

Решение - иметь один дополнительный экземпляр EC2 (в данном случае 3 экземпляра EC2). Или есть один дополнительный экземпляр, чем предпочтительное количество задач.

Таким образом, новое определение задачи может выполняться на дополнительном экземпляре. После стабилизации в дополнительном экземпляре EC2 агент ECS истощит соединение в двух других экземплярах для старого определения задачи, а балансировщик нагрузки перенаправит трафик в обновленный экземпляр. Агент ECS заменяет старое определение задачи новыми. И тогда он поддерживает желаемый счет как 2.

Лахиру Лиянапатирана
источник
2

Альтернативное решение состоит в том, чтобы установить параметр Minimum healthy percentразвертывания службы 0, что приводит к остановке существующих задач перед развертыванием новой версии.

Это позволяет использовать одиночные кластеры экземпляров ec2 с соответствующей экономией затрат и т. Д.

Не подходит для производства, так как между развертываниями будет простой

Ник Хаммонд
источник
Дни исследования и перезагрузки сервера, решаемые этим ответом! Спасибо :)
Неара
2

Чтобы обновить определение задачи в «задачах», запущенных в сервисе, необходимо удалить задачи и запустить новую задачу.

Таким образом, я решаю проблему обновления определения задач в задачах.

Я написал следующий код:

    # 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
источник
0

Я долго ломал голову над этим и до прошлой недели нигде не нашел жизнеспособного решения.

AWS только что выпустила новый API, в котором есть опция --force для удаления службы. Проблема Целевой группы, с которой вы сталкиваетесь, заключается просто в том, что Целевая группа, зарегистрированная в вашей задаче, уже удалена, и вы не можете привязать к ней новую Целевую группу. Таким образом, поскольку эта задача и служба повреждены, единственный способ решить проблему - удалить ее, вы больше не можете ее обновлять.

Вы можете использовать эту команду, чтобы удалить ваш сервис сейчас; это было невозможно на прошлой неделе!

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

Надеюсь это поможет

neocorp
источник