在使用 kubernetes 跑应用的时候,可能会遇到一些网络问题,比较常见的是服务端无响应(超时)或回包内容不正常,如果没找出各种配置上有问题,这时我们需要确认数据包到底有没有最终被路由到容器里,或者报文到达容器的内容和出容器的内容符不符合预期,通过分析报文可以进一步缩小问题范围。那么如何在容器内抓包呢?
本文提供实用的方法一键进入容器网络命名空间(netns),使用宿主机上的tcpdump进行抓包。
1、查看容器所在node节点ip
[root@harbor ]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-test-5b87f64654-nbh5d 1/1 Running 0 68d 172.21.68.228 ap-southeast-1.172.21.53.204 <none> <none>
2、获取container id
[root@harbor ]# kubectl describe pods nginx-test-5b87f64654-nbh5d | grep docker
Container ID: docker://05337700823e3d5ab5e3ce22270eb9ca975047d0e412a3c5ff029c17afb0b4d7
Image ID: docker-pullable://harbor.hcloud.com:81/library/nginx@sha256:7e8a23b29ff996d7152705ee1bc471951b967ef27acd70e26475c033f73975ac
3、登录pod所在服务器获取容器pid
[root@iZt4n1gvg0s2ndoqxgkzfaZ ~]# docker inspect -f {{.State.Pid}} 05337700823e3d5ab5e3ce22270eb9ca975047d0e412a3c5ff029c17afb0b4d7
3079932
4、进入pod的network namespace
[root@iZt4n1gvg0s2ndoqxgkzfaZ ~]# nsenter -n --target pid
说明:这时已经进入 pod 的 netns,可以执行宿主机上的 ip a 或 ifconfig 来查看容器的网卡,执行 netstat -tunlp 查看当前容器监听了哪些端口
5、通过宿主机 tcpdump 命令抓包,然后用wireshark分析即可
[root@iZt4n1gvg0s2ndoqxgkzfaZ ~]# tcpdump -i eth0 -w test.pcap port 80