在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服务运行新的任务定义而不是旧的。
正如我后来发现的,不更新任务的原因是所需的计数设置为2,并且只有2个EC2实例可用。 因此,即使任务已更新,ECS代理也会尝试保留所需的计数。
解决scheme – 有一个额外的EC2实例(在这个例子中是3个EC2实例)。 或者比首选的任务数量多一个实例。
这样新的任务定义可以在额外的实例上运行。 在额外的EC2实例上稳定后,ECS代理会将旧的任务定义的其他两个实例的连接耗尽,而负载均衡器会将stream量redirect到更新的实例。 ECS代理将旧的任务定义replace为新的任务定义。 然后它保持所需的计数为2。
另一种解决scheme是将服务的“ Minimum healthy percent
部署选项设置为0
,这将导致现有任务在新版本部署之前停止。
这允许使用单个ec2实例集群,并节约相关成本等
不适合生产,因为您将在部署之间停机