

# 耗尽 Amazon ECS 容器实例
<a name="container-instance-draining"></a>

有时可能需要从集群中移除容器实例；例如，要执行系统更新，或缩减集群容量。Amazon ECS 能够将容器实例转换为 `DRAINING` 状态。这称为*容器实例耗尽*。当某个容器实例设置为 `DRAINING` 时，Amazon ECS 将阻止安排放置在该容器实例上的新任务。

## 服务的耗尽行为
<a name="draining-service-behavior"></a>

作为服务一部分的任何处于 `PENDING` 状态的任务都将立即停止。如果集群中存在可用容器实例容量，则服务计划程序将启动替换任务。如果容器实例容量不足，将发送一条指出问题的服务事件消息。

作为容器实例上处于状态 `RUNNING` 的服务的一部分的任务将转换为状态 `STOPPED`。服务计划程序尝试根据服务的部署类型和部署配置参数、`minimumHealthyPercent` 和 `maximumPercent` 替换任务。有关更多信息，请参阅[Amazon ECS 服务](ecs_services.md)和[Amazon ECS 服务定义参数](service_definition_parameters.md)。
+ 如果 `minimumHealthyPercent` 低于 100%，计划程序在替换任务时可以临时忽略 `desiredCount`。例如，`desiredCount` 为四项任务，如果最小值为 50%，则允许计划程序在开始两项新任务之前终止两项现有任务。如果最小值为 100%，那么在替换任务正常运行之前，服务计划程序无法删除现有任务。如果针对未使用负载均衡器的服务的任务处于 `RUNNING` 状态，则认为这些任务正常运行。服务任务的状态如果为 `RUNNING` 且使用负载均衡器，同时该负载均衡器报告托管该服务任务的容器实例运行正常，则该服务任务运行正常。
**重要**  
如果您使用的竞价型实例和 `minimumHealthyPercent` 大于或等于 100%，则服务将没有足够的时间在竞价型实例终止之前替换任务。
+ `maximumPercent` 参数表示进行任务替换时正在运行的任务数量上限，允许您定义替换批处理大小。例如，如果 `desiredCount` 为四项任务，那么上限 200% 会在停止将要耗尽的四项任务前启动四项新任务（假设需要进行此操作的集群中有可用资源）。如果上限为 100%，只有在耗尽任务停止后才能启动替换任务。
**重要**  
如果 `minimumHealthyPercent` 和 `maximumPercent` 都是 100%，那么服务无法删除现有任务，也无法启动替换任务。这可以防止成功耗尽容器实例并防止进行新的部署。

## 独立任务的耗尽行为
<a name="draining-standalone-behavior"></a>

处于 `PENDING` 或 `RUNNING` 状态的任何独立任务不受影响；您必须等待它们自行停止或手动停止。容器实例将保留在 `DRAINING` 状态。

## Amazon ECS 托管实例的耗尽行为
<a name="managed-instances-draining-behavior"></a>

Amazon ECS 托管实例终止可确保工作负载正常过渡，同时优化成本并保持系统正常运行。终止系统为实例终止提供了三种不同的决策路径，每种路径都有不同的时间特征和客户影响概况。

客户发起的终止  
当您需要立即从服务中移除容器实例时，可直接控制实例移除。您在 `force` 请求参数设置为 true 的情况下运行 `deregister-container-instance`。这意味着尽管有工作负载正在运行，但仍需要立即终止。

系统发起的空闲终止  
Amazon ECS 托管实例通过终止未运行任何任务的闲置 Amazon ECS 容器实例，持续监控并主动优化成本。ECS 使用启发式延迟让容器实例有机会在终止之前获取新启动的任务。可以使用 `scaleInAfter` Amazon ECS 托管实例容量提供程序配置参数进行自定义。

基础设施刷新终止  
Amazon ECS 托管实例会自动管理和更新托管容器实例上的软件，进而确保安全性和合规性，同时保持工作负载可用性。有关更多信息，请参阅 [Amazon ECS 托管实例修补](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/managed-instances-patching.html)。

终止系统实施一种两阶段方法，在工作负载连续性和基础设施管理要求之间取得平衡。

**第 1 阶段：正常完成时间段**  
在此阶段，系统实施正常耗尽策略，优先考虑工作负载连续性。服务任务会通过正常的 Amazon ECS 计划流程正常耗尽。独立任务会持续运行，因为它们可能会自然完成。系统会监控所有任务，确保它们通过自然完成过程达到停止状态。

**第 2 阶段：强制执行硬性截止日期**  
当正常完成无法在可接受的时间范围内实现终止目标时，系统将强制执行硬性截止日期。硬性截止日期通常设定为启动时间加上七天，这样既能为正常完成留出充足的时间，又能满足运营要求。强制执行包括自动强制注销过程，以及无论完成状态如何都立即终止所有剩余任务。

当实例上运行的所有任务都转换为 `STOPPED` 状态时，容器实例已完成排空。在再次激活或删除容器实例之前，容器实例将保持为状态 `DRAINING`。您可以使用带有 `containerInstance` 参数的 [ListTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTasks.html) 操作来验证容器实例上的任务状态，以获取实例上的任务列表，然后使用带有每个任务的 Amazon 资源名称（ARN） 或 ID 的 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) 操作来验证任务状态。

当您准备好容器实例再次开始托管任务时，您可以将容器实例的状态从 `DRAINING` 改为 `ACTIVE`。然后，Amazon ECS 服务调度程序将再次考虑容器实例放置任务。

## 过程
<a name="drain-instances"></a>

可以通过以下步骤使用新的 AWS 管理控制台 将容器实例设置为耗尽。

您还可以使用 [UpdateContainerInstancesState](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateContainerInstancesState.html) API 操作或 [update-container-instances-state](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-container-instances-state.html) 命令将容器实例的状态更改为 `DRAINING`。

**AWS 管理控制台**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面中，选择托管实例的集群。

1. 在 **Cluster : *name***（集群：名称）页面上，选择 **Infrastructure**（基础设施）选项卡。然后，在**容器实例**下，选择要耗尽的每个容器实例的复选框。

1. 依次选择**操作**、**耗尽**。