Amazon ECS 集群弹性伸缩 - Amazon Elastic Container Service

Amazon ECS 集群弹性伸缩

重要

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

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

注意

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

集群弹性伸缩的工作方式

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

  1. 创建 自动扩缩组

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

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

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

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

  • 指标值低 CloudWatch 告警

  • 指标值高 CloudWatch 告警

  • 目标跟踪扩展策略

    注意

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

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

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

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

  • DesiredCapacity - 自动扩缩组的容量值。

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

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

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

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

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

集群 Auto Scaling 注意事项

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

  • 请勿更改或管理与容量提供商关联的自动扩缩组的所需容量,该组具有除 Amazon ECS 管理的扩展策略之外的任何扩展策略。

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

  • 将容量提供程序与自动扩缩组结合使用时,对于创建容量提供程序的用户、组或角色需要 autoscaling:CreateOrUpdateTags 权限。这是因为Amazon ECS在将 自动扩缩组与容量提供程序关联时会向其添加一个标签。

    重要

    确保您使用的任何工具都不会从自动扩缩组中删除 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 用户指南 中的使用实例横向缩减保护

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

托管式终止保护

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

托管终止保护注意事项

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

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

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

托管扩展行为

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

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

  2. 在组中使用多个实例类型时,自动扩缩组中的实例将按其参数进行排序。这些参数包括 vCPU、内存、弹性网络接口 (ENI)、端口和 GPU。选择每个参数的最小和最大实例类型。有关如何选择实例类型的更多信息,请参阅《Amazon ECS 最佳实践指南》中的表征应用程序

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

  4. 如果出现以下任一情况,Amazon ECS 会将与 CloudWatch 相关的 CapacityProviderReservation 指标发布给 minimumScalingStepSize。计算的最大实例计数小于最小扩展步长大小。或者,小于 maximumScalingStepSize 或最大计算的实例计数的较低值。

  5. CloudWatch 警报使用容量提供程序的 CapacityProviderReservation 指标。当 CapacityProviderReservation 指标值大于 targetCapacity 值时,告警也会增加自动扩缩组的 DesiredCapacitytargetCapacity 值是在集群自动扩缩激活期间发送到 CloudWatch 警报的容量提供程序设置。

    您可以在创建自动扩缩组时设置 targetCapacity,或在创建该组后修改值。默认值为 100%。

  6. 自动扩缩组启动其他 EC2 实例。为防止横向扩展操作过度预置,Auto Scaling 确保最近启动的 EC2 实例容量在启动新实例之前稳定下来。Auto Scaling 会检查是否所有现有实例都已超过 instanceWarmupPeriod(现在减去实例启动时间)。instanceWarmupPeriod 中的实例无法横向扩展。

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

有关更多信息,请参阅深入了解 Amazon ECS 集群自动扩缩

横向扩展注意事项

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

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

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

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

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

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

  6. 使用带有按需实例和多个实例类型或竞价型实例的 自动扩缩组时,请将较大的实例类型放在优先级列表中,并且不指定权重。这时不支持指定权重。有关详细信息,请参见 AWS 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 将 CapacityProviderReservation 值设置为 100 - 空容器实例的数量。例如,如果空容器实例的数量为 2,则该值设置为 98%。然后,Amazon ECS 将指标发布给 CloudWatch。

  3. CapacityProviderReservation 指标会生成 CloudWatch 告警。此告警会更新 自动扩缩组的 DesiredCapacity 值。然后,发生下列任一操作时:

    • 如果您不使用容量提供程序托管式终止,自动扩缩组将使用自动扩缩组终止策略选择 EC2 实例,并终止这些实例,直至 EC2 实例的数量达到 DesiredCapacity。然后,容器实例将从集群中注销。

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

横向缩减注意事项

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

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

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

  • 当 Amazon ECS 在横向缩减过程中请求横向扩展时(CapacityProviderReservation 大于 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 不再需要在自动扩缩组容量提供程序上启用托管式扩展时启用 AWS Auto Scaling 扩展计划。此更改对您的集群 Auto Scaling 工作流程没有功能影响,也没有定价或性能影响

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

请查看以下注意事项:

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

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

  • 您无法向充当集群容量提供程序的自动扩缩组添加扩缩策略。

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

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

在此新版本中,您可以使用带扩缩策略的现有自动扩缩组,以便在创建新容量提供程序时使用。建议不要修改 ECS 托管的扩展策略或计划资源。但是,在创建新的容量提供程序资源时,如果您有自定义的工具来修改 AWS Auto Scaling 扩展计划,请执行下列操作之一:

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

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