В кластере 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 запускала новое определение задачи вместо старого.
Как я узнал позже, причина отказа от обновления задачи в том, что желаемый счетчик установлен на 2, а доступно только 2 экземпляра EC2. Таким образом, агент ECS пытается сохранить желаемое количество, даже если задача была обновлена.
Решение - иметь один дополнительный экземпляр EC2 (в данном случае 3 экземпляра EC2). Или создайте на один экземпляр больше, чем желаемое количество задач.
Таким образом, новое определение задачи может выполняться на дополнительном экземпляре. После стабилизации на дополнительном экземпляре EC2 агент ECS истощит соединение на двух других экземплярах для старого определения задачи, в то время как балансировщик нагрузки перенаправит трафик на обновленный экземпляр. Агент ECS заменяет старое определение задачи новым. И затем он поддерживает желаемое количество как 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
Альтернативное решение - установить Minimum healthy percent
вариант развертывания услуги в 0
, что приводит к остановке существующих задач до развертывания новой версии.
Это позволяет использовать кластеры с одним экземпляром ec2 с соответствующей экономией средств и т. Д.
Не подходит для производства так как у вас будут простои между развертываниями
Я долго ломал голову над этим и нигде не нашел жизнеспособного решения до прошлой недели.
AWS только что выпустила свой новый API, где у них есть - сила возможность снятия услуги. Проблема с целевой группой, с которой вы столкнулись, просто связана с тем, что целевая группа, зарегистрированная в вашей задаче, уже удалена, и вы не можете привязать к ней новую целевую группу. Итак, поскольку эта задача и служба сейчас повреждены, единственный способ справиться - удалить их, вы не можете его больше обновлять.
Вы можете использовать эту команду, чтобы удалить свою службу сейчас; на прошлой неделе это было невозможно!
aws ecs delete-service --service my-http-service --force true
Надеюсь это поможет