GIG

赴くままに技術を。

AKSでネットワークパケットキャプチャを取得する

どこそこへつながらないや、つながるけどたまに切れるといった場面でネットワークパケットキャプチャを取得することがあるかと思います。 AKSの場合にどうやって取得するのかまとめてみました。

AKSノードにて取得

対象AKSノードにSSH接続し取得する方法で、一番簡単で取得可能な方法になります。 反面、解析する際には !(ip.addr == 168.63.129.16) 等、フィルタリングして目的の通信を見る必要があります。

参考; IP アドレス 168.63.129.16 とは | Microsoft Docs

  1. AKSノードにSSH接続する

AKSノードに到達可能な仮想ネットワークに踏み台サーバを用意するか、以下のヘルパーPod経由で対象AKSノードにSSH接続

Azure Kubernetes Service (AKS) クラスター ノードへの SSH 接続 - Azure Kubernetes Service | Microsoft Docs

2.ネットワークパケットキャプチャを取得する

sudo tcpdump -i any -s 0 -vvv -w `hostname`.pcap
...
対象のアクセスや操作を実行後、[Ctrl]+[C] により完了

3.対象ノードからネットワークパケットキャプチャを引き上げる

AKSノードからヘルパーPod/踏み台サーバへ scp コマンドによりコピーし、次いで、ローカル環境にコピー ヘルパーPodからローカル環境にコピーするには以下のように実施

kubectl cp $(kubectl get pod -l run=aks-ssh -o jsonpath='{.items[0].metadata.name}'):/(パケットキャプチャ結果).pcap (パケットキャプチャ結果).pcap

Podから取得

フィルタリングが楽であるためにPodからネットワークパケットキャプチャを取得できることが望ましいですが、 distrolessイメージの利用など、なるべくtcpdumpコマンドなど省いて作られたイメージを使うことが推奨事項になっています。

本命は、Ephemeral Container (kubectl debug コマンド) により対象のPodを変更させず、ネットワーク名前空間を共有する一時的なPodから取得する方法です。

Debug Running Pods | Kubernetes

上記はAlphaステージの機能のため、AKSなどのマネージドKubernetesでは対応していない状況です (GKEのアルファクラスターなら可能?)。 それに代わるものとして、ksniffというツールが現時点ではよさそうな印象があります。

GitHub - eldadru/ksniff: Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark

# 1.5.0 では問題があり (https://github.com/eldadru/ksniff/issues/82)、1.4.2を利用します
$ wget https://github.com/eldadru/ksniff/releases/download/v1.4.2/ksniff.zip
$ unzip ksniff.zip
$ sudo make install
$ kubectl sniff -p (Pod名) -n (名前空間名) -o (出力先ファイル名).pcap
...
対象のアクセスや操作を実行後、[Ctrl]+[C] により完了
````