

# 通过集群自动扩缩功能自动管理 Amazon ECS 容量
<a name="cluster-auto-scaling"></a>

Amazon ECS 可以管理注册到您的集群的 Amazon EC2 实例的扩展。这称为 Amazon ECS *集群自动扩缩*。当创建 Amazon ECS Auto Scaling 组容量提供程序时，您可以开启托管式扩缩。然后，您可以为此自动扩缩组中的实例的利用率设置目标百分比（`targetCapacity`）。Amazon ECS 会创建两个自定义 CloudWatch 指标和自动扩缩组的目标跟踪扩缩策略。然后，Amazon ECS 根据您的任务使用的资源利用率来管理横向缩减和横向扩展操作。

对于与集群关联的每个自动扩缩组容量提供程序，Amazon ECS 将创建和管理以下资源：
+ 指标值低 CloudWatch 告警
+ 指标值高 CloudWatch 告警
+ 目标跟踪扩展策略
**注意**  
Amazon ECS 创建目标跟踪扩展策略并将其附加到自动扩缩组。要更新目标跟踪扩展策略，应更新容量提供程序管理的扩展设置，而不是直接更新扩展策略。

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

Amazon ECS 使用以下指标确定要采取的操作：

`CapacityProviderReservation`  
用于特定容量提供程序的容器实例的百分比。Amazon ECS 会生成此指标。  
Amazon ECS 将 `CapacityProviderReservation` 值设置为 0-100 之间的数字。Amazon ECS 使用以下公式来表示自动扩缩组中剩余容量的比率。然后，Amazon ECS 将指标发布给 CloudWatch。有关计算指标的方式的更多信息，请参阅[深入了解 Amazon ECS 集群自动扩缩](https://aws.amazon.com/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/)。  

```
CapacityProviderReservation = (number of instances needed) / (number of running instances) x 100
```

`DesiredCapacity`  
自动扩缩组的容量值。此指标尚未发布到 CloudWatch。

Amazon ECS 将 `CapacityProviderReservation` 指标发布给 `AWS/ECS/ManagedScaling` 命名空间中的 CloudWatch。`CapacityProviderReservation` 指标会导致以下操作之一：

**`CapacityProviderReservation` 值等于 `targetCapacity`**  
自动扩缩组不需要横向缩减或横向扩展。已达到目标利用率的百分比。

**`CapacityProviderReservation` 值大于 `targetCapacity`**  
有更多的任务使用的容量百分比高于您的 `targetCapacity` 百分比。`CapacityProviderReservation` 指标值的增加会导致关联的 CloudWatch 警报生效。此告警会更新 自动扩缩组的 `DesiredCapacity` 值。自动扩缩组使用此值启动 EC2 实例，然后向集群注册它们。  
当 `targetCapacity` 为默认值 100% 时，新任务将在横向扩展期间处于 `PENDING` 状态，因为实例上没有可用容量来运行这些任务。在新实例向 ECS 进行注册后，这些任务将在新实例上启动。

**`CapacityProviderReservation` 值小于 `targetCapacity`**  
使用比您的 `targetCapacity` 百分比低的容量百分比的任务较少，并且至少有一个实例可以被终止。`CapacityProviderReservation` 指标值的减少会导致关联的 CloudWatch 警报生效。此告警会更新 自动扩缩组的 `DesiredCapacity` 值。自动扩缩组使用此值终止 EC2 容器实例，然后从集群中将其注销。  
自动扩缩组遵照组终止策略来确定它在横向缩减事件期间首先终止哪些实例。此外，它还可以避免启用实例横向缩减保护设置的实例。如果您开启托管终止保护，集群自动扩缩可以管理哪些实例具有实例横向缩减保护设置。有关托管终止保护的更多信息，请参阅 [控制 Amazon ECS 终止的实例](managed-termination-protection.md)。有关自动扩缩组终止实例方式的更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[控制在横向缩减期间终止哪些自动扩缩实例](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-instance-protection.html)。

使用集群自动扩缩时应考虑以下因素：
+ 请勿更改或管理与容量提供商关联的自动扩缩组的所需容量，该组具有除 Amazon ECS 管理的扩展策略之外的任何扩展策略。
+ 当 Amazon ECS 从 0 个实例开始横向扩展时，将会自动启动 2 个实例。
+ Amazon ECS 使用 `AWSServiceRoleForECS` 服务相关 IAM 角色来获取它代表您调用 AWS Auto Scaling 所需的权限。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。
+ 将容量提供程序与自动扩缩组结合使用时，对于创建容量提供程序的用户、组或角色需要 `autoscaling:CreateOrUpdateTags` 权限。这是因为Amazon ECS在将 自动扩缩组与容量提供程序关联时会向其添加一个标签。
**重要**  
确保您使用的任何工具都不会从自动扩缩组中删除 `AmazonECSManaged` 标签。如果删除此标签，则 Amazon ECS 无法管理扩缩。
+ 集群自动扩缩不会修改该组的 **MinimumCapacity** 或 **MaximumCapacity**。为了使组横向扩展，**MaximumCapacity** 的值必须大于 0。
+ 启用 Auto Scaling（托管式扩展）时，容量提供程序只能同时连接到一个集群。如果您的容量提供程序已关闭托管扩缩，则可以将其与多个集群关联。
+ 关闭托管式扩展后，容量提供程序不会横向缩减或横向扩展。您可以使用容量提供程序策略来平衡容量提供程序之间的任务。
+ 就容量而言，`binpack` 策略是最有效的策略。
+ 当目标容量低于 100% 时，在放置策略中，`binpack` 策略必须比 `spread` 策略更高阶。这样可以防止容量提供程序在每个任务都有专用实例或达到限制之前横向扩展。

## 开启集群自动扩缩
<a name="cluster-auto-scale-use"></a>

您可以使用控制台或 AWS CLI 开启集群自动扩缩。

当您使用控制台创建使用 EC2 容量提供程序的集群时，Amazon ECS 会代表您创建一个自动扩缩组并设置目标容量。有关更多信息，请参阅 [为 Amazon EC2 工作负载创建 Amazon ECS 集群](create-ec2-cluster-console-v2.md)。

您也可以创建自动扩缩组，然后将其分配给集群。有关更多信息，请参阅 [更新 Amazon ECS 容量提供程序](update-capacity-provider-console-v2.md)。

使用 AWS CLI 时，创建集群后

1. 在创建容量提供程序之前，您需要先创建自动扩缩组。有关更多信息，请参阅**《Amazon EC2 Auto Scaling 用户指南》中的[自动扩缩组](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html)。

1. 使用 `put-cluster-capacity-providers` 修改集群容量提供程序。有关更多信息，请参阅 [开启 Amazon ECS 集群自动扩缩](turn-on-cluster-auto-scaling.md)。