AWS ECS使用相同的任务定义和映像重新启动服务,无需停机

Joh*_*uki 8 deployment amazon-web-services amazon-ecs

我正在尝试重新启动AWS服务(基本上停止并启动服务中的所有任务),而不对任务定义进行任何更改.

原因是因为图像的latest每个构建都附有标记.

我已经尝试停止所有任务并让服务重新创建它们但这意味着temporarily unavailable当服务在我的实例中重新启动时会出现一些错误(2).

处理这个问题的最佳方法是什么?说,一个蓝绿色的部署策略,以便没有停机时间?

这就是我目前所拥有的.它的缺点是,我的应用程序会在删除它们后重建服务的任务时停机几秒钟.

configure_aws_cli(){
    aws --version
    aws configure set default.region us-east-1
    aws configure set default.output json
}

start_tasks() {
    start_task=$(aws ecs start-task --cluster $CLUSTER --task-definition $DEFINITION --container-instances $EC2_INSTANCE --group $SERVICE_GROUP --started-by $SERVICE_ID)
    echo "$start_task"
}

stop_running_tasks() {
    tasks=$(aws ecs list-tasks --cluster $CLUSTER --service $SERVICE | $JQ ".taskArns | . []");
    tasks=( $tasks )
    for task in "${tasks[@]}"
    do
        [[ ! -z "$task" ]] && stop_task=$(aws ecs stop-task --cluster $CLUSTER --task "$task")
    done
}

push_ecr_image(){
    echo "Push built image to ECR"
    eval $(aws ecr get-login --region us-east-1)
    docker push $AWS_ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/repository:$TAG
}

configure_aws_cli
push_ecr_image
stop_running_tasks
start_tasks
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 8

使用update-service--force-new-deployment标志:

aws ecs update-service --force-new-deployment --service my-service
Run Code Online (Sandbox Code Playgroud)

  • 不,那是不正确的。`--force-new-deployment` 启动 2 个新任务,将它们注册到 ALB 目标组中,注销之前的任务,耗尽之前任务的连接,然后停止它们。我刚刚确认了。 (5认同)
  • @Xin,您需要提及集群名称 `aws ecs update-service --force-new-deployment --service test --profile test --region us-east-2 --cluster stage-test`,请注意上面的命令重新启动服务而不更改任务定义,当您始终使用“最新”或静态标记和修订时,这很好 (4认同)
  • 在ECS控制台中选择需要重启的服务。转到更新 => 选中强制新部署,并且不要进行任何其他更改。继续浏览屏幕,直到完成该过程。 (3认同)

yur*_*s87 7

等一下。如果我正确理解了您的用例,则可以在官方文档中解决

如果更新后的Docker映像使用的标记与服务中现有任务定义中的标记相同(例如,my_image:latest),则无需为任务定义创建新的修订版。您可以使用以下过程更新服务,保留服务的当前设置,然后选择“强制新部署...”。

为了避免停机,您应该操纵2个参数:最小健康百分比最大百分比

例如,如果您的服务具有所需的四个任务数量,并且最大百分比值为200%,则调度程序可以在停止四个较旧的任务之前启动四个新任务(前提是可以使用执行此任务所需的群集资源)。最大百分比的默认值为200%。

这基本上意味着,无论您的任务定义是否更改以及在多大程度上进行更改,新旧任务之间都可能存在“重叠”,这是实现弹性和可靠性的方法。

更新: 亚马逊刚刚为ECS(EC2和Fargate)引入了外部部署控制器。它包括一个称为TaskSet的新抽象级别。我还没有尝试过,但是对服务和任务管理(支持两个API)的这种细粒度控制可以潜在地解决类似于此的问题。


Eri*_*c N 5

将新映像推送到 Docker 存储库后,您可以创建任务定义的新修订版(它可以与现有任务定义相同)并更新您的服务以使用新的任务定义修订版。这将触发服务部署,您的服务将从您的存储库中提取新映像。

这样您的任务定义保持不变(尽管需要将服务更新到新的任务定义修订版才能触发镜像拉取),并且仍然使用镜像的“最新”标签,但您可以利用 ECS 服务部署避免停机的功能。