控制 Amazon ECS 终止的实例 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

控制 Amazon ECS 终止的实例

重要

您必须在自动扩缩组上启用自动扩缩实例横向缩减保护才能使用集群自动扩缩的托管终止保护功能。

通过托管式终止保护,集群自动扩缩可以控制终止哪些实例。当您使用托管式终止保护时,Amazon ECS 仅终止没有任何正在运行的 Amazon ECS 任务的 EC2 实例。由使用 DAEMON 计划策略的服务运行的任务将被忽略,即使实例正在运行这些任务,也可以通过集群自动扩缩终止该实例。这是因为集群中所有实例均在运行这些任务。

Amazon ECS 首先为自动扩缩组中的 EC2 实例开启实例横向缩减保护选项。然后,Amazon ECS 将任务放在实例上。当实例上的所有非守护进程任务停止时,Amazon ECS 将启动横向缩减过程并关闭 EC2 实例的横向缩减保护。然后,自动扩缩组可以终止实例。

自动扩缩实例横向缩减保护控制自动扩缩可以终止哪些 EC2 实例。在横向缩减过程中,开启了横向缩减功能的实例无法终止。有关自动扩缩实例横向缩减保护的更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的使用实例横向缩减保护

您可以设置 targetCapacity 百分比,以便有备用容量。这有助于更快地启动未来的任务,因为自动扩缩组不必启动更多实例。Amazon ECS 使用目标容量值来管理该服务创建的 CloudWatch 指标。Amazon ECS 管理 CloudWatch 指标。自动扩缩组被视为稳定状态,因此不需要执行扩缩操作。这些值可以是 0-100%。例如,要将 Amazon ECS 配置为在 Amazon ECS 任务使用的容量之外保持 10% 的可用容量,请将目标容量值设置为 90%。在容量提供程序上设置 targetCapacity 值时,请考虑以下因素。

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

  • 可用区之类的放置约束无需额外的 binpack 即可强制 Amazon ECS 最终为每个实例运行一个任务,这可能不是所需的行为。

您必须在自动扩缩组上启用自动扩缩实例横向缩减保护才能使用托管终止保护功能。如果您不开启横向缩减保护,则开启托管终止保护可能会导致不良行为。例如,您的实例可能停留在耗尽状态。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南 中的使用实例横向缩减保护

当您对容量提供程序使用终止保护时,请勿在与容量提供程序关联的自动扩缩组上执行任何手动操作,例如分离实例。手动操作可能会中断容量提供程序的横向缩减操作。如果您将某个实例与自动扩缩组分离,则还需要从 Amazon ECS 集群中取消注册已分离的实例

托管扩展行为

当您拥有使用托管扩缩的自动扩缩组容量提供程序时,Amazon ECS 估计要添加到集群的最佳实例数,并使用该值确定要请求的实例数。

Amazon ECS 通过遵循服务、独立任务或集群默认设置中的容量提供程序策略,为每项任务选择容量提供程序。对于单个容量提供程序,Amazon ECS 将按照其余步骤进行操作。

没有容量提供程序策略的任务会被容量提供程序忽略。没有容量提供程序策略的待处理任务不会导致任何容量提供程序横向扩展。如果任务或服务设置了启动类型,则该任务或服务无法设置容量提供程序策略。

下面更详细地描述了扩展行为。

  • 对此容量提供程序的所有预调配任务进行分组,以便每个组具有相同的精确资源需求。

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

    重要

    如果一组任务的资源需求高于自动扩缩组中最小的实例类型,则该组任务无法使用此容量提供程序运行。容量提供程序不对自动扩缩组进行扩展。任务仍处于 PROVISIONING 状态。

    为防止任务保持 PROVISIONING 状态,建议您针对不同的最低资源要求创建单独的自动扩缩组和容量提供程序。运行任务或创建服务时,仅将容量提供程序添加到容量提供程序策略中,该策略可以在自动扩缩组中最小的实例类型上运行任务。对于其他参数,您可以使用放置约束

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

  • 如果出现以下任一情况,Amazon ECS 会将与 CloudWatch 相关的 CapacityProviderReservation 指标发布给 minimumScalingStepSize

    • 计算的最大实例计数小于最小扩缩步长大小。

    • 小于 maximumScalingStepSize 或最大计算的实例计数的较低值。

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

    默认 targetCapacity 为 100%。

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

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

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

横向扩展注意事项

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

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

  • 如果 自动扩缩组使用相同或相似的实例类型,则托管扩展效果最佳。

  • 当需要横向扩展过程且当前没有正在运行的容器实例时,Amazon ECS 最初总是横向扩展到两个实例,然后执行额外的横向扩展或横向缩减过程。任何额外的横向扩展均会等待实例预热期。对于横向缩减过程,Amazon ECS 在横向扩展过程结束后会等待 15 分钟,然后才会一直启动横向缩减过程。

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

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

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

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

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

托管的横向缩减行为

Amazon ECS 监控集群内每个容量提供程序的容器实例。当容器实例没有运行任何任务时,容器实例被视为空且 Amazon ECS 将启动横向缩减过程。

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

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

下面更详细地描述了横向缩减行为:

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

  2. Amazon ECS 将 CapacityProviderReservation 值设置为 0-100 之间的数字,该数字使用以下公式表示自动扩缩组需要的大小与实际大小的比值,以百分比表示。然后,Amazon ECS 将指标发布给 CloudWatch。有关计算指标的方式的更多信息,请参阅深入了解 Amazon ECS 集群自动扩缩

    CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
  3. CapacityProviderReservation 指标会生成 CloudWatch 告警。此告警会更新 自动扩缩组的 DesiredCapacity 值。然后,发生下列任一操作时:

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

    • 如果所有容器实例都使用托管终止保护,Amazon ECS 将删除对空容器实例的横向缩减保护。然后,自动扩缩组将能够终止 EC2 实例。然后,容器实例将从集群中注销。