【Kubernetes】ksniffでパケットキャプチャ
はじめに
Kubernetes で ksniff を使ってパケットキャプチャをする方法を紹介します。
ksniff
ksniff は、tcpdump と Wireshark でのパケットキャプチャができる kubectl プラグインです。
tcpdump のバイナリをコンテナに追加、もしくは別の Pod から tcpdump でパケットキャプチャし、その結果をローカルの Wireshark に送ってくれます。
GitHub - eldadru/ksniff: Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark
Kubectl plugin to ease sniffing on kubernetes pods using tcpdump and wireshark - eldadru/ksniff
ksniff はまだ production ready ではないので、本番環境での動作はおすすめしないみたいです。なので、開発用の環境やローカルで検証する時に使うツールとして考えるのが良さそうです。
インストール
krew
を使って、インストールできます。
1kubectl krew install sniff
krew
については、下記を参考にしてください。
【Kubernetes】Krewでkubectlのプラグインを管理する
はじめに kubectlのプラグインを管理できるKrewについて紹介していきます。 Krewと
使い方
基本的な使い方は下記の通りです。
1kubectl sniff <POD_NAME> [-n <NAMESPACE_NAME>] [-c <CONTAINER_NAME>] [-i <INTERFACE_NAME>] [-f <CAPTURE_FILTER>] [-o OUTPUT_FILE] [-l LOCAL_TCPDUMP_FILE] [-r REMOTE_TCPDUMP_FILE]
non-privileged ユーザーで実行している Pod は、-p
をつけると、別の Pod を作成し、そこから特権モードでキャプチャしてくれます。
試してみる
試しに下記のサンプルアプリでパケットキャプチャしてみます。
Bookinfo Application
Deploys a sample application composed of four separate microservices used to demonstrate various Istio features.
1❯ kubectl get pod
2NAME READY STATUS RESTARTS AGE
3details-v1-698d88b-wl7jh 2/2 Running 0 7m7s
4productpage-v1-675fc69cf-nrmth 2/2 Running 0 7m6s
5ratings-v1-6484c4d9bb-db29m 2/2 Running 0 7m7s
6reviews-v1-5b5d6494f4-6rr5c 2/2 Running 0 7m6s
7reviews-v2-5b667bcbf8-22hn6 2/2 Running 0 7m6s
8reviews-v3-5b9bd44f4-m5qsh 2/2 Running 0 7m6s
ksniff を実行します。
1❯ kubectl sniff productpage-v1-675fc69cf-nrmth -n default -c productpage -p
2INFO[0000] sniffing method: privileged pod
3INFO[0000] sniffing on pod: 'productpage-v1-675fc69cf-nrmth' [namespace: 'default', container: 'productpage', filter: '', interface: 'any']
4INFO[0000] creating privileged pod on node: 'docker-desktop'
5INFO[0000] pod: 'ksniff-nmsc7' created successfully in namespace: 'default'
6INFO[0000] waiting for pod successful startup
7INFO[0003] pod: 'ksniff-nmsc7' created successfully on node: 'docker-desktop'
8INFO[0003] spawning wireshark!
9
10...
実行すると、Wireshark が起動して、パケットの確認ができます。
Pod も確認してみると、ksniff の Pod が起動していることが確認できます。
1❯ kubectl get pod
2NAME READY STATUS RESTARTS AGE
3details-v1-698d88b-wl7jh 2/2 Running 0 12m
4ksniff-nmsc7 2/2 Running 0 2m26s
5productpage-v1-675fc69cf-nrmth 2/2 Running 0 12m
6ratings-v1-6484c4d9bb-db29m 2/2 Running 0 12m
7reviews-v1-5b5d6494f4-6rr5c 2/2 Running 0 12m
8reviews-v2-5b667bcbf8-22hn6 2/2 Running 0 12m
9reviews-v3-5b9bd44f4-m5qsh 2/2 Running 0 12m
エラー
使っている時にいくつかエラーに遭遇したので、解決策とともに紹介します。
Error: exec: "wireshark": executable file not found in $PATH
まずは、下記のエラーです。
1...
2
3Error: exec: "wireshark": executable file not found in $PATH
こちらは、下記の Issue で解決されていました。
Error: exec: "wireshark": executable file not found in $PATH · Issue #88 · eldadru/ksniff
Hi, I am using macos and i have installed wireshark I tried sniffing one of my pods using the command kubectl sniff pod-name -n namespace and below is where its erroring out Error: exec: "wireshark...
解決方法としては、/usr/local/bin
にwireshark
のスクリプトを作成する必要があります。
まずは、/usr/local/bin
にwireshark
を作成します。
1cd /usr/local/bin/
2sudo vim wireshark
wireshark
の内容は下記の通りです。
1#!/usr/bin/env bash
2WIRESHARK="/Applications/Wireshark.app/Contents/MacOS/Wireshark"
3${WIRESHARK} "$@"
4exit $?
作成したら、実行権限をつけて完了です。
1cd /usr/local/bin/
2chmod a+x wireshark
failed to start remote sniffing, stopping wireshark error="executing sniffer failed, exit code: '1'"
次は、下記のエラーです。
1...
2
3
4INFO[0000] start sniffing on remote container
5INFO[0000] executing command: '[/tmp/static-tcpdump -i any -U -w - ]' on container: 'productpage', pod: 'productpage-v1-6c4f8467b9-5bb9p', namespace: 'default'
6INFO[0000] command: '[/tmp/static-tcpdump -i any -U -w - ]' executing successfully exitCode: '1', stdErr :'static-tcpdump: any: You don't have permission to capture on that device
7(socket: Operation not permitted)
8'
9ERRO[0000] failed to start remote sniffing, stopping wireshark error="executing sniffer failed, exit code: '1'"
10INFO[0000] starting sniffer cleanup
11INFO[0000] sniffer cleanup completed successfully
12Error: signal: killed
こちらは、下記の Issue でも質問されていますが、私の場合は-p
オプションをつけることで解決できました。
command: '[/tmp/static-tcpdump -i any -U -w - ]' executing successfully exitCode: '126' · Issue #72 · eldadru/ksniff
After running kubectl sniff <POD> -n <NAMESPACE> I get the following output with error: INFO[0000] sniffing method: upload static tcpdump INFO[0000] using tcpdump path at: '/Users/jason/.krew/store...
1kubectl sniff -p <POD_NAME>