对K8S的pod进行抓包

前言

有时需要查看pod的网络数据包,但pod一般没有tcpdump命令。这里介绍如何在宿主机上对pod进行网络抓包

nsenter 使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
nsenter [options] [program [arguments]]

options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

抓包步骤

比如要对名为greeter-grpc-cli pod进行抓包

1
2
3
kubectl get pods greeter-grpc-cli-deployment-5bb97fd9cc-sgmq5 -o wide
NAME                                           READY   STATUS    RESTARTS   AGE   IP           NODE            NOMINATED NODE   READINESS GATES
greeter-grpc-cli-deployment-5bb97fd9cc-sgmq5   2/2     Running   0          21d   10.32.0.12   vm-4-2-ubuntu   <none>           <none>
  1. 安装 nsenter
1
apt install util-linux
  1. 查找containerID
1
2
3
4
5
6
7
8
crictl ps
CONTAINER           IMAGE                                                                                                                                       CREATED             STATE               NAME                      ATTEMPT             POD ID
ccfb9e0db7f97       393cf1d5c95a6                                                                                                                               2 weeks ago         Running             istio-proxy               0                   2f84e757f1050
9d85e6b43e69e       ********/greeter-grpc@sha256:19511605390fb29beb9c87845b13b66b013340c88318c5220073aab72ce75213                                              2 weeks ago         Running             greeter-grpc-svc          0                   2f84e757f1050
74c96c2f11059       393cf1d5c95a6                                                                                                                               2 weeks ago         Running             istio-proxy               0                   06be1fe958aa1
760cde3cabce9       ********/greeter-grpc@sha256:19511605390fb29beb9c87845b13b66b013340c88318c5220073aab72ce75213                                              2 weeks ago         Running             greeter-grpc-svc          0                   06be1fe958aa1
900286bf1bbfe       393cf1d5c95a6                                                                                                                               2 weeks ago         Running             istio-proxy               0                   22d9e9f643cb8
7116f44850a08       ********/greeter-grpc-client@sha256:038dcbc6c3df21dda59d925d6185fe95179aef4418229d1cdf62fbf89e599ce1                                       2 weeks ago         Running             greeter-grpc-cli          0                   22d9e9f643cb8
  1. 查找PID
1
2
3
docker top 7116f44850a08
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                1712108             1712089             0                   Apr10               ?                   00:00:27            /opt/app/server
  1. 进入pod所在的命名空间
1
nsenter -n -t 1712108
  1. 查看是否已经进入pod的命名空间 可以看到此处只显示了两个网卡eth0的地址与上面查看pod的内网地址相同,说明已经进入了
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1376
        inet 10.32.0.12  netmask 255.240.0.0  broadcast 10.47.255.255
        ether b2:0e:5d:4c:d3:70  txqueuelen 0  (Ethernet)
        RX packets 6150082  bytes 626075350 (626.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4340063  bytes 449149455 (449.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2728060  bytes 401944336 (401.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2728060  bytes 401944336 (401.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. 使用tcpdump进行抓包 此处的端口为pod对外暴露的地址,而不是通过宿主机对外的端口
1
tcpdump -nnnvv -As 0 -i eth0 port 8000 -w test.pcap
  1. 下载抓包文件test.pcap到本机,使用wireshark查看 信息如下 wireshark信息