Ecs 服务不更新任务定义

Ecs 服务不更新任务定义

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

答案1

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

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

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

答案2

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

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

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

答案3

要更新服务中运行的“任务”中的任务定义,您需要删除该任务并启动新任务。

通过这种方式,我解决了任务中更新任务定义的问题

我写了以下代码:

    # 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

答案4

这也能起作用。当您在本地计算机上运行 --force-new-deployment 时,它会打开一个 vim 编辑器,并输出 dev/null 命令,这应该可以解决问题。

aws ecs 删除服务 --service my-http-service --force-new-deployment > dev/null

相关内容