我有一个实例组,其中 2 个实例位于 HTTP 负载均衡器后面。一个实例已启动并正常运行(返回 http 200),另一个实例崩溃(HTTP 请求超时)。我不确定我做错了什么,但根据文档,失败的实例应该自动从负载均衡器中删除。
以下是相关文档:https://cloud.google.com/compute/docs/load-balancing/health-checks 相关段落:
要使健康检查被视为成功,后端必须返回带有代码 200 的有效 HTTP 响应并在 timeoutSec 期限内正常关闭连接。如果实例未通过健康检查,则会将其从组或池中移除,而不会发送任何通知。如果它后来通过了健康检查,则会将其返回到组或池,同样不会发送任何通知。
这是我目前在 Google 云控制台页面上看到的 HTTP 负载均衡器后端的内容。
当访问我的网站时(http://stage2.phantomjscloud.com)大约有一半的时间我
错误:服务器错误 服务器遇到临时错误,无法完成您的请求。请在 30 秒后重试。
HTTP 负载均衡器(和健康检查)清楚地检测到了失败的实例,但无论如何,流量仍在向其提供。
我该如何解决这个问题?
答案1
健康检查托管实例组 VS 健康检查负载平衡
托管实例组使用的健康检查与负载平衡使用的健康检查相同,但在行为上有一些差异。您应用于负载平衡服务的健康检查可帮助负载平衡器确定将网络流量引导至何处。这些健康检查不会导致 Compute Engine 重新创建实例。您应用于托管实例组的健康检查将主动向托管实例组发出信号,以在实例变为“不健康”时删除并重新创建实例。
对于大多数场景,请使用单独的健康检查来进行负载平衡和监控托管实例组。负载平衡的健康检查可以而且应该更积极,因为这些健康检查决定实例是否接收用户流量。由于客户可能依赖您的服务,因此您希望快速捕获无响应的实例,以便在必要时重定向流量。相比之下,实例组的健康检查将导致 Compute Engine 主动替换失败的实例,因此您可以创建比负载平衡器的健康检查更保守的健康检查。
答案2
我已经有一段时间没有见过这种错误了(大约 6 个月),所以我认为这是 Google Cloud 的一个错误,他们已经修复了它。