View a markdown version of this page

kubectl と S3 を使用して、マネージドノード上のネットワークトラフィックをキャプチャする - Amazon EKS

このページの改善にご協力ください

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。

kubectl と S3 を使用して、マネージドノード上のネットワークトラフィックをキャプチャする

ノードモニタリングエージェントを備えた Amazon EKS マネージドノードで、ネットワークトラフィックをキャプチャする方法について説明します。エージェントはノードで tcpdump を実行し、キャプチャファイルを圧縮して、S3 バケットにアップロードします。

前提条件

以下があることを確認します。

  • ノードモニタリングエージェントを備えた既存の Amazon EKS 自動モードクラスター。詳細については、ノードのヘルス問題を検出し、自動ノード修復を有効にする を参照してください。

  • クラスターと通信するようにインストールおよび設定された kubectl コマンドラインツール。

  • S3 バケットとオブジェクトを作成するのに十分なアクセス許可が付与された状態でインストールおよびログインした AWS CLI。

  • インストール済みの Python 3 最新バージョン

  • インストール済みの AWS SDK for Python 3、Boto 3。

  • PyYAML ライブラリがインストールされました (pip install pyyaml)。

ステップ 1: S3 バケットの宛先を作成する (任意)

キャプチャファイルを保存するための S3 バケットがまだない場合は、作成します。bucket-nameregion をご自身の値に置き換えます。

aws s3api create-bucket --bucket <bucket-name> \ --region <region> \ --create-bucket-configuration LocationConstraint=<region>
注記

--create-bucket-configuration パラメータは、us-east-1 を除くすべてのリージョンで必要です。

ステップ 2: パケットキャプチャを開始する

ノードモニタリングエージェントリポジトリ (tools/start-capture.py) の start-capture.py スクリプトを使用して、署名付き S3 認証情報を生成し、NodeDiagnostic リソースを作成してクラスターに適用します。

  1. トラフィックをキャプチャしたいノードを特定します。

    kubectl get nodes
  2. ノードモニタリングエージェントリポジトリからローカルマシンに start-capture.py スクリプトを保存して実行します。<bucket-name><node-name> をご自身の値に置き換えます。

    python3 start-capture.py --bucket <bucket-name> --node <node-name>

    一般的なオプション:

    # Capture for 5 minutes on eth0 with a filter python3 start-capture.py --bucket <bucket-name> --node <node-name> \ --duration 5m --interface eth0 --filter "tcp port 443" # Preview the YAML without applying python3 start-capture.py --bucket <bucket-name> --node <node-name> --dry-run

    スクリプトには、 boto3pyyaml がインストールされ、クラスター用に kubectl 設定された Python 3 が必要です。

    スクリプトは、次のような NodeDiagnostic リソースを生成します。この例は参照用です。upload フィールドには、スクリプトによってプログラムで生成された署名付き S3 POST 認証情報が必要であることに注意してください。

    apiVersion: eks.amazonaws.com/v1alpha1 kind: NodeDiagnostic metadata: name: <node-name> # Required: node instance ID spec: packetCapture: duration: "30s" # Required: capture duration (max 1h) # interface: "eth0" # Optional: default is primary ENI. Use "any" for all interfaces # filter: "tcp port 443" # Optional: tcpdump filter expression # chunkSizeMB: 10 # Optional: file rotation size in MB (1-100, default: 10) upload: # Required: pre-signed S3 POST credentials url: "https://<bucket>.s3.amazonaws.com/" fields: key: "captures/<node-name>/${filename}" # ... other pre-signed POST fields (generated by the script)

ステップ 3: キャプチャの進行状況を監視する

キャプチャのステータスを確認します。

kubectl describe nodediagnostic <node-name>

ステータスには以下が表示されます。

  • Running はキャプチャ処理中に動作します。

  • キャプチャが完了し、すべてのファイルがアップロードされた時点で、理由 Success を伴う Completed

  • キャプチャ中にエラーが発生した場合は、理由 Failure とともに Completed と表示されます。

captureID (S3 パス識別に使用される) を含む完全なステータスを表示するには、以下を参照してください。

kubectl get nodediagnostic <node-name> -o jsonpath='{.status.captureStatuses}'

ステップ 4: S3 からキャプチャファイルをダウンロードする

ステータスが Success になったら、S3 からキャプチャファイルをダウンロードします。

aws s3 cp s3://<bucket-name>/captures/ ./captures/ --recursive

ファイルは、gzip 圧縮された pcap 形式です。tcpdump または Wireshark を使用して解凍および分析します。

gunzip captures/*.gz tcpdump -r captures/capture.pcap0000 -n

ステップ 5: クリーンアップ

NodeDiagnostic リソースは、自動的には削除されません。キャプチャファイルを取得したら、クリーンアップします。キャプチャ実行中にリソースを削除すると、キャプチャは直ちに停止します。

kubectl delete nodediagnostic <node-name>

設定オプションと動作

完全な packetCapture 仕様リファレンス、設定オプション、動作の詳細については、ノードモニタリングエージェントリポジトリの パケットキャプチャドキュメント を参照してください。