健康探测将实例标记为不健康,但事实并非如此
Health probe marks instances as unhealthy but the aren't
我为我的节点应用程序使用 VM 规模集。我的应用有一个可以通过 www.mydomain.com/api/healthcheck
访问 public 的操作,并且只打印一些 json。
当我将健康探测器配置为使用 TCP
协议时,一切正常,我的 api returns 也达到了预期的 json (和状态 200)。
但是,当我现在将我的健康探测器切换为使用 HTTP
和路径=/api/healthcheck
时,我的网站不再可访问(ERR_CONNECTION_TIMED_OUT
...我猜负载均衡器会删除所有实例,因为健康探测器告诉他每个实例都不健康)
我在我的节点应用程序前面使用 nginx,但我也尝试(用于测试)配置我的 LoadBalancer 以将端口 80 路由到后端端口 8080(我的节点应用程序在每台机器上 运行ning,这样我就可以避免使用 nginx 代理)。但我得到了同样的行为。
我不知道为什么我的自定义健康检查不起作用。希望能帮到你。
编辑:
为了进行测试,我执行了以下操作:
- 运行 每个 VM 上端口 3000 上的另一个 nodejs 应用程序,它只打印 "hello world"(没有 nginx 代理!)
- 为端口 3000 创建一个 LB 规则,并配置我的 NSG 以允许所有 :3000
- 一开始,我的健康探测器配置为使用
tcp
- 结果:
mydoamin.com:3000/hello
可用(打印 hello 和 returns 200)
- 现在我将我的健康探测器配置为使用
http
-协议、端口 3000
和位置 /hello
。
- 结果:我的整个网络应用程序不再可用
我看不到你服务器的代码,所以很难弄明白。
如果您共享一些代码,那就更容易了。
所以让我们试着分析一下情况:
初步检查
Connection to the instances has timed out
尝试从您的计算机终端执行以下命令
curl –I private-IP-address-of-the-instance:port/health-check-target-page
现在根据结果我们有不同的可能原因...
初始检查结果:非 200 响应
- 实例上没有配置目标页面。
- 未设置响应中 Content-Length header 的值。
- 应用程序未配置为接收来自负载的请求
平衡器或 return 200 响应代码。
初步检查结果:能够直接连接到实例
- 实例无法在配置的响应内响应
超时时间。
- 实例负载很大,响应时间超过了您配置的响应超时时间。
- 如果您使用的是 HTTP 或 HTTPS 连接和运行状况检查
正在 ping 路径字段中指定的目标页面上执行
(例如,HTTP:80/index.html),目标页面可能正在
响应时间比您配置的超时时间长。
其他:实例未从负载均衡器接收流量
问题:实例的安全组阻止了来自负载均衡器的流量。
对实例进行数据包捕获以验证问题。使用以下命令:
tcpdump port health-check-port
我为我的节点应用程序使用 VM 规模集。我的应用有一个可以通过 www.mydomain.com/api/healthcheck
访问 public 的操作,并且只打印一些 json。
当我将健康探测器配置为使用 TCP
协议时,一切正常,我的 api returns 也达到了预期的 json (和状态 200)。
但是,当我现在将我的健康探测器切换为使用 HTTP
和路径=/api/healthcheck
时,我的网站不再可访问(ERR_CONNECTION_TIMED_OUT
...我猜负载均衡器会删除所有实例,因为健康探测器告诉他每个实例都不健康)
我在我的节点应用程序前面使用 nginx,但我也尝试(用于测试)配置我的 LoadBalancer 以将端口 80 路由到后端端口 8080(我的节点应用程序在每台机器上 运行ning,这样我就可以避免使用 nginx 代理)。但我得到了同样的行为。
我不知道为什么我的自定义健康检查不起作用。希望能帮到你。
编辑: 为了进行测试,我执行了以下操作:
- 运行 每个 VM 上端口 3000 上的另一个 nodejs 应用程序,它只打印 "hello world"(没有 nginx 代理!)
- 为端口 3000 创建一个 LB 规则,并配置我的 NSG 以允许所有 :3000
- 一开始,我的健康探测器配置为使用
tcp
- 结果:
mydoamin.com:3000/hello
可用(打印 hello 和 returns 200) - 现在我将我的健康探测器配置为使用
http
-协议、端口3000
和位置/hello
。 - 结果:我的整个网络应用程序不再可用
我看不到你服务器的代码,所以很难弄明白。 如果您共享一些代码,那就更容易了。
所以让我们试着分析一下情况:
初步检查
Connection to the instances has timed out
尝试从您的计算机终端执行以下命令
curl –I private-IP-address-of-the-instance:port/health-check-target-page
现在根据结果我们有不同的可能原因...
初始检查结果:非 200 响应
- 实例上没有配置目标页面。
- 未设置响应中 Content-Length header 的值。
- 应用程序未配置为接收来自负载的请求 平衡器或 return 200 响应代码。
初步检查结果:能够直接连接到实例
- 实例无法在配置的响应内响应 超时时间。
- 实例负载很大,响应时间超过了您配置的响应超时时间。
- 如果您使用的是 HTTP 或 HTTPS 连接和运行状况检查 正在 ping 路径字段中指定的目标页面上执行 (例如,HTTP:80/index.html),目标页面可能正在 响应时间比您配置的超时时间长。
其他:实例未从负载均衡器接收流量
问题:实例的安全组阻止了来自负载均衡器的流量。
对实例进行数据包捕获以验证问题。使用以下命令:
tcpdump port health-check-port