Auto Scaling 实例的运行状况检查 - Amazon EC2 Auto Scaling
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Auto Scaling 实例的运行状况检查

Auto Scaling 实例的运行状态说明该实例运行正常或不正常。Auto Scaling 组中所有实例在开始启动时都处于良好运行状态。除非 Amazon EC2 Auto Scaling 收到实例运行状况不佳的通知,否则将认为它们运行状况良好。此通知可能来自 Amazon EC2、Elastic Load Balancing 或自定义运行状况检查等来源。Amazon EC2 Auto Scaling 检测到任何运行不正常的实例时,它会将其终止并启动一个新实例。

运行状况检查类型

Amazon EC2 Auto Scaling 可以使用下列一项或多项运行状况检查来确定实例的运行状态:

运行状况检查类型 检查内容

Amazon EC2 状态检查和计划事件

  • 检查实例是否正在运行

  • 检查可能会影响实例的潜在硬件或软件问题

这是自动扩缩组的默认运行状况检查类型。

Elastic Load Balancing 运行状况检查

  • 检查负载均衡器是否将实例报告为运行正常,以确认实例是否可用于处理请求

要运行此运行状况检查类型,您必须为自动扩缩组启用此运行状况检查。

自定义运行状况检查

  • 根据自定义运行状况检查的结果,检查可能表明实例存在运行状况问题的其他问题。

Amazon EC2 运行状况检查

实例启动后,它会附加到 Auto Scaling 组并进入 InService 状态。要详细了解 Auto Scaling 组中实例的不同生命周期状态,请参阅 Amazon EC2 Auto Scaling 实例生命周期

Amazon EC2 Auto Scaling 通过定期检查自动扩缩组中所有实例的运行状态,以确保所有实例都在运行并且运行正常。

状态检查

Amazon EC2 Auto Scaling 使用 Amazon EC2 实例状态检查和系统状态检查的结果来确定实例的运行状况。如果实例状态是除 running 以外的其他 Amazon EC2 状态,或者状态检查的状态变为 impaired,则 Amazon EC2 Auto Scaling 会认为实例运行不正常并予以替换。这包括当实例为任何以下状态时:

  • stopping

  • stopped

  • shutting-down

  • terminated

Amazon EC2 状态检查不需要任何特殊配置,并且始终处于启用状态。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的状态检查类型

重要

Amazon EC2 Auto Scaling 会允许这些状态检查偶尔失败,而不执行任何操作。当状态检查失败时,Amazon EC2 Auto Scaling 将等待几分钟,以便 Amazon 修复此问题。它不会在状态检查的状态变为 impaired 时立即将实例标记为运行不正常。

但如果 Amazon EC2 Auto Scaling 检测到实例不再处于 running 状态,这种情况将被视为立即失败。在这种情况下,它会立即将实例标记为运行不正常并予以替换。

计划的事件

Amazon EC2 偶尔可以将实例上的事件安排在特定时间戳之后运行。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的实例的计划事件

如果其中一个实例受到计划事件的影响,则 Amazon EC2 Auto Scaling 会认为实例运行不正常并将其替换。在到达时间戳中指定的日期和时间之前,实例不会开始终止。

Elastic Load Balancing 运行状况检查

当您为自动扩缩组启用了 Elastic Load Balancing 运行状况检查时,Amazon EC2 Auto Scaling 还使用这些运行状况检查的结果来确定实例的运行状态。

您必须首先完成以下操作,然后才能为自动扩缩组启用 Elastic Load Balancing 运行状况检查:

  • 设置一个 Elastic Load Balancing 负载均衡器并为其配置运行状况检查,以便该负载均衡器用来确定实例是否运行正常。

  • 将负载均衡器附加到自动扩缩组

完成前提操作后,将会出现以下情况:

  • Amazon EC2 Auto Scaling 会将自动扩缩组中的实例注册到该负载均衡器。

  • 实例完成注册后,它会进入 InService 状态并可与该负载均衡器一起使用。

预设情况下,Amazon EC2 Auto Scaling 会忽略 Elastic Load Balancing 运行状况检查的结果。但是,您可以为自动扩缩组启用这些运行状况检查。完成此操作后,当 Elastic Load Balancing 报告某个注册的实例为 unhealthy 时,Amazon EC2 Auto Scaling 会在下一次定期运行状况检查中将实例标记为 unhealthy 并予以替换。

如果为负载均衡器启用了连接耗尽(注销延迟),则在终止运行不正常的实例之前,Amazon EC2 Auto Scaling 会等待进行中的请求完成或等待最大超时过期。

要了解详情,包括如何为自动扩缩组启用 Elastic Load Balancing 运行状况检查,请参阅向 Auto Scaling 组添加 Elastic Load Balancing 运行状况检查

注意

当您为某个组启用 Elastic Load Balancing 运行状况检查时,Amazon EC2 Auto Scaling 可以终止和替换报告为运行不正常的实例,但仅在负载均衡器处于 InService 状态后才会执行此操作。有关更多信息,请参阅了解负载均衡器的附加状态

自定义运行状况检测

您还可能会需要在自动扩缩组中的实例上运行自定义运行状况检测任务,如果任务失败,则将实例的运行状况设为运行不正常。从而通过组合使用自定义运行状况检查、Amazon EC2 状态检查和 Elastic Load Balancing 运行状况检查(如果启用)来扩展运行状况检查的范围。

您可以使用 Amazon CLI 或 SDK 将实例运行状况信息直接发送到 Amazon EC2 Auto Scaling。以下示例演示如何使用 Amazon CLI 配置实例的运行状况,然后验证实例的运行状况。

使用以下 set-instance-health 命令,将指定实例的运行状态设置为 Unhealthy

aws autoscaling set-instance-health --instance-id i-1234567890abcdef0 --health-status Unhealthy

默认情况下,此命令会执行运行状况检查宽限期。不过,您可以通过包括 --no-should-respect-grace-period 选项来覆盖此行为,不执行此宽限期。

使用以下 describe-auto-scaling-groups 命令验证实例状态为 Unhealthy

aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg

下面是一个示例响应,说明实例的运行状况为 Unhealthy 并且实例正在终止。

{ "AutoScalingGroups": [ { .... "Instances": [ { "ProtectedFromScaleIn": false, "AvailabilityZone": "us-west-2a", "LaunchTemplate": { "LaunchTemplateName": "my-launch-template", "Version": "1", "LaunchTemplateId": "lt-1234567890abcdef0" }, "InstanceId": "i-1234567890abcdef0", "HealthStatus": "Unhealthy", "LifecycleState": "Terminating" }, ... ] } ] }

替换运行不正常的实例

如果 Amazon EC2 Auto Scaling 确定某个 InService 实例运行不正常,则会将其终止并启动一个新的替换实例。新实例使用 Auto Scaling 组的当前设置及其关联的启动模板或启动配置启动。

Amazon EC2 Auto Scaling 将创建用于终止运行状况不佳的实例的新扩展活动,然后终止该实例。在实例终止期间,另一个扩缩活动将会启动一个新实例。

查看运行状况检查失败原因(控制台)
  1. 访问 https://console.aws.amazon.com/ec2/,打开 Amazon EC2 控制台,然后从导航窗格中选择 Auto Scaling Groups(Auto Scaling 组)。

  2. 选中 Auto Scaling 组旁边的复选框。

    这时将在 Auto Scaling groups(Auto Scaling 组)页面底部打开一个拆分窗格。

  3. 活动选项卡的活动历史记录下,状态列显示您的 Auto Scaling 组是否已成功启动或终止实例。

    如果它终止了任何运行状况不佳的实例,原因列显示终止的日期和时间以及运行状况检查失败的原因。例如,At 2022-05-14T20:11:53Z an instance was taken out of service in response to an ELB system health check failure

Amazon EC2 Auto Scaling 如何尽可能减少停机时间

因运行状况检查的结果而替换实例时,需要首先终止实例,这可能导致在新实例启动之前无法接受新请求。

如果 Amazon EC2 Auto Scaling 确定任何实例不再运行或已由 set-instance-health 命令标记为运行不正常,则会立即将其替换。但如果发现其他实例运行不正常,Amazon EC2 Auto Scaling 将使用以下故障恢复方法。这种方法可尽可能减少可能因临时问题或运行状况检查配置错误导致的任何停机时间。

  • 如果正在进行某个扩缩活动并且您的自动扩缩组低于所需容量 10% 或以上,则 Amazon EC2 Auto Scaling 会首先等待进行中的扩缩活动完成,然后再替换运行不正常的实例。

  • 在进行横向扩展时,Amazon EC2 Auto Scaling 将首先等待实例通过初始运行状况检查。它还会等待默认实例预热完成,以确保新实例准备就绪。

  • 在实例完成预热并且该组升至所需容量的 90% 以上后,Amazon EC2 Auto Scaling 将替换运行不正常的实例,如下所示:

    • Amazon EC2 Auto Scaling 一次只替换该组所需容量的 10%。它将在所有运行不正常的实例都被替换之前持续这样操作。

    • 在替换实例时,它会等待新实例通过初始运行状况检查。它还会等待默认的实例预热期结束,然后再继续操作。

注意

如果某个自动扩缩组的容量非常小,以至于容量的 10% 小于 1,则 Amazon EC2 Auto Scaling 将改为一次替换一个运行不正常的实例。这可能会导致该组出现短暂停机。

此外,如果 Elastic Load Balancing 运行状况检查报告自动扩缩组中的所有实例都不正常,并且负载均衡器位于 InService 状态,则 Amazon EC2 Auto Scaling 可能会减少一次标记为运行不正常的实例数量。这可能会导致一次替换的实例数量少于在其他场景中执行的 10% 这一比例。从而您有时间来解决问题,无需 Amazon EC2 Auto Scaling 自动终止整个组。

运行状况检查注意事项

这一部分包含了有关 Amazon EC2 Auto Scaling 运行状况检查的注意事项。

  • 如果您需要在正在终止的实例上或正在启动的实例上执行某些操作,则可以使用生命周期钩子。借助这些钩子,您可以在 Amazon EC2 Auto Scaling 启动或终止实例时执行自定义操作。有关更多信息,请参阅Amazon EC2 Auto Scaling 生命周期钩子

  • Amazon EC2 Auto Scaling 没有提供从运行状况检查中移除 Amazon EC2 状态检查和计划事件的方法。如果您不想替换实例,则建议暂停任何单个 Auto Scaling 组的 ReplaceUnhealthyHealthCheck 进程。有关更多信息,请参阅暂停和恢复 Auto Scaling 组的进程

  • 您可以尝试使用 set-instance-health 命令,从而手动将运行不正常实例的运行状态重新设置为正常。如果您收到错误消息,则可能是因为该实例已经开始终止。通常,使用 set-instance-health 命令将实例的运行状态重新设置为正常的方法仅在 ReplaceUnhealthy 进程或 Terminate 进程已暂停时有用。

  • Amazon EC2 Auto Scaling 不会对处于 Standby 状态的实例执行运行状况检查。有关更多信息,请参阅临时从 Auto Scaling 组中移除实例

  • 实例终止后,任何关联的弹性 IP 地址都会取消关联,并且不会自动与新实例关联。必须手动将弹性 IP 地址关联到新实例,或者使用基于生命周期挂钩的解决方案自动完成关联。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的弹性 IP 地址

  • 同样,实例终止后,其挂载的 EBS 卷也将被分离(或删除,具体取决于卷的 DeleteOnTermination 属性)。必须手动将这些 EBS 卷挂载到新实例,或者使用基于生命周期挂钩的解决方案自行完成挂载。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的将 Amazon EBS 卷挂载到实例

其他信息

有关排查运行状况检查问题的详细信息,请参阅 Amazon EC2 Auto Scaling 问题排查:运行状况检查。如果运行状况检查失败,请查看本主题以了解故障排查步骤。本主题将帮助您弄明白 Auto Scaling 组中发生了什么故障,并提供相关的修复建议。

Amazon EC2 Auto Scaling 还会使用 Amazon EC2、Amazon EBS 或自定义运行状况检查来监控您在暖池中启动的实例的运行状况。有关更多信息,请参阅查看运行状况检查状态以及运行状况检查失败的原因