Auto Scaling 实例的运行状况检查 - Amazon EC2 Auto Scaling

Auto Scaling 实例的运行状况检查

Auto Scaling 实例的运行状况有正常和不佳两种。Auto Scaling 组中所有实例在开始启动时都处于良好运行状态。除非 Amazon EC2 Auto Scaling 收到实例运行状况不佳的通知,否则将认为它们运行状况良好。此通知可能来自以下一个或多个来源:Amazon EC2、Elastic Load Balancing (ELB) 或自定义运行状况检查。

Amazon EC2 Auto Scaling 在将一个实例标记为运行状况不佳后,会计划替换该实例。如果您不想替换实例,可以暂停任何单个 Auto Scaling 组的运行状况检查流程。

实例运行状况

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

  • Amazon EC2 提供的用于识别可能影响实例的软硬件问题的状态检查。Auto Scaling 组的默认运行状况检查只有 EC2 状态检查。

  • 由 Elastic Load Balancing (ELB) 提供的运行状况检查。这些运行状况检查默认为禁用状态,但可以启用。

  • 您的自定义运行状况检查。

确定实例运行状况

实例在经过完全配置并通过初始运行状况检查后,Amazon EC2 Auto Scaling 将其视为运行状况良好。Amazon EC2 Auto Scaling 通过定期检查实例的运行状况,确认 Auto Scaling 组中的所有实例正在运行且状态良好。如果它确定某个实例运行状况不佳,它将终止该实例,并启动新实例。这有助于保持定义的最小数量(或指定的所需数量)的运行实例。

Amazon EC2 状态检查

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

  • stopping

  • stopped

  • terminating

  • terminated

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

Elastic Load Balancing (ELB) 运行状况检查

对于不使用 ELB 运行状况检查的组的实例,如果这些实例处于 running 状态,则视为运行状况良好。对于使用 ELB 运行状况检查的组的实例,如果这些实例处于 running 状态,并且负载均衡器将其报告为运行状况良好,则视为运行状况良好。

如果将一个负载均衡器或目标组附加到 Auto Scaling 组,您可以对该组进行配置,以便在 Elastic Load Balancing 报告实例为 unhealthy 时将其标记为运行状况不佳。如果为负载均衡器启用了连接耗尽,则在由于扩展事件或运行状况检查替换而终止实例之前,Amazon EC2 Auto Scaling 会等待进行中的请求完成或等待最大超时过期(以先到者为准)。有关更多信息,请参阅添加 ELB 运行状况检查

自定义运行状况检查

如果您有自定义运行状况检查,则可以将运行状况检查的信息发送给 Amazon EC2 Auto Scaling,以便 Amazon EC2 Auto Scaling 能够利用此信息。例如,如果您确定实例未按预期运行,则可将实例的运行状况设置为 Unhealthy。Amazon EC2 Auto Scaling 下次对实例执行运行状况检查时,它将确定实例运行状况不佳,然后启动替换实例。有关更多信息,请参阅使用自定义运行状况检查

运行状况检查宽限期

当实例启动时,Amazon EC2 Auto Scaling 会使用 Auto Scaling 组的 HealthCheckGracePeriod 值来确定应等待多长时间之后再检查实例的运行状况。Amazon EC2 和 Elastic Load Balancing 运行状况检查可以在运行状况检查宽限期到期之前完成。但在运行状况检查宽限期过期后,Amazon EC2 Auto Scaling 才会执行这些检查。

从 AWS 管理控制台创建 Auto Scaling 组时,运行状况检查的宽限期默认为 300 秒。使用 AWS CLI 或 AWS 开发工具包创建 Auto Scaling 组时,默认为 0 秒。

为了给实例提供足够的预热时间,请确保运行状况检查宽限期包含应用程序的预期启动时间,即从实例开始运行到可以接收流量的时间。如果添加一个生命周期挂钩,在生命周期挂钩操作完成并且实例进入 InService 状态后,宽限期才会开始。

替换运行状况不佳的实例

在 Amazon EC2 或 Elastic Load Balancing 运行状况检查中将实例标记为运行状况不佳之后,将立即安排对它进行替换。它不会自动恢复良好的运行状况。您可以手动进行干预,方法是调用 SetInstanceHealth 操作(或 set-instance-health 命令)以将实例的运行状况重新设置为良好。但是如果该实例已终止,将导致错误。因为将实例标记为运行状况不佳和实际终止该实例之间的间隔非常短,尝试使用 SetInstanceHealth 操作(或 set-instance-health 命令)将该实例重新设置为良好运行状况可能仅适用于已暂停的组。有关更多信息,请参阅 暂停和恢复扩展流程

Amazon EC2 Auto Scaling 将创建用于终止运行状况不佳的实例的新扩展活动,然后终止该实例。随后,另一个扩展活动将启动新实例以替代终止的实例。

实例终止后,任何关联的弹性 IP 地址都会取消关联,并且不会自动与新实例关联。必须手动将这些弹性 IP 地址与新实例关联。同样,实例终止后,其附加的 EBS 卷也会分离。必须手动将这些 EBS 卷附加到新实例。有关更多信息,请参阅Amazon EC2 用户指南(适用于 Linux 实例)中的取消关联弹性 IP 地址并将它与其他实例重新关联将 Amazon EBS 卷附加到实例

使用自定义运行状况检查

如果您具有自己的运行状况检查系统,您可以使用 AWS CLI 或 AWS 开发工具包,将实例的运行状况信息从系统直接发送到 Amazon EC2 Auto Scaling。以下示例演示如何使用 AWS 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" }, ... ] } ] }