

# Amazon ECS 如何将任务放置在容器实例上
<a name="task-placement"></a>

您可以使用任务放置来配置 Amazon ECS，以将您的任务放在满足特定标准（例如可用区或实例类型）的容器实例上。

以下是任务放置组件：
+ 任务放置策略是：用于选择放置任务的容器实例或要终止的任务的算法。例如，Amazon ECS 可以随机选择容器实例；还可以选择一组容器实例，将任务平均分配到其中。
+ 任务组：一组相关的任务，例如数据库任务。
+ 任务放置约束：必须满足这些规则才能在容器实例上放置任务。如果不满足该约束条件，则任务不会被放置并且会保持 `PENDING` 状态。例如，您可以使用约束条件将任务仅放置在特定的实例类型上。

Amazon ECS 针对不同的容量选项提供了不同的算法。

## Amazon ECS 托管实例
<a name="managed-instances-launch-type"></a>

对于在 Amazon ECS 托管实例上运行的任务，Amazon ECS 必须确定任务的放置位置以及在缩减任务数量时终止哪些任务。Amazon ECS 会根据容量提供程序启动模板中指定的实例要求、任务定义中指定的 CPU 和内存等要求以及任务放置约束来做出此决定。

**注意**  
Amazon ECS 托管实例不支持任务放置策略。Amazon ECS 将尽最大努力将任务分散到各个可访问的可用区。

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

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

1. 识别满足任务放置约束的容器实例。

1. 识别符合容量提供程序启动模板中指定的实例要求的容器实例。

1. 选择放置任务的容器实例。

## EC2
<a name="ec2-launch-type"></a>

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

原定设置任务放置策略取决于您是手动运行任务（独立任务）还是在服务中运行任务。对于作为 Amazon ECS 服务的一部分运行的任务，任务放置策略是使用 `attribute:ecs.availability-zone` 的 `spread`。对于不在服务中的任务，没有默认的任务放置约束。有关更多信息，请参阅 [在 Amazon ECS 上计划您的容器](scheduling_tasks.md)。

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

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

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

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

1. 识别满足任务放置约束的容器实例。

1. 识别满足任务放置策略的容器实例。

1. 选择放置任务的容器实例。

## Fargate
<a name="fargate-launch-type"></a>

使用 Fargate 的任务不支持任务放置策略和约束。Fargate 将尽最大努力将任务分散到各个可访问的可用区。如果容量提供程序同时包含 Fargate 和 Fargate Spot，则每个容量提供程序的分散行为是独立的。