跳至内容

如何配置容量提供商以在运行 Amazon ECS 任务的 Amazon EC2 Auto Scaling 组中保留 Amazon EC2 实例?

2 分钟阅读
0

我的 Amazon Elastic Container Service (Amazon ECS) 集群使用容量提供商。我希望在 Auto Scaling 组中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例有正在运行的任务时保持活动状态。

简短描述

如果您使用容量提供商,则必须配置 Amazon ECS 集群设置,使其在缩减时不会中断正在运行的任务。在 EC2 Auto Scaling 组中实施缩容实例保护,在 Amazon ECS 容量提供商设置中实施托管式自动扩缩保护。此配置可确保 Amazon ECS 保留包含正在运行的任务的实例。

或者,将 Amazon ECS 配置为在停止实例时正常耗尽任务,并保护特定实例免于过早停止。

您的配置使用以下组件:

  • 容量提供商: 容量提供商使用 Auto Scaling 组来动态配置 EC2 实例。
  • 实例耗尽: 当 Auto Scaling 组中的 EC2 实例被标记为终止时,它会进入 DRAINING(正在耗尽)状态,不再接受新任务。正在运行的任务必须完成或移至另一个实例。
  • 集群自动扩缩: 集群自动扩缩使用容量提供商根据任务要求自动扩缩 Auto Scaling 组。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

确保 Amazon ECS 或 Auto Scaling 组在横向缩减期间不会过早终止实例

在集群自动扩缩中使用托管终止保护,必须在 Auto Scaling 组上激活实例缩容保护。此操作可确保 Auto Scaling 组保留包含正在运行的任务的实例。

要激活缩容保护,请运行以下 update-auto-scaling-group AWS CLI 命令:

aws autoscaling update-auto-scaling-group \
  --auto-scaling-group-name my-asg \
  --new-instances-protected-from-scale-in

**注意:**将 my-asg 替换为您的 Auto Scaling 组名称。

然后,运行以下 put-cluster-capacity-providers 命令来激活托管终止保护,以确保 Amazon ECS 保留包含正在运行的任务的实例:

aws ecs put-cluster-capacity-providers \
  --cluster my-cluster \
  --capacity-providers my-capacity-provider \
  --enable-managed-scaling \
  --managed-termination-protection ENABLED

**注意:**将 my-cluster 替换为您的集群名称,将 my-capacity-provider 替换为您的容量提供商名称。

配置 Amazon ECS 以在您移除实例时正常耗尽任务

最佳做法是在将任务从实例中移除时优正常耗尽任务。使用托管实例耗尽来允许 Amazon ECS 在终止前将任务重新安排在其他实例上。

要激活托管实例耗尽,请运行以下 update-capacity-provider 命令:

aws ecs update-capacity-provider \
--name my-cp \
--auto-scaling-group-provider '{
  "managedDraining": "ENABLED"
}

**注意:**将 my-cp 替换为您的容量提供商名称。

在容量允许的情况下,Amazon ECS 将实例上的任务转移到其他实例。但是,Amazon ECS 最多允许在 48 小时内耗尽实例。如果在此时间段之后实例上仍有任务,则 Amazon ECS 将终止该实例并停止其余任务。

保留特定的关键任务

使用任务保护来确保 Amazon ECS 扩缩或部署操作不会停止关键任务。

**重要事项:**即使您激活了任务保护,Amazon ECS 仍然可以终止底层实例。任务保护仅保护任务不被停止。

要激活任务保护,请运行以下 update-task-protection 命令:

aws ecs update-task-protection \
--cluster my-cluster \
--tasks my-task-id \
--protection-enabled

**注意:**将 my-cluster 替换为您的集群名称,将 my-task-id 替换为您的任务 ID。默认情况下,保护持续 2 小时。要更改此持续时间,请使用 --expires-in-minutes 选项。

要检查集群中任务保护的状态,请运行以下 get-task-protection 命令:

aws ecs get-task-protection \
--cluster my-cluster \
--tasks my-task-id

**注意:**将 my-cluster 替换为您的集群名称,将 my-task-id 替换为您的任务 ID。

解决更多问题

如果您为 Auto Scaling 组、容量提供商和任务激活保护,但仍然遇到问题,请执行以下操作:

相关信息

保护您的 Amazon ECS 任务不因缩容事件而被终止

GetTaskProtection

UpdateTaskProtection

GitHub 网站上的 Amazon Elastic Container Service (Amazon ECS) task protection examples

AWS 官方已更新 1 年前