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

3 分钟阅读
0

我设置了一个 Amazon Elastic Compute Cloud(Amazon EC2)自动扩缩组,但它不会终止运行状况不佳的 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 Groups (Auto Scaling 组),然后选择实例的组。
  2. 选择 Instances (实例) 视图,并记下实例的运行状况。

运行状况检查宽限期

运行状况检查宽限期到期之前,Amazon EC2 Auto Scaling 不会根据 EC2 状态检查和 ELB 运行状况检查终止已投入使用的实例。了解宽限期时长的方法如下:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Auto Scaling 下选择 Auto Scaling Groups (Auto Scaling 组),随后选择实例的组。
  2. 选择 Details (详细信息) 视图,并记下 Health Check Grace Period (运行状况检查宽限期) 时长。

暂停的进程

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

  1. Auto Scaling 下(位于 Amazon EC2 console (Amazon EC2 控制台) 导航窗格中),选择 Auto Scaling Groups (Auto Scaling 组),然后选择实例的组。
  2. 选择详细信息视图。
  3. 选择 Edit (编辑) 并从 Suspended Processes (暂停的进程) 中移除以下任意进程(如果出现了这些进程):HealthCheckReplaceUnhealthyTerminate
  4. 选择 Save (保存) 以恢复进程。

Amazon EC2 控制台中的实例状态

Amazon EC2 Auto Scaling 不会立即终止状态为“受损”的实例。相反,Amazon EC2 Auto Scaling 会等待几分钟,以便实例恢复。检查实例是否受损的方法如下:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Instances (实例) 下选择 Instances (实例),然后选择所需实例。
  2. 选择 Status Checks (状态检查) 视图,并注意实例的状态是否为 Impaired (受损)

Amazon EC2 Auto Scaling 还可能会延迟终止或不终止未能报告状态检查数据的实例。如果 Amazon CloudWatch 中的状态检查指标数据不足,通常会发生这种情况。手动终止这些实例的方法如下:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Instances (实例) 下选择 Instances (实例),然后选择所需实例。
  2. 选择 Monitoring (监控) 视图,记下实例的状态。
  3. 如果状态为 Insufficient Data (数据不足),再次选择实例,然后依次选择 Actions (操作) 菜单、Instance State (实例状态)Terminate (终止)

Auto Scaling 组中的实例状态

Amazon EC2 Auto Scaling 不会对处于“备用”状态的实例执行运行状况检查。将处于“备用”状态的实例重新设置为“可用”状态的方法如下:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Auto Scaling Groups (Auto Scaling 组) 下选择实例的组,随后选择 Instances (实例) 视图。
  2. 选择筛选条件菜单 Any Lifecycle State (任何生命周期状态),然后选择 Standby (备用)
  3. 要恢复运行状况检查,请打开实例的上下文菜单(右键单击),随后选择 Set to InService (设置为可用),以便退出“备用”状态

如果 Amazon EC2 Auto Scaling 要等待生命周期挂钩完成,则会延迟终止实例。查找生命周期状态并完成生命周期挂钩的方法如下:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Auto Scaling 下选择 Auto Scaling Groups (Auto Scaling 组),随后选择实例的组。
  2. 选择 Instances (实例) 视图,并记下实例的 Lifecycle (生命周期) 状态。
  3. 如果状态为 terminating:wait,您可以检查心跳超时,随后运行 completing-lifecycle-action 来完成生命周期挂钩。

如果 Amazon EC2 Auto Scaling 要等待 ELB 连接耗尽周期完成,则会延迟终止实例:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Auto Scaling 下选择 Auto Scaling Groups (Auto Scaling 组),随后选择实例的组。
  2. 选择 Instances (实例) 视图,并确认实例的 Lifecycle (生命周期)terminating (正在终止)
  3. 选择 Activity History (活动历史记录) 视图。
  4. 对于 Filter (筛选条件),选择 Waiting for ELB connection draining (正在等待 ELB 连接耗尽) 以确认组是否在等待实例终止。

ELB 运行状况检查

ELB 设置可能会影响运行状况检查和实例替换。请注意 ELB 控制台上的实例状态:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Load Balancing (负载均衡) 下选择 Load Balancers (负载均衡器),随后选择要将实例注册到的负载均衡器。
  2. 选择 Instances (实例) 视图,并记下实例的状态和描述。

如果组的运行状况检查配置设置为 EC2,则 Amazon EC2 Auto Scaling 不会根据 ELB health checks (ELB 运行状况检查) 的结果来确定实例的运行状况。因此,Amazon EC2 Auto Scaling 不会终止未能通过 ELB 运行状况检查的实例。如果 ELB 控制台上的实例状态为“停止服务”,但 Amazon EC2 Auto Scaling 控制台上的实例状态为“运行状况良好”,请确认运行状况检查类型已设置为 ELB:

  1. Amazon EC2 console (Amazon EC2 控制台) 导航窗格中,在 Auto Scaling 下选择 Auto Scaling Groups (Auto Scaling 组),随后选择实例的组。
  2. 选择 Details (详细信息) 视图,并记下 Health Check Type (运行状况检查类型)
  3. 选择 Edit (编辑),再选择 ELB 作为 Health Check Type (运行状况检查类型),然后选择 Save (保存)

如果组的运行状况检查类型已经是 ELB,并且 ELB 控制台上的实例状态为“停止服务”,请根据前面提到的状态描述来确定后续步骤:

  • 仍在注册实例:等待负载均衡器完成实例注册,并等待实例进入 InService (可用) 状态。
  • 实例位于 LoadBalancer 未配置为流量路由目标的 Amazon EC2 可用区中编辑 Auto Scaling 组或负载均衡器的子网,以确保其与实例的子网相同。
  • 实例连续多次未通过已配置的运行状况检查,未通过次数达到 HealthyThreshold:等待 ELB 完成运行状况检查,并等待实例进入 InService (可用) 状态。

相关信息

实例状态检查失败问题排查

为什么 Amazon EC2 Auto Scaling 会终止实例?

AWS 官方
AWS 官方已更新 2 年前