Amazon EC2 Auto Scaling 为何不终止运行状况不佳的实例?

上次更新时间:2018 年 6 月 13 日

我设置了一个 Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling 组,但它不会终止运行状况不佳的 Amazon EC2 实例。如何解决此问题?

简短描述

Amazon EC2 Auto Scaling 可以使用 Amazon EC2 状态检查和 Elastic Load Balancing (ELB) 运行状况检查来自动确定实例的运行状况。Amazon EC2 Auto Scaling 组的所有扩展操作都会被记录到 Amazon EC2 控制台的“活动历史记录”当中。您有时候无法单单借助于“活动历史记录”来确定 Amazon EC2 Auto Scaling 为何不终止运行状况不佳的实例。

您可以在 Amazon EC2 控制台中查找关于运行不正常的实例的状态,以及如何终止该实例的详细信息。检查以下设置:

  • 运行状况检查宽限期
  • 已暂停的进程
  • EC2 控制台中的实例状态
  • Auto Scaling 组中的实例状态
  • ELB 运行状况检查

解决方法

首先,注意 Amazon EC2 Auto Scaling 中实例的状态:

  1. 登录 Amazon EC2 控制台。在导航窗格的 Auto Scaling 下方,选择 Auto Scaling 组,然后选择该实例所在的组。
  2. 选择实例视图,然后记下该实例的运行状况。

运行状况检查宽限期

运行状况检查宽限期结束前,Amazon EC2 Auto Scaling 不会基于 EC2 状态检查和 ELB 运行状况检查来终止某个在运行的实例。要查找宽限期的长度:

  1. 在 Amazon EC2 控制台导航窗格的 Auto Scaling 下方,选择 Auto Scaling 组,然后选择该实例所在的组。
  2. 选择详细信息视图,然后记下运行状况检查宽限期的长度。

已暂停的进程

暂停进程,如 HealthCheck、ReplaceUnhealthy 或 Terminate 等,会影响 Amazon EC2 Auto Scaling 检测、替换或终止运行状况不佳实例的能力:

  1. Amazon EC2 控制台导航窗格的 Auto Scaling 下方,选择 Auto Scaling 组,然后选择该实例所在的组。
  2. 选择详细信息视图。
  3. 选择编辑,然后从已暂停的进程移除以下任何进程(若有):HealthCheckReplaceUnhealthyTerminate
  4. 选择保存以恢复进程。

Amazon EC2 控制台中的实例状态

Amazon EC2 Auto Scaling 不会立即终止 Impaired 状态的实例。相反,Amazon EC2 Auto Scaling 会花几分钟等待实例恢复。要检查某实例是否受损:

  1. 在 Amazon EC2 控制台导航窗格的实例下方,选择实例,然后选择该实例。
  2. 选择状态检查视图,并记下该实例的状态是否为 Impaired

Amazon EC2 Auto Scaling 也可能推迟,或不会终止无法报告状态检查数据的实例。这种情况通常在 Amazon CloudWatch 中的状态检查指标数据不足时发生。要手动终止这些实例:

  1. Amazon EC2 控制台导航窗格的实例下方,选择实例,然后选择该实例。
  2. 选择监控视图,并记下该实例的状态。
  3. 若状态为 Insufficient Data,再次选择该实例,然后依次选择操作菜单、实例状态终止

Auto Scaling 组中的实例状态

Amazon EC2 Auto Scaling 不会对 Standby 状态的实例执行运行状况检查。要将 Standby 实例的状态重新设置为 InService:

  1. Amazon EC2 控制台导航窗格的 Auto Scaling 组下方,选择该实例所在的组,然后选择实例视图。
  2. 选择任何生命周期状态筛选条件菜单,然后选择 Standby
  3. 要恢复运行状况检查,打开实例的上下文(右击)菜单,然后选择设置为 InService,从而退出 Standby 状态

若某实例在等待生命周期挂钩完成,Amazon EC2 Auto Scaling 会等待以终止该实例。要查找生命周期状态并完成生命周期挂钩:

  1. 在 Amazon EC2 控制台导航窗格的 Auto Scaling 下方,选择 Auto Scaling 组,然后选择该实例所在的组。
  2. 选择实例视图,并记下该实例的生命周期状态。
  3. 若状态为 terminating:wait,您可以检查检测信号超时,然后运行 completing-lifecycle-action 以完成生命周期挂钩。

如果 Amazon EC2 Auto Scaling 正在等待 ELB Connection Draining 期结束,它会等待以终止该实例:

  1. 在 Amazon EC2 控制台导航窗格的 Auto Scaling 下方,选择 Auto Scaling 组,然后选择该实例所在的组。
  2. 选择实例视图,并确认该实例的生命周期terminating
  3. 选择活动历史记录视图。
  4. 筛选条件中,选择等待 ELB Connection Draining 以确定所在组是否正在等待终止该实例。

ELB 运行状况检查

ELB 设置可能会影响运行状况检查与实例替换。记下 ELB 控制台中的实例状态:

  1. 在 Amazon EC2 控制台导航窗格的负载均衡下方,选择负载均衡器,然后选择该实例注册的负载均衡器。
  2. 选择实例视图,并记下该实例的状态和描述。

当组的运行状况检查配置设置为 EC2 时,Amazon EC2 Auto Scaling 不会使用 ELB 运行状况检查的结果来确定某实例的运行状况。结果是,Amazon EC2 Auto Scaling 不会终止无法通过 ELB 运行状况检查的实例。如果在 ELB 控制台中,某实例的状态为 OutofService,但它在 Amazon EC2 Auto Scaling 控制台中的状态为 Healthy,确认将运行状况检查类型设置为 ELB:

  1. 在 Amazon EC2 控制台导航窗格的 Auto Scaling 下方,选择 Auto Scaling 组,然后选择该实例所在的组。
  2. 选择详细信息视图,并记下运行状况检查类型
  3. 选择编辑并在运行状况检查类型中选择 ELB ,然后选择保存

若组的运行状况检查类型已经是 ELB,而且该实例在 ELB 控制台中的状态为 OutofService,使用您在之前记下的状态描述来确定后续步骤:

  • 实例注册还在进行中:等待负载均衡器完成实例注册,并且等待实例进入 InService 状态。
  • 实例在 Amazon EC2 可用区中,但 LoadBalancer 的配置未将流量路由到该可用区编辑 Auto Scaling 组的子网或负载均衡器,以确保它们与实例的子网相同。
  • 实例未达到配置的连续运行状况检查的 HealthyThreshold 数量:等待 ELB 完成运行状况检查,并且等待实例进入 InService 状态。

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?