k8s中如何对pod进行抓包
1.列出待抓包的pod 及分布在哪些节点上
kubectl get pods -n namespace -o wide | egrep myapp
2.找到pod中容器的eth0网卡对应的veth pair在宿主机上的网卡编号
kubectl -n namespace exec -it myapp-xxxxxx-xxxx -- cat /sys/class/net/eth0/iflink
得到结果类似:533
如果容器里面有ethtool命令,也可以通过下面的命令来获取
kubectl -n namespace exec -it myapp-xxxxxx-xxxx -- ethtool -S eth0
得到结果类似:
NIC statistics:
peer_ifindex: 533
3.根据前两步的结果,找到宿主机上的veth pair对应的宿主机网卡名称
- myapp这个pod对应的宿主机的ip是在第一步获得的
- 宿主机上的网卡编号是在第二步获得的
登录到对应的宿主机上,执行下面的命令
for i in /sys/class/net/veth*/ifindex; do grep -l 533 $i; done
得到结果类似:/sys/class/net/veth79c1674f/ifindex
其中veth79c1674f就是网卡名称
当然,也可以直接执行ip a命令,然后用肉眼去找533这个编号
4.在宿主机上利用tcpdump抓包:
tcpdump -i veth79c1674f -w /root/tcpdump.cap
5.然后用wireshark分析:
将服务器上的/root/tcpdump.cap这个文件下载到电脑上,然后使用wireshark打开,使用常用的条件表达式,例如 ip.addr == x.x.x.x