Amazon ECS 任务放置策略 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon ECS 任务放置策略

使用 EC2 启动类型来启动任务时,Amazon ECS 必须根据任务定义中指定的要求(例如 CPU 和内存)确定将任务放置在何处。同样,如果您缩减任务计数,Amazon ECS 必须确定终止哪些任务。您可以应用任务放置策略和约束,自定义 Amazon ECS 如何放置和终止任务。

默认的任务放置策略取决于您是手动运行任务(独立任务)还是在服务中运行任务。对于作为 Amazon ECS 服务的一部分运行的任务,任务放置策略是使用 attribute:ecs.availability-zonespread。服务中的任务没有默认的任务放置约束。有关更多信息,请参阅在 Amazon ECS 上安排您的容器

注意

任务放置策略是尽力而为。Amazon ECS 仍会尝试放置任务,即使在大多数最优放置选项不可用时也是如此。但是,任务放置约束是绑定的,它们可能阻止任务放置。

您可以将任务放置策略与约束配合使用。例如,您可以使用任务放置策略和任务放置约束在多个可用区中分配任务,并根据每个可用区中的内存装填任务,但只针对 G2 实例。

Amazon ECS 放置任务时,使用以下流程选择容器实例:

  1. 确定满足任务定义中的 CPU、GPU、内存和端口要求的容器实例。

  2. 确定满足任务放置限制的容器实例。

  3. 确定满足任务放置策略的容器实例。

  4. 选择用于任务放置的容器实例。

也可以针对现有服务更新任务放置策略。有关更多信息,请参阅Amazon ECS 任务放置

您可以按照您希望的执行顺序创建策略阵列,从而创建使用多种策略的任务置放策略。例如,如果您想将任务分散到多个可用区,然后根据每个可用区内的内存装填任务,请指定可用区策略,然后指定内存策略。有关策略示例,请参阅 策略示例

策略类型

Amazon ECS 支持以下任务放置策略:

binpack

将任务放置在容器实例上,以保留最少的未使用 CPU 或内存。此策略最大限度地减少了正在使用的容器实例的数量。

当使用此策略并执行横向缩减操作时,Amazon ECS 将终止任务。它根据任务终止后留在容器实例上的资源量执行此操作。任务终止后剩下可用资源最多的容器实例将终止该任务。

random

任务随机放置。

spread

根据指定的值均匀放置任务。接受的值为 instanceId(或具有相同效果的 host)或应用于容器实例的任何平台或自定义属性,如 attribute:ecs.availability-zone

服务任务根据该服务的任务分布。独立任务根据同一任务组中的任务分布。有关任务组的更多信息,请参阅 任务组

当使用 spread 策略并采取横向缩减行动时,Amazon ECS 将选择要终止的任务,以保持可用性区域之间的平衡。在可用区域内,将随机选择任务。

策略示例

您可以使用以下操作指定任务放置策略:CreateServiceUpdateService、和RunTask

跨可用区平均分配任务

以下策略可在各可用区之间平均分配任务。

"placementStrategy": [ { "field": "attribute:ecs.availability-zone", "type": "spread" } ]

在所有实例上平均分配任务

以下策略可在所有实例中平均分配任务。

"placementStrategy": [ { "field": "instanceId", "type": "spread" } ]

基于内存的垃圾箱任务

以下策略根据内存装填任务。

"placementStrategy": [ { "field": "memory", "type": "binpack" } ]

随机置放任务

以下策略随机放置任务。

"placementStrategy": [ { "type": "random" } ]

以下策略跨可在多个可用区中平均分配任务,然后在每个可用区内的实例中平均分配任务

以下策略跨可在多个可用区中平均分配任务,然后在每个可用区内的实例中平均分配任务。

"placementStrategy": [ { "field": "attribute:ecs.availability-zone", "type": "spread" }, { "field": "instanceId", "type": "spread" } ]

在多个可用区中平均分配任务,然后根据每个可用区内的内存装填任务

以下策略可在多个可用区中平均分配任务,然后根据每个可用区内的内存装填任务。

"placementStrategy": [ { "field": "attribute:ecs.availability-zone", "type": "spread" }, { "field": "memory", "type": "binpack" } ]

在实例之间平均分配任务,然后根据内存装填任务

以下策略将任务平均分配给所有实例,然后根据每个实例中的内存装填任务。

"placementStrategy": [ { "field": "instanceId", "type": "spread" }, { "field": "memory", "type": "binpack" } ]