本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon ECS 任务放置策略
使用 EC2 启动类型来启动任务时,Amazon ECS 必须根据任务定义中指定的要求(例如 CPU 和内存)确定将任务放置在何处。同样,如果您缩减任务计数,Amazon ECS 必须确定终止哪些任务。您可以应用任务放置策略和约束,自定义 Amazon ECS 如何放置和终止任务。
默认的任务放置策略取决于您是手动运行任务(独立任务)还是在服务中运行任务。对于作为 Amazon ECS 服务的一部分运行的任务,任务放置策略是使用 attribute:ecs.availability-zone
的 spread
。服务中的任务没有默认的任务放置约束。有关更多信息,请参阅在 Amazon ECS 上安排您的容器。
注意
任务放置策略是尽力而为。Amazon ECS 仍会尝试放置任务,即使在大多数最优放置选项不可用时也是如此。但是,任务放置约束是绑定的,它们可能阻止任务放置。
您可以将任务放置策略与约束配合使用。例如,您可以使用任务放置策略和任务放置约束在多个可用区中分配任务,并根据每个可用区中的内存装填任务,但只针对 G2 实例。
Amazon ECS 放置任务时,使用以下流程选择容器实例:
-
确定满足任务定义中的 CPU、GPU、内存和端口要求的容器实例。
-
确定满足任务放置限制的容器实例。
-
确定满足任务放置策略的容器实例。
-
选择用于任务放置的容器实例。
也可以针对现有服务更新任务放置策略。有关更多信息,请参阅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" } ]