Kubernetes之网络排查详细文

news2024/11/18 11:34:16

文章目录

  • 前言
  • 一、Pod 网络异常
        • 1.1 网络异常大概分为如下几类:
        • 1.2 那么整个 Pod 网络异常分类可以如下图所示:
  • 二、常用网络排查工具
        • 2.1 tcpdump
            • 2.1.1 抓取示例
            • 2.1.2 选项分组
            • 2.1.3 过滤 TCP 标记位
            • 2.1.4 查找 http 包
            • 2.1.5 查找 DNS 流量
            • 2.1.6 查找对应流量的明文密码
            • 2.1.7 wireshark 追踪流
            • 2.1.8 关于抓包节点和抓包设备
            • 2.1.9 抓包节点
            • 2.1.10 抓包设备
            • 2.1.11 下图是一个使用 VxLAN 模式的 flannel 的跨界点通讯的网络模型,在抓包时需要注意对应的网络接口
        • 2.2 nsenter
            • 2.2.1 如何定位 Pod 名称空间
        • 2.3 paping
        • 2.4 mtr
        • 2.5 mtr 输出的数据
        • 2.6 丢包判断
        • 2.7 延迟判断
  • 三、Pod 网络排查流程
  • 四、案例学习
          • 4.1 环境信息
        • 4.2 现象
        • 4.3 分析思路
        • 4.3 怀疑方向
        • 4.4 排查顺序
        • 4.5 排查过程

前言

  • Pod 常见网络异常分类
  • 网络排查工具
  • Pod 网络异常排查思路及流程模型
  • CNI 网络异常排查步骤
  • 案例学习

一、Pod 网络异常

1.1 网络异常大概分为如下几类:

  1. 网络不可达,主要现象为 ping 不通,其可能原因为
    • 源端和目的端防火墙(iptables, selinux)限制
    • 网络路由配置不正确
    • 源端和目的端的系统负载过高,网络连接数满,网卡队列满
    • 网络链路故障
  2. 端口不可达,主要现象为可以 ping 通,但 telnet 端口不通,其可能原因为:
    • 源端和目的端防火墙限制
    • 源端和目的端的系统负载过高,网络连接数满,网卡队列满,端口耗尽
    • 目的端应用未正常监听导致(应用未启动,或监听为 127.0.0.1 等)
  3. DNS 解析异常:主要现象为基础网络可以连通,访问域名报错无法解析,访问 IP 可以正常连通。其可能原因为
    • Pod 的 DNS 配置不正确
    • DNS 服务异常
    • pod 与 DNS 服务通讯异常
    • 可使用 ping -s 指定数据包大小进行测试
    • 数据包的大小超过了 docker、CNI 插件、或者宿主机网卡的 MTU 值。

4.大数据包丢包:主要现象为基础网络和端口均可以连通,小数据包收发无异常,大数据包丢包。可能原因为

  • 可使用 ping -s 指定数据包大小进行测试
  • 数据包的大小超过了 docker、CNI 插件、或者宿主机网卡的 MTU 值。
  1. CNI 异常:主要现象为 Node 可以通,但 Pod 无法访问集群地址,可能原因有:
    • kube-proxy 服务异常,没有生成 iptables 策略或者 ipvs 规则导致无法访问
    • CIDR 耗尽,无法为 Node 注入 PodCIDR 导致 CNI 插件异常
    • 其他 CNI 插件问题

1.2 那么整个 Pod 网络异常分类可以如下图所示:

在这里插入图片描述

总结一下,Pod 最常见的网络故障有:

  1. 网络不可达(ping 不通);
  2. 端口不可达(telnet 不通);
  3. DNS 解析异常(域名不通)
  4. 大数据包丢失(大包不通)
  5. CNI 异常等

二、常用网络排查工具

在了解到常见的网络异常后,在排查时就需要使用到一些网络工具才可以很有效的定位到网络故障原因,下面会介绍一些网络排查工具。

2.1 tcpdump

tcpdump 网络嗅探器:将强大和简单结合到一个单一的命令行界面中,能够将网络中的报文抓取,输出到屏幕或者记录到文件中。

  1. 各系统下的安装查
    看指定接口上的所有通讯
Ubuntu/Debian: tcpdump  ;apt-get install -y tcpdump
Centos/Fedora: tcpdump ;yum install -y tcpdump
Apline:tcpdump ;apk add tcpdump --no-cache
  1. 语法
参数说明
-i (interface)
-w (file)第一个n表示将地址解析为数字格式而不是主机名,第二个N表示将端口解析为数字格式而不是服务名
-n不显示IP地址
-Xhex and ASCll
-AASCll(实际是以人类可读懂的包进行显示)
-XX
-v详细信息
-r读取文件而不是实时抓包
关键字
typehost (主机名,域名,IP地址),net,port,portrange
directionsrc,dst,src or dst,src and ds
protocolether,IP,arp,tcp,udp,wlan
2.1.1 抓取示例
  1. 捕获所有网络接口
tcpdump -D
  1. 按 IP 查找流量
    最常见的查询之一 host,可以看到来往于 1.1.1.1 的流量。
tcpdump host 1.1.1.1
  1. 按源 / 目的 地址过滤
    如果只想查看来自 / 向某方向流量,可以使用 srcdst
tcpdump src|dst 1.1.1.1
  1. 通过网络查找数据包
    使用 net 选项,来要查找出 / 入某个网络或子网的数据包。
tcpdump net 1.2.3.0/24
  1. 使用十六进制输出数据包内容
    hex 可以以 16 进制输出包的内容
tcpdump -c 1 -X icmp
  1. 查看特定端口的流量
    port 选项来查找特定的端口流量。
tcpdump port 3389
tcpdump src port 1025
  1. 查找端口范围的流量
tcpdump portrange 21-23
  1. 过滤包的大小
    如果需要查找特定大小的数据包,可以使用以下选项。你可以使用 less,greater。
tcpdump less 32
tcpdump greater 64
tcpdump <= 128
  1. 捕获流量输出为文件
    -w 可以将数据包捕获保存到一个文件中以便将来进行分析。这些文件称为 PCAP(PEE-cap)文件,它们可以由不同的工具处理,包括 Wireshark 。
tcpdump port 80 -w capture_file
  1. 组合条件
    tcpdump 也可以结合逻辑运算符进行组合条件查询

AND and or &&
OR or or ||
EXCEPT not or !

tcpdump -i eth0 -nn host 220.181.57.216 and 10.0.0.1  # 主机之间的通讯
tcpdump -i eth0 -nn host 220.181.57.216 or 10.0.0.1
# 获取10.0.0.110.0.0.910.0.0.110.0.0.3之间的通讯
tcpdump -i eth0 -nn host 10.0.0.1 and \(10.0.0.9 or 10.0.0.3\)
  1. 原始输出
    并显示人类可读的内容进行输出包(不包含内容)。
tcpdump -ttnnvvS -i eth0
tcpdump -ttnnvvS -i eth0
  1. IP 到端口
    让我们查找从某个 IP 到端口任何主机的某个端口所有流量。
tcpdump -nnvvS src 10.5.2.3 and dst port 3389
  1. 去除特定流量
    可以将指定的流量排除,如这显示所有到 192.168.0.2 的 非 ICMP 的流量。
tcpdump dst 192.168.0.2 and src net and not icmp

来自非指定端口的流量,如,显示来自不是 SSH 流量的主机的所有流量。

tcpdump -vv src mars and not dst port 22
2.1.2 选项分组

在构建复杂查询时,必须使用单引号 '。单引号用于忽略特殊符号 () ,以便于使用其他表达式(如 host, port, net 等)进行分组。

tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
2.1.3 过滤 TCP 标记位
  1. TCP RST

The filters below find these various packets because tcp[13] looks at
offset 13 in the TCP header, the number represents the location within
the byte, and the !=0 means that the flag in question is set to 1,i.e. it’s on.

tcpdump 'tcp[13] & 4!=0'
tcpdump 'tcp[tcpflags] == tcp-rst'
  1. TCP SYN
tcpdump 'tcp[13] & 2!=0'
tcpdump 'tcp[tcpflags] == tcp-syn'
  1. 同时忽略 SYN 和 ACK 标志的数据包
tcpdump 'tcp[13]=18'
  1. TCP URG
tcpdump 'tcp[13] & 32!=0'
tcpdump 'tcp[tcpflags] == tcp-urg'
  1. TCP ACK
tcpdump 'tcp[13] & 16!=0'
tcpdump 'tcp[tcpflags] == tcp-ack'
  1. TCP PSH
tcpdump 'tcp[13] & 8!=0'
tcpdump 'tcp[tcpflags] == tcp-push'
  1. TCP FIN
tcpdump 'tcp[13] & 1!=0'
tcpdump 'tcp[tcpflags] == tcp-fin'
2.1.4 查找 http 包
  1. 查找 user-agent 信息
tcpdump -vvAls0 | grep 'User-Agent:'
  1. 查找只是 GET 请求的流量
tcpdump -vvAls0 | grep 'GET'
  1. 查找 http 客户端 IP
tcpdump -vvAls0 | grep 'Host:'
  1. 查询客户端 cookie
tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'
2.1.5 查找 DNS 流量
tcpdump -vvAs0 port 53
2.1.6 查找对应流量的明文密码
tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '
2.1.7 wireshark 追踪流
  1. wireshare 追踪流可以很好的了解出在一次交互过程中都发生了那些问题。
  2. wireshare 选中包,右键选择 “追踪流“ 如果该包是允许的协议是可以打开该选项的
2.1.8 关于抓包节点和抓包设备

如何抓取有用的包,以及如何找到对应的接口,有以下建议

2.1.9 抓包节点
  1. 通常情况下会在源端和目的端两端同时抓包,观察数据包是否从源端正常发出,目的端是否接收到数据包并给源端回包,以及源端是否正常接收到回包。如果有丢包现象,则沿网络链路上各节点抓包排查。

  2. 例如,A 节点经过 c 节点到 B 节点,先在 AB 两端同时抓包,如果 B 节点未收到 A 节点的包,则在 c 节点同时抓包。

2.1.10 抓包设备

对于 Kubernetes 集群中的 Pod,由于容器内不便于抓包,通常视情况在 Pod 数据包经过的 veth 设备,docker0 网桥,CNI 插件设备(如 cni0,flannel.1 etc…)及 Pod 所在节点的网卡设备上指定 Pod IP 进行抓包。选取的设备根据怀疑导致网络问题的原因而定,比如范围由大缩小,从源端逐渐靠近目的端,比如怀疑是 CNI 插件导致,则在 CNI 插件设备上抓包。从 pod 发出的包逐一经过 veth 设备,cni0 设备,flannel0,宿主机网卡,到达对端,抓包时可按顺序逐一抓包,定位问题节点。

需要注意在不同设备上抓包时指定的源目 IP 地址需要转换,如抓取某 Pod 时,ping {host} 的包,在 veth 和 cni0 上可以指定 Pod IP 抓包,而在宿主机网卡上如果仍然指定 Pod IP 会发现抓不到包,因为此时 Pod IP 已被转换为宿主机网卡 IP。

2.1.11 下图是一个使用 VxLAN 模式的 flannel 的跨界点通讯的网络模型,在抓包时需要注意对应的网络接口

在这里插入图片描述

2.2 nsenter

nsenter 是一款可以进入进程的名称空间中。例如,如果一个容器以非 root 用户身份运行,而使用 docker exec 进入其中后,但该容器没有安装 sudo 或未 netstat ,并且您想查看其当前的网络属性,如开放端口,这种场景下将如何做到这一点?nsenter 就是用来解决这个问题的。

nsenter (namespace enter) 可以在容器的宿主机上使用 nsenter 命令进入容器的命名空间,以容器视角使用宿主机上的相应网络命令进行操作。当然需要拥有 root 权限

各系统下的安装

Ubuntu/Debian: util-linux  ;apt-get install -y util-linux
Centos/Fedora: util-linux ;yum install -y util-linux
Apline:util-linux ;apk add util-linux --no-cache

nsenter 的 c 使用语法为,nsenter -t pid -n <commond>,-t 接 进程 ID 号,-n 表示进入名称空间内, 为执行的命令。

实例:如我们有一个 Pod 进程 ID 为 30858,进入该 Pod 名称空间内执行 ifconfig ,如下列所示

$ ps -ef|grep tail
root      17636  62887  0 20:19 pts/2    00:00:00 grep --color=auto tail
root      30858  30838  0 15:55 ?        00:00:01 tail -f

$ nsenter -t 30858 -n ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1480
        inet 192.168.1.213  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 5e:d5:98:af:dc:6b  txqueuelen 0  (Ethernet)
        RX packets 92  bytes 9100 (8.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 92  bytes 8422 (8.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 5  bytes 448 (448.0 B)`在这里插入代码片`
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 448 (448.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

net1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.0.201  netmask 255.255.255.0  broadcast 10.1.0.255
        ether b2:79:f9:dd:2a:10  txqueuelen 0  (Ethernet)
        RX packets 228  bytes 21272 (20.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 216  bytes 20272 (19.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
2.2.1 如何定位 Pod 名称空间
  1. 首先需要确定 Pod 所在的节点名称
$ kubectl get pods -owide |awk '{print $1,$7}'
NAME NODE
netbox-85865d5556-hfg6v master-machine
netbox-85865d5556-vlgr4 node01
  1. 如果 Pod 不在当前节点还需要用 IP 登录则还需要查看 IP(可选)
$ kubectl get pods -owide |awk '{print $1,$6,$7}'
NAME IP NODE
netbox-85865d5556-hfg6v 192.168.1.213 master-machine
netbox-85865d5556-vlgr4 192.168.0.4 node01
  1. 接下来,登录节点,获取容器 lD,如下列所示,每个 pod 默认有一个 pause 容器,其他为用户 yaml 文件中定义的容器,理论上所有容器共享相同的网络命名空间,排查时可任选一个容器。
$ docker ps |grep netbox-85865d5556-hfg6v
6f8c58377aae   f78dd05f11ff                                                    "tail -f"                45 hours ago   Up 45 hours             k8s_netbox_netbox-85865d5556-hfg6v_default_4a8e2da8-05d1-4c81-97a7-3d76343a323a_0
b9c732ee457e   registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1   "/pause"                 45 hours ago   Up 45 hours             k8s_POD_netbox-85865d5556-hfg6v_default_4a8e2da8-05d1-4c81-97a7-3d76343a323a_0
  1. 接下来获得获取容器在节点系统中对应的进程号,如下所示
docker inspect --format "{{ .State.Pid }}" 6f8c58377aae
30858
  1. 最后就可以通过 nsenter 进入容器网络空间执行命令了

2.3 paping

paping 命令可对目标地址指定端口以 TCP 协议进行连续 ping,通过这种特性可以弥补 ping ICMP 协议,以及 nmap , telnet 只能进行一次操作的的不足;通常情况下会用于测试端口连通性和丢包率.

paping download:paping[2]

paping 还需要安装以下依赖,这取决于你安装的 paping 版本

  • RedHat/CentOS:yum install -y libstdc++.i686 glibc.i686
  • Ubuntu/Debian:最小化安装无需依赖
$ paping -h
paping v1.5.5 - Copyright (c) 2011 Mike Lovell

Syntax: paping [options] destination

Options:
 -?, --help     display usage
 -p, --port N   set TCP port N (required)
     --nocolor  Disable color output
 -t, --timeout  timeout in milliseconds (default 1000)
 -c, --count N  set number of checks to N

2.4 mtr

mtr 是一个跨平台的网络诊断工具,将 tracerouteping 的功能结合到一个工具。与 traceroute 不同的是 mtr 显示的信息比起 traceroute 更加丰富:通过 mtr 可以确定网络的条数,并且可以同时打印响应百分比以及网络中各跳跃点的响应时间。

各系统下的安装 [2\][3]

Ubuntu/Debian: mtr  ;apt-get install -y mtr
Centos/Fedora: mtr ;yum install -y mtr
Apline:mtr ;apk add mtr --no-cache

最简单的示例,就是后接域名或 IP,这将跟踪整个路由

mtr google.com

Start: Thu Jun 28 12:10:13 2018
HOST: TecMint                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.0.1                0.0%     5    0.3   0.3   0.3   0.4   0.0
  2.|-- 5.5.5.211                  0.0%     5    0.7   0.9   0.7   1.3   0.0
  3.|-- 209.snat-111-91-120.hns.n 80.0%     5    7.1   7.1   7.1   7.1   0.0
  4.|-- 72.14.194.226              0.0%     5    1.9   2.9   1.9   4.4   1.1
  5.|-- 108.170.248.161            0.0%     5    2.9   3.5   2.0   4.3   0.7
  6.|-- 216.239.62.237             0.0%     5    3.0   6.2   2.9  18.3   6.7
  7.|-- bom05s12-in-f14.1e100.net  0.0%     5    2.1   2.4   2.0   3.8   0.5
  1. -n 强制 mtr 打印 IP 地址而不是主机名
$ mtr -n google.com

Start: Thu Jun 28 12:12:58 2018
HOST: TecMint                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.0.1                0.0%     5    0.3   0.3   0.3   0.4   0.0
  2.|-- 5.5.5.211                  0.0%     5    0.9   0.9   0.8   1.1   0.0
  3.|-- ???                       100.0     5    0.0   0.0   0.0   0.0   0.0
  4.|-- 72.14.194.226              0.0%     5    2.0   2.0   1.9   2.0   0.0
  5.|-- 108.170.248.161            0.0%     5    2.3   2.3   2.2   2.4   0.0
  6.|-- 216.239.62.237             0.0%     5    3.0   3.2   3.0   3.3   0.0
  7.|-- 172.217.160.174            0.0%     5    3.7   3.6   2.0   5.3   1.4
  1. -b 同时显示 IP 地址与主机名
$ mtr -b google.com

Start: Thu Jun 28 12:14:36 2018
HOST: TecMint                     Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.0.1                0.0%     5    0.3   0.3   0.3   0.4   0.0
  2.|-- 5.5.5.211                  0.0%     5    0.7   0.8   0.6   1.0   0.0
  3.|-- 209.snat-111-91-120.hns.n  0.0%     5    1.4   1.6   1.3   2.1   0.0
  4.|-- 72.14.194.226              0.0%     5    1.8   2.1   1.8   2.6   0.0
  5.|-- 108.170.248.209            0.0%     5    2.0   1.9   1.8   2.0   0.0
  6.|-- 216.239.56.115             0.0%     5    2.4   2.7   2.4   2.9   0.0
  7.|-- bom07s15-in-f14.1e100.net  0.0%     5    3.7   2.2   1.7   3.7   0.9
  1. -c 跟一个具体的值,这将限制 mtr ping 的次数,到达次数后会退出
$ mtr -c5 google.com
  1. 如果需要指定次数,并且在退出后保存这些数据,使用 -r flag
$ mtr -r -c 5 google.com >  1
$ cat 1
Start: Sun Aug 21 22:06:49 2022
HOST: xxxxx.xxxxx.xxxx.xxxx Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- gateway                    0.0%     5    0.6 146.8   0.6 420.2 191.4
  2.|-- 212.xx.21.241              0.0%     5    0.4   1.0   0.4   2.3   0.5
  3.|-- 188.xxx.106.124            0.0%     5    0.7   1.1   0.7   2.1   0.5
  4.|-- ???                       100.0     5    0.0   0.0   0.0   0.0   0.0
  5.|-- 72.14.209.89               0.0%     5   43.2  43.3  43.1  43.3   0.0
  6.|-- 108.xxx.250.33             0.0%     5   43.2  43.1  43.1  43.2   0.0
  7.|-- 108.xxx.250.34             0.0%     5   43.7  43.6  43.5  43.7   0.0
  8.|-- 142.xxx.238.82             0.0%     5   60.6  60.9  60.6  61.2   0.0
  9.|-- 142.xxx.238.64             0.0%     5   59.7  67.5  59.3  89.8  13.2
 10.|-- 142.xxx.37.81              0.0%     5   62.7  62.9  62.6  63.5   0.0
 11.|-- 142.xxx.229.85             0.0%     5   61.0  60.9  60.7  61.3   0.0
 12.|-- xx-in-f14.1e100.net  0.0%     5   59.0  58.9  58.9  59.0   0.0
  1. 默认使用的是 ICMP 协议 -i ,可以指定 -u, -t 使用其他协议
mtr --tcp google.com
  1. -m 指定最大的跳数
mtr -m 35 216.58.223.78
  1. -s指定包的大小

2.5 mtr 输出的数据

columdescribe
last最近一次的探测延迟值
avg探测延迟的平均值
best探测延的迟最小值
wrst探测延迟的最大值
stdev标准偏差.越大说明相应的节点越不稳定

2.6 丢包判断

任一节点的 Loss%(丢包率)如果不为零,则说明这一跳网络可能存在问题。导致相应节点丢包的原因通常有两种。

  • 运营商基于安全或性能需求,人为限制了节点的 ICMP 发送速率,导致丢包。
  • 节点确实存在异常,导致丢包。可以结合异常节点及其后续节点的丢包情况,来判定丢包原因。

Notes:

  • 如果随后节点均没有丢包,则通常说明异常节点丢包是由于运营商策略限制所致。可以忽略相关丢包。
  • 如果随后节点也出现丢包,则通常说明节点确实存在网络异常,导致丢包。对于这种情况,如果异常节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳的丢包率为准。如链路测试在第 5、6、7 跳均出现了丢包。最终丢包情况以第 7 跳作为参考。

2.7 延迟判断

由于链路抖动或其它因素的影响,节点的 Best 和 Worst 值可能相差很大。而 Avg(平均值)统计了自链路测试以来所有探测的平均值,所以能更好的反应出相应节点的网络质量。而 StDev(标准偏差值)越高,则说明数据包在相应节点的延时值越不相同(越离散)。所以标准偏差值可用于协助判断 Avg 是否真实反应了相应节点的网络质量。例如,如果标准偏差很大,说明数据包的延迟是不确定的。可能某些数据包延迟很小(例如:25ms),而另一些延迟却很大(例如:350ms),但最终得到的平均延迟反而可能是正常的。所以此时 Avg 并不能很好的反应出实际的网络质量情况。

这就需要结合如下情况进行判断:

  1. 如果 StDev 很高,则同步观察相应节点的 Best 和 wrst,来判断相应节点是否存在异常。
  2. 如果 StDev 不高,则通过 Avg 来判断相应节点是否存在异常。

三、Pod 网络排查流程

Pod 网络异常时排查思路,可以按照下图所示

在这里插入图片描述

四、案例学习

测试环境 k8s 节点扩容后无法访问集群 clusterlP 类型的 registry 服务

4.1 环境信息

在这里插入图片描述

  • cni 插件:flannel vxlan
  • kube-proxy 工作模式为 iptables
  • registry 服务
    • 单实例部署在 10.61.187.48:5000
    • Pod IP:10.233.65.46,
    • Cluster IP:10.233.0.100

4.2 现象

  1. 所有节点之间的 pod 通信正常
  2. 任意节点和 Pod curl registry 的 Pod 的 IP:5000 均可以连通
  3. 新扩容节点 10.153.204.15 curl registry 服务的 Cluster lP 10.233.0.100:5000 不通,其他节点 curl 均可以连通

4.3 分析思路

  1. 根据现象 1 可以初步判断 CNI 插件无异常
  2. 根据现象 2 可以判断 registry 的 Pod 无异常
  3. 根据现象 3 可以判断 registry 的 service 异常的可能性不大,可能是新扩容节点访问 registry 的 service 存在异常

4.3 怀疑方向

  1. 问题节点的 kube-proxy 存在异常
  2. 问题节点的 iptables 规则存在异常
  3. 问题节点到 service 的网络层面存在异常

4.4 排查顺序

  1. 排查问题节点的 kube-proxy
  2. 执行 kubectl get pod -owide -nkube-system l grep kube-proxy 查看 kube-proxy Pod 的状态,问题节点上的 kube-proxy Pod 为 running 状态
  3. 执行 kubecti logs <nodename> <kube-proxy pod name> -nkube-system 查看问题节点 kube-proxy 的 Pod 日志,没有异常报错
  4. 在问题节点操作系统上执行 iptables -S -t nat 查看 iptables 规则

4.5 排查过程

  1. 确认存在到 registry 服务的 Cluster lP 10.233.0.100 的 KUBE-SERVICES 链,跳转至 KUBE-SVC-* 链做负载均衡,再跳转至 KUBE-SEP-* 链通过 DNAT 替换为服务后端 Pod 的 IP 10.233.65.46。因此判断 iptables 规则无异常执行 route-n 查看问题节点存在访问 10.233.65.46 所在网段的路由,如下图所示

在这里插入图片描述

  1. 查看对端的回程路由

在这里插入图片描述
以上排查证明问题原因不是 cni 插件或者 kube-proxy 异常导致,因此需要在访问链路上抓包,判断问题原因、问题节点执行 curl 10.233.0.100:5000,在问题节点和后端 pod 所在节点的 flannel.1 上同时抓包发包节点一直在重传,Cluster lP 已 DNAT 转换为后端 Pod IP,如图所示(抓包过程,发送端)

在这里插入图片描述

  1. 后端 Pod( registry 服务)所在节点的 flannel.1 上未抓到任何数据包,如图所示(抓包过程,服务端)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

财务数字化在企业数字化转型中起到什么作用?

财务数字化在企业数字化转型中起到什么作用&#xff1f;许多企业在推动各大业务部门进行数字化转型时&#xff0c;往往会忽略财务部门。然而&#xff0c;作为掌握公司核心资源与数据和推动企业数字化建设的部门&#xff0c;财务也应成为企业数字化转型的重要突破口。 这篇就用…

Unity 之 Addressable可寻址系统 -- 可寻址系统使用介绍 -- 入门(三)

可寻址系统设置面板使用介绍介绍 -- 入门&#xff08;三&#xff09;一&#xff0c;可寻址系统目录介绍二&#xff0c;可寻址系统面板介绍2.1 Groups - 资源组2.2 Settings - 设置2.3 Profiles - 配置文件2.4 Event Viewer - 事件查看器2.5 Analyze - 分析工具2.6 Hosting - 托…

sklearn GridSearchCV网格搜索和SVM的两个参数 C 和 gamma

GridSearchCV&#xff0c;它存在的意义就是自动调参&#xff0c;只要把参数输进去&#xff0c;就能给出最优化的结果和参数。GridSearchCV用于系统地遍历多种参数组合&#xff0c;通过交叉验证确定最佳效果参数。 引用自&#xff1a;公众号&#xff1a; 写bug的程旭源 个人博客…

学生信息管理系统【JDBC+JS+MYSQL+HTML+JSP+Servlet】(一)

第一次发综合项目&#xff0c;无论是前端还是后端&#xff0c;都应用到了&#xff0c;项目写的很完整&#xff0c;我将分为四篇文章把项目代码写完&#xff0c;多多支持 一&#xff1a;项目背景 学生成绩管理系统是基于互联网的信息管理平台&#xff0c;主要提供成绩录入和查…

黄金的几种征兆

有别于股票、基金等的投资品种&#xff0c;由于现货黄金采用保证金的交易制度&#xff0c;因而使投资者有爆仓的可能。具体而言&#xff0c;爆仓是指在某些特殊条件下&#xff0c;投资者保证金账户中的客户权益变为负值的情形。在黄金交易的实战中&#xff0c;客户爆仓大多与资…

一文搞懂Spring,堪称Spring源码终结者

Spring的影响力想必无需与大家多说&#xff0c;如果你用spring&#xff0c;那么读读源码有助于对你最重要的工具的理解&#xff0c;好的框架源码也可以帮助我们理解什么是好代码。 刚参加工作那会&#xff0c;没想过去读源码&#xff0c;更没想过去改框架的源码&#xff1b;甚…

反序列化渗透与攻防(一)之PHP反序列化漏洞

前言 序列化和反序列化几乎是工程师们每天都要面对的事情&#xff0c;但是要精确掌握这两个概念并不容易&#xff1a;一方面&#xff0c;它们往往作为框架的一部分出现而湮没在框架之中&#xff1b;另一方面&#xff0c;它们会以其他更容易理解的概念出现&#xff0c;例如加密、…

干货 | 涉疫数据的安全应用方案

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;涉疫数据分类及问题剖析一、涉疫数据分类我们以新冠肺炎疫情为例&#xff0c;构建数据图谱&#xff0c;将涉疫数据分为三个大类&#xff0c;八个小类&#xff0c;共分为50项…

数字化营销,为何网站如此重要?

无论你在哪个行业&#xff0c;客户都会期望你有一个网站。没有网站的公司会发出信息&#xff0c;说他们已经停止运营&#xff0c;或者更糟的是&#xff0c;他们与客户失去了直接的联系。 通常企业的自有媒体由您的网站和社交媒体帐户组成。媒体付费广告等赢利媒体的数据不在您的…

你想要的100套HTML模板

好/看/的/网/页/这/都/有/ 目录 01 HTML 02 效果显示 03 文件演示 04 获取文件 源码链接 获取源码&#xff1f;私信&#xff1f;关注&#xff1f;点赞&#xff1f;收藏&#xff1f; 网页设计 Web design 2023/01/12 “Creativity is allowing yourself to make mista…

岁末年初再添佳誉丨Kyligence 荣获多个奖项及榜单认可

过去的一年&#xff0c;Kyligence 持续创新和打磨企业级产品&#xff0c;以全球领先的指标中台及多维数据库产品在金融、零售、制造、医疗等多个行业场景中逐步落地&#xff0c;实现数智化管理与业务的深度融合。岁末年初&#xff0c;Kyligence 再添佳誉&#xff0c;技术产品、…

第二章.线性回归以及非线性回归—多元线性回归

第二章.线性回归以及非线性回归 2.6 多元线性回归 1.特征&#xff1a; 1).单特征&#xff1a; 2).多特征&#xff1a; 有多少个特征就有多少个未知数x 2.多元线性回归模型的使用场景&#xff1a; 当Y值的影响因素不是唯一时&#xff0c;采用多元线性回归。 3.梯度下降法求解…

【自然语言处理】【chatGPT系列】大语言模型可以自我改进

大语言模型可以自我改进《Large Language Models Can Self-Improve》论文地址&#xff1a;https://arxiv.org/pdf/2210.11610.pdf 相关博客 【自然语言处理】【chatGPT系列】大语言模型可以自我改进 【自然语言处理】【ChatGPT系列】WebGPT&#xff1a;基于人类反馈的浏览器辅助…

python 波士顿房价预测

数据集地址&#xff1a;Index of /ml/machine-learning-databases/housing (uci.edu) 数据集中共有506条样本数据&#xff0c;每条样本包含了13个影响房价的特征。 数据集格式 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98 2…

openlayers浅入(了解框架逻辑以及简单使用)

openlayers浅入&#xff08;了解框架逻辑以及简单使用&#xff09; 项目需求&#xff0c;使用openlayers替换天地图api开发&#xff0c;记录openlayer的使用 简介 OpenLayers是一个用于开发WebGIS客户端的JavaScript包&#xff0c;最初基于BSD许可发行。OpenLayers是一个开源的…

1575_AURIX_TC275_MTU简介以及部分寄存器

全部学习汇总&#xff1a; GitHub - GreyZhang/g_TC275: happy hacking for TC275! 从今天开始看一个全新的模块介绍MTU&#xff0c;存储测试单元。 TC275中所有的ECC、内置测试以及存储冗余等都有一个统一的接口规范。MTU负责管理所有的存储测试功能。MTU主要有两套寄存器&am…

【iOS】系统框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言熟悉系统框架多用块枚举&#xff0c;少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式对自定义其内存管理语义的collection使…

Wechaty API 方法 文档整理

背景&#xff1a;刚使用wechaty的时候&#xff0c;对一个不熟悉初学者来说&#xff0c;看官方文档比较费时间&#xff0c;所以把方法和描述集合在一张表上&#xff0c;再使用的时候找对应的方法会比较直观。 中文文档&#xff1a; 介绍 - Wechatyhttps://wechaty.gitbook.io/…

【docker15】docker网络

1.docker网络是什么 docker不启动&#xff0c;默认网络情况 ens33lovirbr0 在CentOS7安装过程中&#xff0c;如果有选择相关虚拟化的服务安装系统后&#xff0c;启动网卡时会发现有一个网桥连接的私网地址的virbr0网卡&#xff08;virbr0网卡&#xff1a;它还有一个固定的默认…

【蓝桥杯】历届真题 魔方旋转问题(高职组) Java

问题描述 魔方可以对它的6个面自由旋转。   我们来操作一个2阶魔方&#xff0c;如图&#xff1a; 为了描述方便&#xff0c;我们为它建立了坐标系。   各个面的初始状态如下&#xff1a;   x轴正向&#xff1a;绿   x轴反向&#xff1a;蓝   y轴正向&#xff1a;红  …