在 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