目录

kubernetes排错-tcpdump 抓取 pod 流量

使用 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 。