问题描述
健康检查异常会导致LB集群转发中断,业务不可用等情况。7层LB健康检查异常常常表现为访问502 ,4层timeout/Connection refused等。 首先应判断监听器类型,7层健康检查类似curl,4层类似telnet。下面是一些常见的场景以及解决方案,供您参考:
场景一: 7层健康检查路径不存在,后端返回4xx 状态码
解决方案
-
查看健康检查路径是否存在,curl wget等测试访问是否正常.
-
若4xx为预期内正常状态码,可配置勾选4xx
场景二: 7层健康检查后端服务禁止IP直接访问,禁止空Host访问
健康检查配置中,检查域名和检查路径都为非必填项。有可能用户在配置过程中直接跳过该选项。
其中健康检查域名如不填写,系统默认为内网IP地址,Host为空。如果后端服务禁止空Host访问可能会导致健康检查失败。
解决方案
- 直接curl 后端服务IP查看是否返回正常状态码。
- 检查后端服务是否有禁止空server_name访问,将允许的server_name配置到健康检查域名,例如Nginx。
场景三: 健康检查地址需要请求数据库等延迟过高导致失败
解决方案
- 检查健康检查请求日志请求时间,调整健康检查超时时间,不健康阈值等
- 检查后端服务、主机是否负载过高,及时优化或扩容
场景四:7层健康检查后端服务禁止HEAD 或GET请求
目前健康检查使用GET或HEAD请求方式探测后端主机,控制台可选。如果禁止这两种方法会出现健康检查失败。
解决方案
测试方法:
curl -I -H "Host:www.a.com" -X GET 192.168.1.99
curl -I -H "Host:www.a.com" -X HEAD 192.168.1.99
192.168.1.99为后端RS地址
-H "Host:" 如果没限制host可以不携带
例如Nginx配置
if ($request_method ~* GET|HEAD) {
return 403;
}
场景五:后端服务未监听在0.0.0.0 ,或者未放行100.64.0.0/10 网段,导致健康检查失败
该场景在后端一般无日志,可以通过netstat 或者tcpdump抓包看到相关信息。
解决方案
- 检查服务监听端口是否开放在0.0.0.0,后端服务拒绝服务。
- 安全组或系统内iptables未放行100.64.0.0/10 导致失败。健康检查目前使用100.64.0.0/10网段探测后端服务是都存活,请在后端安全策略中放行。
如果您有其他问题,欢迎您联系火山引擎技术支持服务