特定の Kubernets Pod についてパケットキャプチャを取得する場合、Pod 内で tcpdump を取得し、kubectl cp または docker cp コマンドによりホストOS 側にコピーする方法と、bridge の vEth インターフェースで tcpdump を取得する方法があります。通常は後者をおすすめします。
Pod 内で tcpdump を取得した場合、kubectl cp コマンドの実行が制限されていることがあります。その場合は docker ps コマンドでコンテナ ID を確認し、docker cp を使用する必要があります。コピー後はコンテナからキャプチャファイルを削除してください。
[Fri Jul 24 0:41:15 UTC] maglev@10.70.70.231 (maglev-master-1) tmp
$ magctl service attach -D command-runner
Attaching to 'fusion/command-runner-service-87649dc96-ssgg6'
root@command-runner-service-87649dc96-ssgg6:/# tcpdump -i eth0 -w /pod.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C215 packets captured
215 packets received by filter
0 packets dropped by kernel
root@command-runner-service-87649dc96-ssgg6:/#exit
Fri Jul 24 03:46:28 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ kubectl cp fusion/command-runner-service-87649dc96-ssgg6:/pod.pcap /data/tmp/pod.pcap
error: pod.pcap no such file or directory
[Fri Jul 24 03:46:32 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ docker ps | grep command-runner | grep -v POD
c4a2189deb00 maglev-registry.maglev-system.svc.cluster.local:5000/fusion/command-runner-service "/opt/maglev/bin/ser…" 2 weeks ago Up 2 weeks k8s_command-runner-service_command-runner-service-87649dc96-ssgg6_fusion_8bdb70da-bfa7-11ea-8836-3cfdfeced6e4_0
[Fri Jul 24 03:46:47 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ docker cp c4a2189deb00:/pod.pcap /data/tmp/pod.pcap
[Fri Jul 24 03:47:18 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ ls -l /data/tmp/*.pcap
-rw-r--r-- 1 maglev maglev 134616 Jul 24 02:49 /data/tmp/pod.pcap
[Fri Jul 24 03:47:26 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ magctl service attach -D command-runner
Attaching to 'fusion/command-runner-service-87649dc96-ssgg6'
root@command-runner-service-87649dc96-ssgg6:/# rm /pod.pcap
root@command-runner-service-87649dc96-ssgg6:/# exit
exit
ホスト OS 側で tcpdump を取得する場合は、Pod 内のコンテナの eth0 とペアリングされている vEth のインターフェース番号を確認し、そのインターフェースを指定して tcpdump を取得します。
まず、Pod にログインして ip address コマンド等を実行します。以下の例では vEth #470 がペアリングされていることが分かります。docker exec コマンドでの確認も可能です。
[Thu Jul 23 19:22:43 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ magctl service attach -D command-runner
Attaching to 'fusion/command-runner-service-87649dc96-ssgg6'
root@command-runner-service-87649dc96-ssgg6:/# ip address show dev eth0
4: eth0@if470: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 36:6b:85:07:1e:bc brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.61.3.190/32 scope global eth0
valid_lft forever preferred_lft forever
root@command-runner-service-87649dc96-ssgg6:/# exit
exit
または docker コマンドでの確認
[Thu Jul 23 19:22:48 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ docker ps | grep command-runner | grep -v POD
c4a2189deb00 maglev-registry.maglev-system.svc.cluster.local:5000/fusion/command-runner-service "/opt/maglev/bin/ser…" 2 weeks ago Up 2 weeks k8s_command-runner-service_command-runner-service-87649dc96-ssgg6_fusion_8bdb70da-bfa7-11ea-8836-3cfdfeced6e4_0
[Thu Jul 23 19:23:01 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ docker exec -it c4a2189deb00 ip address show dev eth0
4: eth0@if470: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 36:6b:85:07:1e:bc brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.61.3.190/32 scope global eth0
valid_lft forever preferred_lft forever
当該インターフェース番号のインターフェース名を指定して tcpdump を実行し、通信を発生させることでパケットキャプチャを取得できます。
[Thu Jul 23 19:23:32 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ ip address | grep ^470
470: cali8017e49ca81@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
[Thu Jul 23 19:24:14 UTC] maglev@10.70.70.231 (maglev-master-1) ~
$ sudo tcpdump -i cali8017e49ca81 -w /data/tmp/command-runner.pcap
tcpdump: listening on cali8017e49ca81, link-type EN10MB (Ethernet), capture size 262144 bytes
^C268 packets captured
277 packets received by filter
0 packets dropped by kernel