在 EC2 实例终止之前正常关闭 ECS 服务

问题描述 投票:0回答:1

我们的 ECS 集群目前面临一个问题,该问题已解决 使用 AWS CDK 创建。该集群使用 EC2 容量提供程序,我们将 EC2 启动模板中的 machineImage 定义为

ecs.EcsOptimizedImage.amazonLinux2(ecs.AmiHardwareType.GPU)
,它会拉取 SSM 中发布的最新 ECS 优化 AMI。我们的设置包括在集群中运行的一些不同的负载平衡 ECS 服务。

当我们在新的 AMI 可用后使用

cdk deploy
进行部署时,部署过程中就会出现问题。 EC2 自动扩展组开始使用更新的 AMI 启动新实例,并按预期启动滚动更新过程:

Rolling update initiated. Terminating 2 obsolete instance(s) in batches of 1, while keeping at least 2 instance(s) in service. Pausing for PT8M when new instances are added to the autoscaling group.

新实例启动后,其中一个旧实例将按预期终止:

Terminating instance(s) [i-xxxxxxx]; replacing with 1 new instance(s).

但是,在 EC2 实例终止之前,EC2 实例上的 ECS 容器实例不会注销,这会阻止 ECS 收到在该实例上运行的服务将被终止的通知。这会导致该实例上运行的 ECS 服务立即终止,而不是得到妥善处理。因此,负载均衡器会继续将一些请求路由到已终止的服务,直到运行状况检查失败。

我们正在寻找一种方法,在 EC2 实例终止之前正常关闭 EC2 实例上的 ECS 服务,以避免向终止实例提供请求。理想情况下,我们希望从 ECS 取消注册容器实例,确保在 EC2 实例终止之前耗尽所有连接。

任何建议或指导将不胜感激!

amazon-web-services amazon-ecs aws-cdk aws-cdk-typescript
1个回答
0
投票

我最终遵循了这篇博文中提出的建议:https://aws.amazon.com/blogs/compute/how-to-automate-container-instance-draining-in-amazon-ecs/

我将生命周期挂钩附加到 Auto Scaling 组,该钩子在实例终止时向 SNS 主题发送消息。这反过来会触发 Lambda 函数来启动 Step Functions 执行。 Step Function 定义包含两个任务:单个 Lambda 函数任务和“等待 10 秒”任务。 Lambda 函数识别正在关闭的 EC2 实例上运行的容器实例,并将其状态设置为

DRAINING
。然后,它每 10 秒再次调用一次,直到不再找到容器实例或运行任务为零。一旦满足此条件,它就会调用 complete-lifecycle-action API,通知 Auto Scaling 组现在可以安全终止实例。

© www.soinside.com 2019 - 2024. All rights reserved.