どこそこへつながらないや、つながるけどたまに切れるといった場面でネットワークパケットキャプチャを取得することがあるかと思います。 AKSの場合にどうやって取得するのかまとめてみました。
AKSノードにて取得
対象AKSノードにSSH接続し取得する方法で、一番簡単で取得可能な方法になります。
反面、解析する際には !(ip.addr == 168.63.129.16)
等、フィルタリングして目的の通信を見る必要があります。
参考; IP アドレス 168.63.129.16 とは | Microsoft Docs
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というツールが現時点ではよさそうな印象があります。
# 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] により完了 ````