我们在 AWS 中有一个 Autoscaling Group,我们目前手动对其进行扩展和缩减。我们的 ASG 目前已附加到一个目标组,其中包含我们所有的生产服务器。
在使用 ASG 之前,我们会从目标组控制台手动向目标组添加和删除服务器,节点会在正确耗尽后注销。我们的应用程序状态非常丰富,因此注销延迟对我们来说非常重要。
昨天,当通过 ASG 界面缩减规模时(具体来说,通过请求减少所需实例数),所有连接都立即断开,这会立即断开数百个连接,而不是遵守目标组的五分钟耗尽策略。
我如何让我的 ASG 遵守我的排水政策?
我尝试过这个: 具有应用程序 LB 和连接耗尽功能的 AWS ASG但它没有将连接设置为“耗尽”,而只是“终止:等待”,并且我的健康检查是健康的,所以我不认为它实际上正在停止新的连接/耗尽。
答案1
正如所述链接答案你需要ASG 生命周期挂钩首先。
每当终止事件发生引发Lambda 函数并且在该 Lambda 中取消注册您的实例来自目标组使用取消注册目标。这应该会将其移动到排水阶段,然后等待您需要等待的时间,一旦实例耗尽,就继续终止。
希望有帮助:)
答案2
除非您需要执行其他任务(而不仅仅是等待目标组上设置的注销延迟),或者实例需要在注销延迟结束后运行一段时间,否则上述操作不是必需的。请务必检查目标组上的注销延迟
当 ASG 缩减规模时(例如,像您一样降低所需容量)。它应该对与其关联的任何 Classic Load Balancer 或目标组进行取消注册调用,然后等待这些取消注册调用完成后再终止实例。
在 TargetGroup 上,状态应列为“正在耗尽”,而在 ASG 的活动历史记录中,它将暂时将该事件的状态列为“正在等待 ELB 连接耗尽”
如果您有一个终止生命周期钩子,则实例将在生命周期钩子启动之前从目标组中取消注册。由于您的实例处于“terminating:wait”状态,因此听起来您的实例正处于终止生命周期钩子的中间,应该已经等待了取消注册延迟。
附注:Classic Load Balancer 使用“连接耗尽”,这与 Application Load Balancer 的“取消注册延迟”不同。一旦该实例不再有正在进行的连接,或者达到配置的超时时间(以较短者为准),连接耗尽将立即结束。