Amazon ECS 集群弹性伸缩 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Amazon ECS 集群弹性伸缩

重要

截至 2022 年 5 月 27 日,Amazon ECS 在管理促进集群 Auto Scaling 的资源方式方面发生了变化。要了解更多信息,请参阅“更新 Amazon ECS 为集群自动扩缩创建资源的方式”。

Amazon ECS 可以管理注册到您的集群的 Amazon EC2 实例的扩展。这称为 Amazon ECS 集群自动扩缩。该操作通过使用启用了托管扩展的 Amazon ECS 自动扩缩组容量提供程序完成。当您使用启用托管扩展的自动扩缩组容量提供程序时,Amazon ECS 会创建两个自定义 CloudWatch 指标和附加到自动扩缩组的目标跟踪扩展策略。然后,Amazon ECS 根据您的任务对集群的负载来管理自动扩缩组的横向缩减和横向扩展操作。有关自动扩缩组容量提供程序的更多信息,请参阅 Auto Scaling 组容量提供程序

注意

仅当使用自动扩缩组容量提供程序时才支持 Amazon ECS 集群自动扩缩。对于托管在 Amazon Fargate 上的 Amazon ECS 工作负载,请参阅 Amazon Fargate 容量提供程序

集群弹性伸缩的工作方式

以下是用于启用 Amazon ECS 集群自动扩缩的基本工作流程。有关更多信息,请参阅开启集群 Auto Scaling

  1. 创建 Auto Scaling 组

  2. 创建使用该自动扩缩组的容量提供程序

  3. 为容量提供程序开启托管扩缩

  4. 将容量提供程序与集群关联

对于与集群关联的每个自动扩缩组容量提供程序,Amazon ECS 将创建和管理以下资源。

  • 指标值低 CloudWatch 告警

  • 指标值高 CloudWatch 告警

  • 目标跟踪扩展策略

    注意

    Amazon ECS 创建目标跟踪扩展策略并将其附加到自动扩缩组。要更新目标跟踪扩展策略,您应该更新容量提供程序管理的扩展设置,而不是直接更新扩展策略。

当您关闭托管扩展或取消容量提供程序与集群的关联时,Amazon ECS 将删除 CloudWatch 指标以及目标跟踪扩展策略资源。

以下指标有助于确定要采取的操作:

  • CapacityProviderReservation - 用于特定容量提供程序的集群容器实例的百分比。Amazon ECS 会生成此指标。

  • DesiredCapacity - Auto Scaling 组的容量值。

Amazon ECS 为与您的集群关联的每个容量提供程序启动集群弹性伸缩流程。Amazon ECS 每分钟都会收集信息,这些信息决定了 Auto Scaling 组是需要横向缩减还是横向扩展。当启动的任务无法放置在可用实例上时,Auto Scaling 组将通过启动新实例进行横向扩展。当正在运行的实例没有任务时,Auto Scaling 组将通过终止没有运行任务的实例来横向缩减。

Amazon ECS 启动 CapacityProviderReservation 指标,然后将该指标发布到 Amazon/ECS/ManagedScaling 命名空间中的 CloudWatch。CapacityProviderReservation 指标会导致以下操作之一:

  • CapacityProviderReservation 值等于 100% - Auto Scaling 组不需要横向缩减或横向扩展,因为所有容器实例都至少运行一个非守护进程任务。

  • CapacityProviderReservation 值大于 100% - 启动的任务没有可用的实例。CapacityProviderReservation 指标会生成 CloudWatch 告警。此告警会更新 Auto Scaling 组的 DesiredCapacity 值。Auto Scaling 组使用此值启动 EC2 实例,然后向集群注册它们。

  • CapacityProviderReservation 值小于 100% - 至少有一个容器实例没有运行非守护进程任务。CapacityProviderReservation 指标会生成 CloudWatch 告警。此告警会更新 Auto Scaling 组的 DesiredCapacity 值。Auto Scaling 组使用此值终止 EC2 容器实例,然后从集群中将其注销。

集群 Auto Scaling 注意事项

使用集群 Auto Scaling 时应考虑以下因素:

  • 与容量提供程序关联的 Auto Scaling 组的所需容量不应由 Amazon ECS 管理的扩展策略进行更改或管理。

  • Amazon ECS 使用 AWSServiceRoleForECS 服务相关 IAM 角色来获取它代表您调用 Amazon Auto Scaling 所需的权限。有关使用和创建 Amazon ECS 服务链接 IAM 角色的更多信息,请参阅 Amazon ECS 的服务相关角色

  • 将容量提供程序与 Auto Scaling 组结合使用时,创建容量提供程序的 IAM 用户需要 autoscaling:CreateOrUpdateTags 权限,因为 Amazon ECS 在将 Auto Scaling 组与容量提供程序关联时会向其添加一个标签。

    重要

    确保您使用的任何工具都不会从 Auto Scaling 组中删除 AmazonECSManaged 标签。如果删除此标签,则 Amazon ECS 无法在扩展集群时对其进行管理。

  • 集群 Auto Scaling 不会修改该组的 MinimumCapacityMaximumCapacity。为了使组横向扩展,MaximumCapacity 的值必须大于 0。

  • 启用 Auto Scaling(托管扩展)时,容量提供程序只能同时连接到一个集群。如果您的容量提供程序已关闭托管扩缩,则可以将其与多个集群关联。

  • 关闭托管扩展后,容量提供程序不会执行横向缩减或横向扩展操作。对于这种情况,您可以使用容量提供程序策略来平衡容量提供程序之间的任务。

  • Amazon ECS 在当前时间对现有容量使用放置策略和放置限制。放置策略可以跨可用区或 Amazon ECS 实例分散任务。这最终会分散所有任务所有实例,以便每个正在运行的任务都在自己的专用实例上启动。为了防止该行为发生,切勿结合使用 spread 策略与 binpack 策略。有关更多信息,请参阅Amazon ECS 任务放置策略

在使用新控制台时,请注意以下几点:

  • 默认情况下,Amazon ECS 托管扩缩功能处于启用状态。有关更多信息,请参阅托管扩展行为

  • 默认情况下,托管终止处于关闭状态。

  • 默认情况下,Auto Scaling 实例横向缩减保护处于关闭状态。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的使用实例横向缩减保护

  • 您的容量提供程序使用的 Auto Scaling 组不能有实例权重设置。与 Amazon ECS 容量提供程序一起使用时,不支持实例权重。

托管式终止保护

Auto Scaling 实例横向缩减保护控制可以终止哪些 EC2 实例。在横向缩减过程中,开启了横向缩减功能的实例无法终止。托管终止保护意味着 Amazon ECS 仅终止没有运行非守护进程 Amazon ECS 任务的 EC2 实例。当您使用托管终止保护时,Amazon ECS 首先为 Auto Scaling 组中的 EC2 实例开启横向缩减保护选项,然后将任务放在实例上。当实例上的所有非守护进程任务停止时,Amazon ECS 将启动横向缩减过程并关闭 EC2 实例的横向缩减保护。然后,Auto Scaling 组可以终止实例。

托管终止保护注意事项

将托管终止保护与新控制台结合使用时,请注意以下事项:

  • Auto Scaling 组会自动配置为使用托管实例保护和托管扩缩。

  • 默认情况下,Auto Scaling 实例横向缩减保护处于关闭状态。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的使用实例横向缩减保护

托管扩展行为

当您拥有使用启用托管扩缩的 Auto Scaling 组容量提供程序时,Amazon ECS 估计要添加到集群的最佳实例数的下限,并使用此值确定要请求的实例数。下面更详细地描述了扩展行为。

  1. 对所有置备任务进行分组,以便每个组具有相同的精确资源需求。

  2. 在组中使用多个实例类型时,Auto Scaling 组中的实例将按其参数(如 vCPU、内存、弹性网络接口(ENI)、端口和 GPU)进行排序。选择每个参数的最小和最大实例类型。

  3. 对于每组任务,Amazon ECS 计算运行未放置任务所需的实例数。此计算使用 binpack 策略,考虑到任务的 vCPU、内存、弹性网络接口 (ENI)、端口和 GPU 要求以及 Amazon EC2 实例的资源可用性。将最大实例类型的值视为最大计算实例计数。最小实例类型的值用作保护。如果最小的实例类型无法运行任务的至少一个实例,则计算会将该任务视为不兼容,并将其排除在横向扩展计算之外。当所有任务都与最小的实例类型不兼容时,集群 Auto Scaling 过程将停止,CapacityProviderReservation 值保持为 100%。

  4. 如果计算的最大实例计数小于最小扩展步长大小,或小于 maximumScalingStepSize 或最大计算的实例计数的较低值,Amazon ECS 将根据 minimumScalingStepSize 发送 CapacityProviderReservation 指标至 CloudWatch。

  5. CloudWatch 告警会使用面向容量提供程序的 CapacityProviderReservation 指标(由 Amazon ECS 发布)并且仅在该值大于 targetCapacity 值时增加 Auto Scaling 组的 DesiredCapacitytargetCapacity 值是在集群弹性伸缩激活期间发送到 CloudWatch 告警的容量提供程序设置。

    您可以在创建 Auto Scaling 组时设置 targetCapacity,或在创建该组后对其进行修改。默认值为 100%。

  6. Auto Scaling 组启动其他 EC2 实例。为防止横向扩展操作过度预置,Auto Scaling 确保最近启动的 EC2 实例容量在启动新实例之前稳定下来。Auto Scaling 检查是否所有现有实例都已通过 instanceWarmupPeriod(当前时间减去实例启动时间)。如果任何实例在 instanceWarmupPeriod 内,在此时间之前,横向扩展一直被阻止。

    新启动实例的默认预热时间为 300 秒。

有关此逻辑如何工作的更详细的说明,请参阅深入了解 Amazon ECS 集群 Auto Scaling

横向扩展注意事项

对于横向扩展过程,请考虑以下几点:

  1. 尽管存在多个放置约束,但我们建议您只使用 distinctInstance 任务放置约束。这可以防止横向扩展过程停止,因为您使用的是与采样实例不兼容的放置约束。

  2. 如果 Auto Scaling 组使用相同或相似的实例类型,则托管扩展效果最佳。有关更多信息,请参阅托管扩展行为

  3. 当需要横向扩展过程且没有可用的容器实例,然后容器实例变为可用时,Amazon ECS 总是横向扩展到 200%(两个实例)。

  4. instanceWarmupPeriod 可能会影响整体扩展限制,因为第二个横向扩展步骤需要等到 instanceWarmupPeriod 时间到期。如果您需要缩短此时间,请确保该值足够大,以便 EC2 实例启动和开始 Amazon ECS 代理(这可防止过度预置)。

  5. 集群 Auto Scaling 支持容量提供程序 Auto Scaling 组中的启动配置、启动模板和多种实例类型。您还可以使用基于属性的实例类型选择而不使用多个实例类型。

  6. 使用带有按需实例和多个实例类型或竞价型实例的 Auto Scaling 组时,请将较大的实例类型放在优先级列表中,并且不指定权重。这时不支持指定权重。有关详细信息,请参见 Amazon Auto Scaling 用户手册中的使用多个实例类型 Auto Scaling 组

  7. 然后,Amazon ECS将启动 minimumScalingStepSize,如果计算的最大实例计数小于最小扩展步长大小,或者 maximumScalingStepSize 或最大计算的实例计数值。

  8. 如果 Amazon ECS 服务或 run-task API 启动了一个任务且容量提供程序容器实例没有足够的资源来开始任务,则 Amazon ECS 会限制每个集群具有此状态的任务数量,并防止任何任务运行超过此限制。有关更多信息,请参阅Amazon ECS 服务配额

托管的横向缩减行为

Amazon ECS 监控集群内每个容量提供程序的容器实例。当至少一个容器实例没有至少一个正在运行的任务时,该容器被视为空且 Amazon ECS 将启动横向缩减流程。下面更详细地描述了横向缩减行为。

  1. Amazon ECS 计算空容器实例的数量。当没有运行无守护进程任务时,容器实例被视为空。

  2. Amazon ECS 将 CapcityProviderReservation 值设置为 100 - 空容器实例的数量。例如,如果空容器实例的数量为 2,则该值设置为 98%。然后,Amazon ECS 将指标发布给 CloudWatch。

  3. CapacityProviderReservation 指标会生成 CloudWatch 告警。此告警会更新 Auto Scaling 组的 DesiredCapacity 值。将发生以下操作之一:

    • 如果您不使用容量提供程序托管终止,Auto Scaling 组将终止 Auto Scaling 组将终止要达到 DesiredCapacity 的 EC2 实例数量的数量。然后,容器实例将从集群中注销。

    • 如果所有容器实例都使用容量提供程序托管终止保护,Amazon ECS 将删除对没有运行非守护进程任务的容器实例的横向缩减保护。然后,Auto Scaling 组将能够终止 EC2 实例。然后,容器实例将从集群中注销。

横向缩减注意事项

对于横向缩减过程,请考虑以下几点:

  • 如果没有正在运行的非守护进程任务,则认为 Amazon ECS 容器实例可用于横向缩减。

  • CloudWatch 横向缩减告警需要 15 个数据点(15 分钟),然后才能开始 Auto Scaling 组的横向缩减过程。在横向缩减过程开始之后,直到 Amazon ECS 需要减少已注册容器实例的数量时,Auto Scaling 组将 DesireCapacity 值设置为每分钟大于一个实例和少于 10%。

  • 当 Amazon ECS 在横向缩减过程中请求横向扩展时(CapcityProviderReservation 大于 100 时),横向缩减过程将停止,如果需要,将从头开始。

目标跟踪考虑因素

在启用托管扩展的情况下创建或更新容量提供程序时,您可以设置 targetCapacity 值,以便不需要等待自动扩缩组启动更多实例即可更快地启动未来的任务。Amazon ECS 使用目标容量值来管理该服务为促进集群自动扩缩而创建的 CloudWatch 指标。Amazon ECS 管理 CloudWatch 指标,因此自动扩缩组被视为稳定状态,因此不需要执行扩展操作。这些值可以是 0-100%。例如,要将 Amazon ECS 配置为在 Amazon ECS 任务使用的容量之外保持 10% 的可用容量,请将目标容量值设置为 90%。

在容量提供程序上设置 targetCapacity 值,应考虑以下因素。

  • 小于 100% 的 targetCapacity 值表示集群中需要存在的可用容量(Amazon EC2 实例)的量。可用容量意味着没有正在运行的任务。

  • 可用区之类的放置约束无需额外的 binpack 即可强制 Amazon ECS 最终为每个实例运行一个任务,这可能不是所需的行为。为了防止该行为发生,切勿结合使用 spread 策略与 binpack 策略。

更新 Amazon ECS 为集群自动扩缩创建资源的方式

截至 2022 年 5 月 27 日,Amazon ECS 在管理促进集群 Auto Scaling 的资源方式方面发生了变化。为了简化体验,Amazon ECS 不再需要在自动扩缩组容量提供程序上启用托管扩展时启用 Amazon Auto Scaling 扩展计划。此更改对您的集群 Auto Scaling 工作流程没有功能影响,也没有定价或性能影响

2022 年 5 月 27 日之前创建并且使用 Amazon Auto Scaling 扩展计划的容量提供程序将像以前一样继续起作用。

请查看以下注意事项:

  • 我们建议您不要更新或删除 ECS-managed Amazon Auto Scaling 扩展计划或与容量提供程序关联的扩展策略资源。

  • 您将能够在 Auto Scaling 控制台上访问集群的扩展计划资源,也可以通过带有附件的 describe-clusters 访问。有关更多信息,请参阅 API 文档 DescribeClusters

  • 充当群集容量提供程序的 Auto Scaling 组不得有任何扩缩策略。

  • 每个账户的 Auto Scaling 计划数量有限。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的您的扩缩计划的配额

截至 2022 年 5 月 27 日,Amazon ECS 不再为新创建的容量提供程序创建 Amazon Auto Scaling 扩展计划。相反,Amazon ECS 使用附加到自动扩缩组的目标跟踪扩展策略,来根据您的目标容量规格执行动态扩展。有关更多信息,请参阅Auto Scaling 组容量提供程序

现在,这种简化的体验使您能够利用带扩展策略的现有自动扩缩组,以便在创建新容量提供程序时使用。我们建议不要修改 ECS 托管的扩展策略(或计划)资源。但是,在创建新的容量提供程序资源时,如果您有自定义的工具来修改 Amazon Auto Scaling 扩展计划,请执行下列操作之一:

  • (推荐)更新容量提供程序以修改 Amazon ECS 托管的扩展设置。有关更多信息,请参阅 UpdateCapacityProvider

  • 更新与自动扩缩组关联的扩展策略以修改使用的目标跟踪配置。有关更多信息,请参阅 PutScalingPolicy