为什么 Azure 负载均衡器在运行状况探测关闭后仍在向节点发送流量?

Why is azure load balancer still sending traffic to nodes after health probe down?

我有 2 个 Azure VM 位于标准 Azure 负载均衡器后面。

负载均衡器有一个健康探测器,每 5 秒使用 HTTP on /health 为每个 VM 执行 ping 操作。

间隔设置为5,端口设置为80和/health,“不健康阈值”设置为2。

在部署应用程序期间,我们将 /health-endpoint 设置为 return 503,然后等待 35 秒以允许负载均衡器将实例标记为关闭,从而停止发送新流量。

但是,负载平衡器似乎并没有完全消除 VM 的负载。它仍然将入站流量发送到停机实例,导致我们的客户停机。

我可以在 IIS 日志中看到 /health-endpoint 确实在 returning 503 应该的时候。

有什么想法吗?它可以是某种 TCP 保持活动吗?

我建议你采用以下方法 您可能必须在每个 VM 上放置一个 healthcheck.html 页面。只要探测器可以检索到页面,负载均衡器就会继续向 VM 发送用户请求。

部署时,只需将 healthcheck.html 重命名为其他名称,例如 _healthcheck.html。这将导致探测器开始接收 HTTP 404 错误,并使该机器脱离负载平衡轮换。

部署完成后,将 _healthcheck.html 重命名回 healthcheck.html。 Azure LB 探测将开始获取 HTTP 200 响应,并因此开始再次向此 VM 发送请求。

谢谢, 马努

负载均衡器是一种直通服务,它不会终止现有的 TCP 连接,其中流量始终在客户端与 VM 的来宾 OS 和应用程序之间。如果后端端点的健康探测失败,与该后端端点建立的 TCP 连接将继续,但它将停止向相应的不健康实例发送新流。这是设计使您有机会从应用程序中正常关闭,以避免正在进行的应用程序工作流发生任何意外和突然终止。

您也可以考虑在空闲时配置 TCP 重置 https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-reset 以减少空闲连接数。

我从微软那里得到确认,这是“按预期”工作的,这使得 Azure 负载均衡器不适合 Web 应用程序。这是微软的回答:

I was able to discuss your observation with the internal team.

They explained that the Load balancer does not currently have “Connection Draining” feature and would not terminate existing connections.

Connection Draining is available with the Application Gateway Connection Draining.

I heard this is being planning for the Load balancer also as future Road map . You could also add your voice to the request for this feature for the Load balancer by filling the feedback Form.