Overview
本文将引入一个思路:“在Kubernetes集群发生网络异常时如何排查”。文章将引入Kubernetes 集群中网络排查的思路,包含网络异常模型,常用工具,并且提出一些案例以供学习。
- Pod常见网络异常分类
- 网络排查工具
- Pod网络异常排查思路及流程模型
- CNI网络异常排查步骤
- 案例学习
Pod网络异常
网络异常大概分为如下几类:
- 网络不可达,主要现象为ping不通,其可能原因为:
- 源端和目的端防火墙(iptables, selinux)限制
- 网络路由配置不正确
- 源端和目的端的系统负载过高,网络连接数满,网卡队列满
- 网络链路故障
- 端口不可达:主要现象为可以ping通,但telnet端口不通,其可能原因为:
- 源端和目的端防火墙限制
- 源端和目的端的系统负载过高,网络连接数满,网卡队列满,端口耗尽
- 目的端应用未正常监听导致(应用未启动,或监听为127.0.0.1等)
- DNS解析异常:主要现象为基础网络可以连通,访问域名报错无法解析,访问IP可以正常连通。其可能原因为
- Pod的DNS配置不正确
- DNS服务异常
- pod与DNS服务通讯异常
- 大数据包丢包:主要现象为基础网络和端口均可以连通,小数据包收发无异常,大数据包丢包。可能原因为:
- 数据包的大小超过了 dockero,CNI 插件,或者宿主机网卡的 MTU 值。
- CNI异常:主要现象为Node可以通,但Pod无法访问集群地址,可能原因有:
- kube-proxy 服务异常,没有生成 iptables 策略或者 ipvs 规则导致无法访问
- CIDR耗尽,无法为Node注入 PodCIDR 导致 CNI 插件异常
- 其他 CNI 插件问题
那么整个Pod网络异常分类可以如下图所示:
图:Pod network trouble hirarchy总结一下,Pod最常见的网络故障有,网络不可达(ping不通);端口不可达(telnet不通);DNS解析异常(域名不通)与大数据包丢失(大包不通)。
常用网络排查工具
在了解到常见的网络异常后,在排查时就需要使用到一些网络工具才可以很有效的定位到网络故障原因,下面会介绍一些网络排查工具。
tcpdump [1]
tcpdump网络嗅探器,将强大和简单结合到一个单一的命令行界面中,能够将网络中的报文抓取,输出到屏幕或者记录到文件中。
各系统下的安装
- Ubuntu/Debian: tcpdump ;apt-get install -y tcpdump
- Centos/Fedora: tcpdump ;yum install -y tcpdump
- Apline:tcpdump ;apk add tcpdump --no-cache
查看指定接口上的所有通讯
语法
参数说明-i [interface] -w [flle]第一个n表示将地址解析为数字格式而不是主机名,第二个N表示将端口解析为数字格式而不是服务名-n不显示IP地址-Xhex and ASCII-AASCII(实际上是以人类可读懂的包进行显示)-XX-v详细信息-r读取文件而不是实时抓包关键字typehost(主机名,域名,IP地址), net, port, portrangedirectionsrc, dst, src or dst , src and dsprotocolether, ip,arp, tcp, udp, wlan捕获所有网络接口
按IP查找流量
最常见的查询之一 host,可以看到来往于 1.1.1.1 的流量。按源/目的 地址过滤
如果只想查看来自/向某方向流量,可以使用 src 和 dst。通过网络查找数据包
使用 net 选项,来要查找出/入某个网络或子网的数据包。使用十六进制输出数据包内容
hex 可以以16进制输出包的内容查看特定端口的流量
使用 port 选项来查找特定的端口流量。- tcpdump port 3389
- tcpdump src port 1025
复制代码 查找端口范围的流量
过滤包的大小
如果需要查找特定大小的数据包,可以使用以下选项。你可以使用 less,greater。
[code]tcpdump less 32tcpdump greater 64tcpdump |