tencent cloud

文档反馈

健康检查异常排查v2

最后更新时间:2024-12-20 12:14:13
    负载均衡 CLB 通过健康检查来判断后端服务的可用性。若您遇到健康检查异常,可参考以下方式进行排查。
    说明:
    当健康检查探测到异常时,CLB 将不再向异常后端服务转发流量。
    当健康检查探测到所有后端服务都有异常时,请求将会被转发给所有后端服务。
    健康检查原理,可参考 健康检查概述

    一、排查子机安全组与 ACL 拦截

    注意:
    若已配置安全组默认放通则可忽略。

    步骤1:查看实例健康探测源 IP

    1. 登录 负载均衡控制台,单击需要查看健康探测源 IP 的
    实例 ID
    2. 在实例详情页,单击监听器管理页签,单击监听器,再右侧展开监听器详情。
    
    
    
    3. 监听器详情页,即可查看到当前健康检查源 IP,如上示例健康检查源 IP 为100.64.0.0/10网段。

    步骤2:确认安全组放通健康探测源 IP

    1. 登录 负载均衡控制台,单击负载均衡实例 ID
    2. 在负载均衡示例详情页,单击安全组页签 > 已绑定的安全组 ID,进入安全组规则页面。
    
    3. 入站规则页签下,单击添加规则
    4. 在添加入站规则弹窗中,在来源中输入 查看实例健康探测源 IP 中的100.64.0.0/10网段(若第一步中确认的健康探测源 IP 为负载均衡 VIP,则将该 VIP 填写在来源处),协议端口填写后端服务器使用的协议端口,策略选择允许,单击确定,完成添加。
    

    步骤3:确认子网的网络 ACL 放通健康探测源 IP

    1. 登录 云服务器控制台,单击云服务器实例,进入基本信息页。
    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。
    1. 登录 负载均衡控制台,单击负载均衡实例 ID
    2. 在实例基本信息页面,在后端服务模块中,查看 SNAT IP。
    3. 用户需检查 IDC 内防火墙设备或者机器 iptables 是否有放通该 SNAT IP。

    二、排查云服务器 CVM

    若后端服务器为 CVM,可参考以下步骤进行排查。

    步骤1:机器内部自查

    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 是否放通

    1. 检查方法请参考:防火墙问题,检查命令如下:
    iptables -nvL
    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。
    若业务后端要求使用 HTTPS 协议,则请参考 Nginx 服务器 SSL 证书安装部署(Linux)进行 SSL 配置和检查 。若仍存在问题,请 提交工单处理。
    仅 CLB 上配置 HTTPS 监听器,且后端协议为 HTTPS,才需在后端服务配置证书。

    三、排查容器

    若后端服务器为容器,可参考以下步骤进行排查,以绑定 TKE 集群为例。
    在 TKE 容器场景下,CLB 的后端服务器可以分为直连 pod 和非直连(即 CLB 绑定 nodeport)两个场景。判断是否直连的方式如下,详情请参见:使用 LoadBalancer 直连 Pod 模式 Service-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. 检查容器本地访问自己正常
    登录容器后,参考 检查 CVM 能否正常返回 进行检查。
    登录容器的方式可参考:远程终端基本操作
    3. 检查从 pod 所在 node 访问 pod 正常
    如果 pod 不是运行在超级节点上,可登录 node 后,参考 手动测试
    原生节点登录可参考:原生节点开启 SSH 密钥登录
    4. 检查 node 内部配置
    4.1 检查 ip_forward
    输入检查命令(若为 ipv6,则需把命令中 ipv4 换成 ipv6):
    sysctl net.ipv4.ip_forward
    正常结果:
    net.ipv4.ip_forward = 1
    异常结果:
    net.ipv4.ip_forward = 0
    异常结果解决命令:
    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
    输入检查命令:
    iptables -nvL FORWARD
    输出结果:
    policy 后的策略应为 ACCEPT。如果为 DROP,则可能导致 forward 拦截。
    只有 KUBE-FORWARD、KUBE-SERVICES、KUBE-EXTERNAL-SERVICES和DOCKER-USER 这四条规则。如果有其他规则,则可能导致 forward 拦截。
    以下为正常的示例:
    
    4.4 检查安全组是否放通
    如果 pod 是 vpc-cni 模式,需检查 node 的弹性网卡安全组是否放通,否则需要检查 node 本身的安全组是否放通。
    可通过开启 CLB 默认放通或参考 确认安全组放通健康探测源 IP 进行放通。

    步骤2:CLB 非直连场景

    CLB 非直连场景下,CLB 流量先转发给集群内 node 的 nodeport 端口,再经过 iptables/ipvs转发,将进入到 nodeport 的流量转发给真正的后端 pod,链路较长。
    排查路径:
    1. 检查 CLB 直连 pod 场景相关内容
    检查 CLB 直连 pod 场景相关内容,在此基础上继续完成后续检查步骤。
    2. 检查 node 的安全组放通情况
    检查节点的安全组和 VPC-CNI 模式 pod 的安全组是否参考以下文档放通:容器服务安全组设置
    普通节点的安全组设置可参考:配置安全组
    原生节点的安全组设置可参考:修改原生节点
    超级节点的安全组设置可参考:新建超级节点超级节点可调度 Pod 说明
    VPC-CNI 模式 pod 的安全组设置可参考:VPC-CNI 模式安全组使用说明
    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名>
    若存在异常,可参考 集群 Kube-Proxy 异常排障处理 处理。
    4. 登录健康检查异常的 CLB 后端节点上,逐一访问后端 pod
    TCP 监听可用 telnet 测试连通性,HTTP/HTTPS 监听器可用 curl 测试访问结果。详情请参见 检查 TCP 服务连通性检查 HTTP/HTTPS 服务返回

    手动测试的补充说明

    步骤1:检查端口监听状态

    可以通过 netstat、ss 等命令确认端口的监听状态。若返回监听地址仅有 127.0.0.1,则不能排除异常。
    1. 通过 netstat 命令检查端口是否监听状态,以 80 端口为例:
    netstat -tulnp | grep 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 端口为例:
    ss -tulnp | grep 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
    输出 Connected 为正常连通;停留在 Trying 为网络不通,需检查安全组等(具体请参见 确认子网的网络 ACL 放通健康探测源 IP检查 iptables 是否放通 章节);返回 Connection refused 为端口未监听。
    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"
    响应结果:
    httpcode: 404
    若在健康检查配置正常状态码中选择了预期返回 1xx-4xx,以上响应结果返回 404 符合预期。若返回结果不符合健康检查配置预期,但实际为正常情况,建议调整预期配置。
    
    以上异常排查若仍未解决您的问题,请提交 工单处理
    
    
    
    
    
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持