Ecs服务不会更新任务定义


8

在ecs集群中,我有一个运行有2个ec2实例的服务。然后我更新任务定义以获取新的docker映像。但是,即使有新的任务定义,旧的任务定义仍在运行。

我已使用以下命令来更新任务定义和服务。

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服务运行新的任务定义而不是旧的任务定义。

Answers:


7

稍后我发现,不更新任务的原因是所需的计数设置为2,并且只有2个EC2实例可用。因此,即使任务已更新,ECS代理也会尝试保留所需的计数。

解决方案-拥有一个额外的EC2实例(在本例中为3个EC2实例)。或者有一个比首选任务数量更多的实例。

这样,新任务定义可以在额外实例上运行。在额外的EC2实例上将其稳定之后,ECS代理将耗尽其他两个实例上的旧任务定义的连接,而负载均衡器会将流量重定向到更新的实例。ECS代理将旧任务定义替换为新任务定义。然后将所需的计数保持为2。


2

一种替代解决方案是Minimum healthy percent将服务的部署选项设置为0,这将导致在部署新版本之前停止现有任务。

这允许使用单个ec2实例集群,并节省相关成本等

不适合生产,因为两次部署之间会有停机时间


经过几天的调查和重新启动服务器,此答案解决了!谢谢:)
Neara

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

0

我为此一直摸索了很长时间,直到上周才找到任何可行的解决方案。

AWS刚刚发布了其新API,其中具有--force选项以删除服务。您面临的目标组问题仅是因为在您的任务中注册的目标组已被删除,并且您无法将新的目标组绑定到该目标组。因此,由于此任务和服务现在已损坏,因此唯一的处理方法是删除它, 因此无法再对其进行更新。

您现在可以使用此命令删除服务;上周不可能!

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

希望这可以帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.