使用 tcpdump 抓取 Kubernetes 内 pod 的流量.
简述
Kubernetes cni 插件使用的是 flannel,使用 tcpdump 抓取 pod 流量不能直接抓 eth0 网卡,要抓取 cni0 网卡 。
排查
问题:redis 集群发现大量来自 Kubernetes 节点的连接数。
查看连接数到了多少:
info clients
发现连接数以及快满了。
肉眼查看了一下连接池:
client list
,发现大部分来自 Kubernetes 集群的某一个节点。
登录 redis 节点查看连接状态:
1
2
3
4
5
6
7
|
netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n
1 established)
1 FIN_WAIT2
1 State
23 TIME_WAIT
36 LISTEN
14309 ESTABLISHED
|
确认一下来源ip看看是不是确实是 Kubernetes 的某个节点:
1
2
3
4
5
6
7
8
|
netstat -nat|grep ":7001"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
104 192.168.xx.xx
118 192.168.xx.xx
156 192.168.xx.xx
161 192.168.xx.xx
204 192.168.xx.xx
624 192.168.xx.xx
8213 192.168.xx.xx
|
登录到 Kubernetes 连接数最多的宿主机上抓包:
1
2
3
4
5
6
7
8
9
|
tcpdump -nn -i cni0 dst 192.168.22.9 and port 7001
11:45:12.340864 IP 10.2.5.241.43602 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026099], length 0
11:45:12.340883 IP 10.2.5.241.43598 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026099], length 0
11:45:12.340892 IP 10.2.5.241.43594 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026099], length 0
11:45:12.340929 IP 10.2.5.241.43592 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026098], length 0
11:45:12.340975 IP 10.2.5.241.43596 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026098], length 0
11:45:12.341046 IP 10.2.5.241.43600 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026097], length 0
11:45:12.341055 IP 10.2.5.241.43604 > 192.168.xx.xx.7001: Flags [.], ack 1, win 507, options [nop,nop,TS val 2312824864 ecr 885026097], length 0
|
结束
我们可以看到,就是 10.2.5.241 这个 pod 一直在连接,抓到 pod 后,查看是哪个服务,再找到对应的业务侧确认,最后确认是服务的 bug 。