部署断路器 - Amazon Elastic Container Service

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

部署断路器

部署断路器是一种滚动更新机制,可确定任务是否达到稳定状态。部署断路器有一个选项,该选项可自动将失败的部署回滚到处于 COMPLETED 状态的部署。

当服务部署更改状态时,Amazon ECS 会向发送服务部署状态更改事件 EventBridge。这提供了一种用于监控服务部署状态的编程方式。有关更多信息,请参阅 Amazon ECS 服务部署状态更改事件。我们建议您创建和监控带有 of eventName 的 EventBridge规则,SERVICE_DEPLOYMENT_FAILED以便您可以采取手动操作开始部署。有关更多信息,请参阅 Amazon EventBridge 用户指南中的创建 EventBridge 规则

当部署断路器确定部署失败时,它会查找处于 COMPLETED 状态的最新部署。这是其用作回滚部署的部署。当回滚开始时,部署将从 COMPLETED 更改为 IN_PROGRESS。这意味着部署在达到 COMPLETED 状态之前不符合再次回滚的资格。当部署断路器找不到处于 COMPLETED 状态的部署时,断路器不会启动新任务,部署将停止。

创建服务时,计划程序会跟踪分两个阶段启动失败的任务。

  • 第 1 阶段-调度程序监视任务以查看它们是否转换到 RUNNING 状态。

    • 成功-部署有可能过渡到 “已完成” 状态,因为有不止一项任务已过渡到 “正在运行” 状态。跳过故障标准,断路器进入第 2 阶段。

    • 失败-连续有任务未转换到 RUNNING 状态,部署可能会转换到 FAILED 状态。

  • 第 2 阶段-当至少有一个任务处于 RUNNING 状态时,部署进入此阶段。断路器会检查当前部署中正在评估的任务的运行状况检查。经过验证的运行状况检查包括 Elastic Load Bal AWS Cloud Map ancing、服务运行状况检查和容器运行状况检查。

    • 成功-至少有一个任务处于运行状态且运行状况检查已通过。

    • 失败-由于运行状况检查失败而被替换的任务已达到失败阈值。

在服务上使用部署断路器方法时,请考虑以下几点。 EventBridge生成规则。

  • DescribeServices 响应提供了对部署状态、rolloutStaterolloutStateReason 的深入了解。启动新部署时,部署状态将在 IN_PROGRESS 状态开始。当服务达到稳定状态时,部署状态将转换为COMPLETED。如果服务未能达到稳定状态并打开了断路器,则部署将转换为 FAILED 状态。FAILED 状态中的部署不会启动任何新任务。

  • 除了 Amazon ECS 为已启动和已完成的部署发送的服务部署状态更改事件外,Amazon ECS 还将在启用断路器的部署失败时发送事件。这些事件提供了有关部署失败的原因或部署是否由于回滚而启动的详细信息。有关更多信息,请参阅 Amazon ECS 服务部署状态更改事件

  • 如果由于以前的部署失败并出现了回滚而启动了新部署,则服务部署状态更改事件的 reason 字段将指示部署是由于回滚而启动的。

  • 部署断路器仅支持使用滚动更新 (ECS) 部署控制器的 Amazon ECS 服务。

  • 您必须使用 Amazon ECS 控制台,或者在使用带有 CloudWatch 选项的部署断路器 AWS CLI 时使用。这种方法的示例是,如果有关更多信息,请参阅《AWS Command Line Interface 参考》中的 使用定义的参数创建服务create-service

以下create-service AWS CLI 示例说明当部署断路器与回滚选项一起使用时,如何创建 Linux 服务。

aws ecs create-service \ --service-name MyService \ --deployment-controller type=ECS \ --desired-count 3 \ --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}" \ --task-definition sample-fargate:1 \ --launch-type FARGATE \ --platform-family LINUX \ --platform-version 1.4.0 \ --network-configuration "awsvpcConfiguration={subnets=[subnet-12344321],securityGroups=[sg-12344321],assignPublicIp=ENABLED}"

例如:

部署 1 处于 COMPLETED 状态。

部署 2 无法启动,所以断路器会回滚到部署 1。部署 1 会过渡到 IN_PROGRESS 状态。

部署 3 启动,但没有处于 COMPLETED 状态的部署,因此部署 3 无法回滚或启动任务。

Failure threshold

部署断路器计算阈值,然后使用该值来确定何时将部署移动到 FAILED 状态。

部署断路器的最小阈值为 3,最大阈值为 200。它使用以下公式中的值来确定部署失败。

Minimum threshold <= 0.5 * desired task count => maximum threshold

当计算结果大于最小值 3 但小于最大值 200 时,失效阈值设置为计算出的阈值(向上舍入)。

注意

您不能更改任何一个阈值。

部署状态检查分两个阶段。

  1. 部署断路器监控部署中的任务并检查处于 RUNNING 状态的任务。调度器在当前部署中的任务位于 RUNNING 状态并进入下一阶段时忽略失败条件。当任务无法到达 RUNNING 状态时,部署断路器将失败计数增加 1。当故障计数等于阈值时,部署将标记为 FAILED

  2. RUNNING状态中有一项或多项任务时,即进入此阶段。部署断路器对当前部署中的任务的以下资源执行运行状况检查:

    • Elastic Load Balancing 负载均衡器

    • AWS Cloud Map 服务

    • Amazon ECS 容器运行状况检查

    当任务的运行状况检查失败时,部署断路器会将失败计数增加 1。当故障计数等于阈值时,部署将标记为 FAILED

下表提供了一些示例。

预期任务计数 计算 Threshold

1

3 <= 0.5 * 1 => 200
3(计算值小于最小值)

25

3 <= 0.5 * 25 => 200
13(此值将向上舍入)

400

3 <= 0.5 * 400 => 200
200

800

3 <= 0.5 * 800 => 200
200(计算值大于最高值)

例如,当阈值为 3 时,断路器开始时故障计数设置为 0。当任务未能达到RUNNING状态时,部署断路器会将失败计数增加一个。当失败计数等于 3 时,部署将标记为FAILED

有关如何使用回滚选项的其他示例,请参阅 Announcing Amazon ECS deployment circuit breaker(宣布推出 Amazon ECS 部署断路器)。