负载均衡 CLB 通过健康检查来判断后端服务的可用性。若您遇到健康检查异常,可参考以下方式进行排查。
说明:
当健康检查探测到异常时,CLB 将不再向异常后端服务转发流量。
当健康检查探测到所有后端服务都有异常时,请求将会被转发给所有后端服务。
一、排查子机安全组与 ACL 拦截
步骤1:查看实例健康探测源 IP
1. 登录 负载均衡控制台,单击需要查看健康探测源 IP 的实例 ID
。 2. 在实例详情页,单击监听器管理页签,单击监听器,再右侧展开监听器详情。
3. 在监听器详情页,即可查看到当前健康检查源 IP,如上示例健康检查源 IP 为100.64.0.0/10网段。
步骤2:确认安全组放通健康探测源 IP
2. 在负载均衡示例详情页,单击安全组页签 > 已绑定的安全组 ID,进入安全组规则页面。
3. 在入站规则页签下,单击添加规则。
4. 在添加入站规则弹窗中,在来源中输入 查看实例健康探测源 IP 中的100.64.0.0/10网段(若第一步中确认的健康探测源 IP 为负载均衡 VIP,则将该 VIP 填写在来源处),协议端口填写后端服务器使用的协议端口,策略选择允许,单击确定,完成添加。 步骤3:确认子网的网络 ACL 放通健康探测源 IP
2. 在基本信息页,单击网络信息模块中的所属子网,跳转至子网信息页。
3. 单击 ACL 规则页签,在该页面,单击已绑定的 ACL,并在入站规则和出站规则中,放通健康探测源 IP。
4. 若第一步中,确认的健康探测源 IP 为100.64.0.0/10网段(若确认的健康探测源 IP 为负载均衡 VIP),则将其填写在源 IP 处,协议类型填写健康检查方式中选择的协议,端口填写 ALL,策略选择允许,单击保存完成添加。
说明:
如果负载均衡绑定了 COS、CDB、Redis、Ckafka 等公共服务,需要检查服务绑定的安全组及所在子网的网络 ACL 是否有放通负载均衡健康检查源 IP,可以参考上述三个步骤排查。
步骤4:确认 IDC 放通 SNAT IP
如果用户通过云联网 CCN 或者专线产品绑定 IDC 内的机器作为负载均衡实例的后端服务器,需要确认 IDC 放通 SNAT IP。
2. 在实例基本信息页面,在后端服务模块中,查看 SNAT IP。
3. 用户需检查 IDC 内防火墙设备或者机器 iptables 是否有放通该 SNAT IP。
二、排查云服务器 CVM
若后端服务器为 CVM,可参考以下步骤进行排查。
步骤1:机器内部自查
检查 CLB 配置对应后端服务器端口,示例为 80 端口检查命令。
netstat -anltu | grep -w 80
2. 若返回80端口处于监听状态,则可以排除机器内部异常。
注意:
监听地址只能是0.0.0.0或者 CVM 的内网 IP,若监听地址仅有127.0.0.1,则不能排除机器内部异常。
tcp 0 0 0.0.0.0:80 0.0.0.0:*
LISTEN 9/nginx: master pro
tcp6 0 0 :::80 :::*
LISTEN 9/nginx: master pro
步骤2:检查 CVM 能否正常返回
1. 用同 VPC 的其他机器,检查目标 CLB 后端 CVM 的 HTTP/HTTPS 端口是否正常返回。
例如 CLB 控制台配置的 location 目录是“/”,HTTP 端口检查后端 CVM 的内网 IP,以 IP 10.0.0.16 ,端口80为例。
curl -I http://10.0.0.16:80/
2. 实际判断响应结果是否正常,以控制台配置的响应状态码为准。例如配置的响应状态码是“200”或“404”,该返回结果为正常情况,可以排除本异常点。
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 14 Sep 2024 07:07:01 GMT
Content-Type: text/html
HTTP/1.1 404 Not Found
Server: nginx/1.20.1
Date: Sat, 14 Sep 2024 07:08:51 GMT
Content-Type: text/html
步骤3:检查 iptables 是否放通
2. 若确认被拦截,则需要添加命令放通健康探测源 IP 和 CLB 监听器配置的后端服务器端口。以健康探测源 IP 100.64.0.0/10,后端服务器端口为80和443端口为例。
iptables -A INPUT -p tcp -s 100.64.0.0/10 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 100.64.0.0/10 --dport 443 -j ACCEPT
iptables -A INPUT -p icmp -s 100.64.0.0/10 -j ACCEPT
基于不同 Linux 执行以下命令:
#Centos/RHEL:
sudo systemctl enable iptables
sudo service iptables save
#Ubuntu/Debian:
sudo systemctl enable netfilter-persistent
sudo netfilter-persistent save
3. 放通后可再次执行检查命令排查。
说明:
后端协议为 HTTPS 的场景,健康检查异常建议修改为 HTTP。
仅 CLB 上配置 HTTPS 监听器,且后端协议为 HTTPS,才需在后端服务配置证书。
三、排查容器
若后端服务器为容器,可参考以下步骤进行排查,以绑定 TKE 集群为例。
对于 service 有配置 service.cloud.tencent.com/direct-access: "true"注解,则为直连。
对于 ingress 有配置 ingress.cloud.tencent.com/direct-access: "true"注解,则为直连。
步骤1:CLB 直连 pod 场景
CLB 直连 pod 场景下,CLB 流量直接转发到后端 pod。
排查路径如下:
1. 检查容器内监听端口
2. 检查容器本地访问自己正常
3. 检查从 pod 所在 node 访问 pod 正常
如果 pod 不是运行在超级节点上,可登录 node 后,参考 手动测试。 4. 检查 node 内部配置
4.1 检查 ip_forward
输入检查命令(若为 ipv6,则需把命令中 ipv4 换成 ipv6):
sysctl net.ipv4.ip_forward
正常结果:
异常结果:
异常结果解决命令:
sysctl -w "net.ipv4.ip_forward=1" && echo 'net.ipv4.ip_forward=1' >>/etc/sysctl.conf
4.2 检查网卡 forward
输入检查命令:
sysctl -a 2>/dev/null | grep ipv4 | grep -w forwarding
正常结果全部参数值皆为 1,如:
net.ipv4.conf.all.forwarding = 1
正常结果完整示例:
异常结果存在参数值为 0,如:
net.ipv4.conf.all.forwarding = 0
异常结果处理命令,如:(根据实际异常 net.xxx.forwarding 条目执行以下命令)
sysctl -w net.ipv4.conf.all.forwarding=1
4.3 检查 node 的 iptables 是否拦截 forward
输入检查命令:
输出结果:
policy 后的策略应为 ACCEPT。如果为 DROP,则可能导致 forward 拦截。
只有 KUBE-FORWARD、KUBE-SERVICES、KUBE-EXTERNAL-SERVICES和DOCKER-USER 这四条规则。如果有其他规则,则可能导致 forward 拦截。
以下为正常的示例:
4.4 检查安全组是否放通
如果 pod 是 vpc-cni 模式,需检查 node 的弹性网卡安全组是否放通,否则需要检查 node 本身的安全组是否放通。
步骤2:CLB 非直连场景
CLB 非直连场景下,CLB 流量先转发给集群内 node 的 nodeport 端口,再经过 iptables/ipvs转发,将进入到 nodeport 的流量转发给真正的后端 pod,链路较长。
排查路径:
1. 检查 CLB 直连 pod 场景相关内容
检查 CLB 直连 pod 场景相关内容,在此基础上继续完成后续检查步骤。
2. 检查 node 的安全组放通情况
检查节点的安全组和 VPC-CNI 模式 pod 的安全组是否参考以下文档放通:容器服务安全组设置。 3. 检查健康异常节点上 kube-proxy 组件是否正常运行
kube-proxy 组件用于 iptables/ipvs 规则下发。检查方法如下:
# 获取节点上 kube-proxy pod,并确实是否 Ready
kubectl get pod -n kube-system -l k8s-app=kube-proxy -owide | grep <节点名>
# 查看 kube-proxy 运行日志是否有明显报错
kubectl logs -n kue-system <kube-proxy-xxxxx名>
4. 登录健康检查异常的 CLB 后端节点上,逐一访问后端 pod
手动测试的补充说明
步骤1:检查端口监听状态
可以通过 netstat、ss 等命令确认端口的监听状态。若返回监听地址仅有 127.0.0.1,则不能排除异常。
1. 通过 netstat 命令检查端口是否监听状态,以 80 端口为例:
输出存在以下内容即可视为监听状态:
tcp 0 0 0.0.0.0:80 0.0.0.0:*
LISTEN 9/nginx: master pro
tcp6 0 0 :::80 :::*
LISTEN 9/nginx: master pro
2. 通过 ss 命令检查端口是否监听状态,以 80 端口为例:
输出存在以下内容即可视为监听状态:
tcp LISTEN 0 511 *:80 *:*
users:(("nginx",pid=9,fd=6))
tcp LISTEN 0 511 [::]:80 [::]:*
users:(("nginx",pid=9,fd=8))
步骤2:检查 TCP 服务连通性
可以通过 telnet 命令检查 TCP 服务的连通性。
注意:
请勿使用低版本 busybox 的 telnet 测试,因为无论连接是否正常,都不会回显。
以查看 IP 172.16.1.29 的 80 端口为例:
echo "" |telnet 172.16.1.29 80
Trying 172.16.1.29...
Connected to 172.16.1.29.
Escape character is '^]'.
Connection closed by foreign host.
步骤3:检查 HTTP/HTTPS 服务返回
可以通过 curl 命令检查服务返回的 HTTP 状态码。
以请求协议 HTTP、方法 GET、域名是 mydomain.com、路径 /health、端口8080、IP 172.16.1.29 为例。
curl -X GET -H "Host: mydomain.com" http://172.16.1.29:8080/health -s -o /dev/null -w "\\nhttpcode: %{http_code}\\n"
响应结果:
若在健康检查配置正常状态码中选择了预期返回 1xx-4xx,以上响应结果返回 404 符合预期。若返回结果不符合健康检查配置预期,但实际为正常情况,建议调整预期配置。
以上异常排查若仍未解决您的问题,请提交 工单处理。
本页内容是否解决了您的问题?