k8s pod抓包

1 列出待抓包的pod 及分布在哪些节点上

kubectl get pods -n ns1 -o wide | egrep myapp

2 找到对应的containerID

1
2
kubectl get pod -n ns1 myapp-xxxxxx-xxxx -o json | jq .status.containerStatuses[0].containerID
kubectl get pod myapp-xxxxxx-xxxx -ojson | jq ".status.containerStatuses[] | {name: .name, "dockerid" : .containerID}" -c

这里我们可以看到一些 containerID 的信息,记录下来,例如我的是 f712d63e9415c02472dd247219fe2245bae8a13c03838b3043434dae81c2565e

3 到对应的K8s Node节点上执行下面命令:

1
docker exec f712d63e9415c02472dd247219fe2245bae8a13c03838b3043434dae81c2565e /bin/bash -c 'cat /sys/class/net/eth0/iflink'

得到结果类似:533

4 然后去找对应的虚拟网卡地址:

1
for i in /sys/class/net/*/ifindex; do grep -l 533 $i; done  #不通网络插件网卡名称不通

得到结果类似:/sys/class/net/veth79c1674f/ifindex

**5 这样就可以在宿主机上抓包:
**

1
tcpdump -i veth79c1674f -w /root/tcpdump.cap

6 然后用wireshark分析:

例如常用的条件表达式: ip.addr == x.x.x.x