首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有相同任务定义和镜像的AWS ECS重启服务,无需停机

具有相同任务定义和镜像的AWS ECS重启服务,无需停机
EN

Stack Overflow用户
提问于 2017-03-11 20:40:51
回答 7查看 33K关注 0票数 25

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

这样做的原因是因为镜像在每个构建中都附加了latest标签。

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

处理这个问题的最好方法是什么?比如说,一种蓝绿色的部署策略,这样就不会出现停机?

这就是我目前所拥有的。它的缺点是,我的应用程序将关闭几秒钟,因为服务的任务在删除后正在重建。

代码语言:javascript
复制
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
EN

回答 7

Stack Overflow用户

发布于 2018-05-24 05:18:13

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

代码语言:javascript
复制
aws ecs update-service --force-new-deployment --service my-service --cluster cluster-name
票数 40
EN

Stack Overflow用户

发布于 2018-11-18 07:08:36

等一下。如果我理解正确的话,这是在官方的docs中解决的

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

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

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

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

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

票数 10
EN

Stack Overflow用户

发布于 2017-03-15 03:25:22

将新镜像推送到Docker存储库后,您可以使用create a new revision of your task definition (它可以与现有任务定义相同)和update your service来使用新的任务定义版本。这将触发服务部署,并且您的服务将从您的存储库中拉出新的镜像。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42735328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档