问题出现得很突然,日志倒是留得挺全。腾讯云 CLB 上的后端健康检查一直显示异常,实例被摘除后整站 502,运维确认后端进程在跑,ssh 上去 curl 127.0.0.1:8080/health 返回 200。
刚开始盯着「健康检查路径写成了 /healthz,应用实际提供的是 /health」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。健康检查走的是 CLB 的内网地址段,安全组没有放行这条来源的 8080。还有一种是后端应用只监听 127.0.0.1,CLB 从内网网卡访问不到。
不容易想到的是,健康检查间隔与超时设置过短,应用冷启动阶段直接被判死。
第一件事是在 CLB 控制台看具体的失败原因
aliyun slb DescribeHealthStatus --LoadBalancerId lb-xxx --ListenerPort 80
然后确认监听地址不是仅回环
ss -lntp | grep 8080
再往下放行 CLB 网段到该端口
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=100.64.0.0/10 port port=8080 protocol=tcp accept' && firewall-cmd --reload
末了用内网地址模拟一次健康检查
curl -s -o /dev/null -w '%{http_code}' http://10.0.0.11:8080/health
改完先别撤,确认这几项。CLB 健康状态从异常变为正常,实例重新挂回后端,从公网访问返回 200,健康检查日志里连续成功。
健康检查失败时先看后端监听地址,很多框架默认绑 127.0.0.1;检查路径和端口一旦写死,改端口时两边都要同步。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
