kubernetes 容器内抓包

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

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

你可能感兴趣的:(kubernetes,docker,容器)