やりたいこと
WorkerNode上で動作する特定のPod(例IngressController等)を宛先とする通信のパケットを取得する。
環境情報
- Kubernetes v1.23
やり方
tcpdumpが含まれたコンテナイメージを用意した上でIngress ControllerのPodが動くWorkerNodeを以下のYAMLのnodeSelectorに記載。
apiVersion: v1 kind: Pod metadata: name: test namespace: default spec: containers: - args: ["-c", "sleep 1d"] command: ["/bin/sh"] image: testimage:latest imagePullPolicy: IfNotPresent name: test resources: {} securityContext: privileged: true runAsUser: 0 dnsPolicy: ClusterFirst hostNetwork: true hostPID: true nodeSelector: kubernetes.io/hostname: XX restartPolicy: Never securityContext: {}
同Podの中にshで入った上でIngress ControllerのPodのIP及びネットワークインターフェースを指定すると
/ # tcpdump -i eth0 host X.X.X.X -w test.pcap tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes ^C19 packets captured 19 packets received by filter 0 packets dropped by kerne ...
パケットが取得できる。
以下、補足です。
補足
WorkerNode上でパケットを取得するため特権レベルでコンテナを動作させています。
尚、tcpdumpコマンドは以下を利用していますが
# tcpdump --version tcpdump version 4.9.3 libpcap version 1.9.1 (with TPACKET_V3) OpenSSL 1.1.1g 21 Apr 2020
コンテナイメージに採用したOSイメージによってはファイル書き出しのオプションをつけると以下のエラーになる場合がありました。
/ # tcpdump -i eth0 host X.X.X.X -w test.pcap tcpdump: Couldn't change ownership of savefile
その場合でもコンテナイメージを変更すると同じバージョンのtcpdumpコマンドが動作したことを合わせて記しておきます。
以上。