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

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

使用以下 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. 打开 Amazon EC2 Auto Scaling 控制台:https://console.aws.amazon.com/ec2autoscaling/

  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 检测到实例不再处于 running 状态,则它会将该实例标记为运行不正常并予以替换。例如,停止实例时就可能会发生此情况。Amazon EC2 Auto Scaling 有两种选项来停止 InService 实例。您可以将实例置于备用状态,也可以将其从组中分离。

  • 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 卷挂载到实例

运行状况检查宽限期

Auto Scaling 组的 HealthCheckGracePeriod 参数有助于 Amazon EC2 Auto Scaling 区分运行状况不佳的实例和尚未准备好提供流量的新启动实例。此宽限期可防止 Amazon EC2 Auto Scaling 在 InService 实例有时间完成初始化之前将其标记为不正常并予以终止。

预设情况下,从 Amazon Web Services Management Console 创建 Auto Scaling 组时,运行状况检查的宽限期默认为 300 秒。使用 Amazon CLI 或 SDK 创建 Auto Scaling 组时,默认值为 0 秒。

将运行状况检查宽限期的值设置为一个大于或等于应用程序所需最大启动时间的时间。启动时间是指从实例开始启动时起,到实例可以接收流量止之间的时间。如果添加生命周期钩子,则可以降低运行状况检查宽限期的值。调用生命周期钩子时,在生命周期钩子操作完成并且实例进入 InService 状态后,才会开始计算宽限期。

如果您使用 Amazon CLI 或者 SDK 将实例的运行状态设置为不正常,则原定设置为等待宽限期结束。但您可以覆盖这一行为,不遵守宽限期。

配置运行状况检查宽限期(控制台)

当您创建自动扩缩组时,在 Configure advanced options(配置高级选项)页面上,对于 Health checks(运行状况检查)、Health check grace period(运行状况检查宽限期),请选择应用程序所需的启动时间。

修改现有组的运行状况检查宽限期(控制台)

  1. 打开位于 https://console.aws.amazon.com/ec2autoscaling 的 Amazon EC2 Auto Scaling 控制台,然后选择在其中创建 Auto Scaling 组的 Amazon Web Services 区域。

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

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

  3. Details (详细信息) 选项卡上,选择 Health checks (运行状况检查)Edit (编辑)

  4. Health check grace period(运行状况检查宽限期)下,选择应用程序所需的启动时间。

  5. 选择 Update(更新)。

其他信息

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

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