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 状态检查和计划事件

确保实例正在运行,并且不存在可能影响实例的底层硬件或软件问题。Auto Scaling 组的原定设置运行状况检查只有 Amazon EC2 状态检查和计划事件。

Elastic Load Balancing 运行状况检查

检查负载均衡器是否将实例报告为运行正常,以确保实例可用于处理请求。仅在您为某个 Auto Scaling 组启用了这些运行状况检查时选中此选项。

自定义运行状况检查

确保根据自定义运行状况检查,没有其他问题表明实例存在运行状况问题。

实例运行状况检测

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

Amazon EC2 Auto Scaling 通过定期检查实例的运行状况,确认 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 Auto Scaling 会认为实例运行不正常并将其替换。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的计划事件的类型

Elastic Load Balancing 运行状况检查

Amazon EC2 Auto Scaling 还使用 Elastic Load Balancing 运行状况检查的结果来确定实例的运行状态。当您将某个 Elastic Load Balancing 负载均衡器附加到 Auto Scaling 组时,Amazon EC2 Auto Scaling 会将实例注册到该负载均衡器。实例完成注册后,它会进入 InService 状态并可与该负载均衡器一起使用。

设置 Elastic Load Balancing 负载均衡器时,您可以配置运行状况检查,以便负载均衡器用来确定实例是否运行正常。预设情况下,Amazon EC2 Auto Scaling 会忽略 Elastic Load Balancing 运行状况检查的结果。为 Auto Scaling 组启用这些运行状况检查后,如果 Elastic Load Balancing 报告某个已注册实例的状况为 unhealthy,Amazon EC2 Auto Scaling 会在下一次定期运行状况检查中将实例标记为运行不正常并予以替换。如果为负载均衡器启用了 Connection Draining(注销延迟),则在终止运行不正常的实例之前,Amazon EC2 Auto Scaling 会等待进行中的请求完成或等待最大超时过期(以先到者为准)。

要了解详情,包括如何更新 Auto Scaling 组以启用 Elastic Load Balancing 运行状况检查,请参阅向 Auto Scaling 组添加 Elastic Load Balancing 运行状况检查

自定义运行状况检测

有时,您还需要在 Auto Scaling 组中的实例上运行自定义运行状况检测任务,如果任务失败,则将实例的运行状况设为运行不正常。从而通过组合使用自定义运行状况检查、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-123abc45d --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-050555ad16a3f9c7f" }, "InstanceId": "i-123abc45d", "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 确定任何实例不再运行,它会立即将其替换。但如果发现正在运行的实例不正常,Amazon EC2 Auto Scaling 将使用以下方法从故障中恢复,同时尽可能减少因临时问题或运行状况检查配置错误而可能发生的任何停机时间。

  • 如果正在进行扩缩活动并且您的 Auto Scaling 组低于所需容量,则 Amazon EC2 Auto Scaling 会首先横向扩展,然后再终止运行不正常的实例。

  • 在横向扩展时,它会等待实例通过初始运行状况检查并且实例的预热期结束,以确保新实例准备就绪。

  • 在该组达到所需容量并且新实例准备好服务流量之后,Amazon EC2 Auto Scaling 将替换运行不正常的实例,如下所示:

    • Amazon EC2 Auto Scaling 一次只替换 Auto Scaling 组所需容量的 10%,直至所有运行不正常的实例都得到替换为止。

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

注意

如果该组的容量太小,以至于容量的 10% 不是整数,则 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 组的进程

  • 如果 Amazon EC2 Auto Scaling 确定 实例运行不正常,则该实例几乎会立即终止。它不会自动恢复良好的运行状况。您可以尝试使用 set-instance-health 命令,从而手动将实例的运行状态重新设置为正常。但是如果该实例已终止,将导致错误。因为将实例标记为运行不正常和实际终止该实例之间的间隔非常短,尝试使用 set-instance-health 命令将该实例的运行状态重新设置为正常可能仅适用于已暂停运行状况检查的情况。

  • 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 将实例的运行状态设置为不正常,则原定设置为等待宽限期结束。但您可以覆盖这一行为,不遵守宽限期。

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

当您创建 Auto Scaling 组时,请在 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 或自定义运行状况检查来监控您在暖池中启动的实例的运行状况。有关更多信息,请参阅查看运行状况检查状态以及运行状况检查失败的原因