

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

若要為本使用者指南貢獻內容，請點選每個頁面右側面板中的**在 GitHub 上編輯此頁面**連結。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 kubectl 和 S3 擷取受管節點上的網路流量
<a name="auto-get-tcpdump"></a>

了解如何在具有節點監控代理程式的 Amazon EKS 受管節點上擷取網路流量。代理程式會在節點上執行 tcpdump、壓縮擷取檔案，並將它們上傳到您的 S3 儲存貯體。

## 先決條件
<a name="_prerequisites"></a>

請確認您已具備以項目：
+ 具有節點監控代理程式的現有 Amazon EKS Auto Mode 叢集。如需詳細資訊，請參閱[偵測節點運作狀態問題並啟用自動節點修復](node-health.md)。
+ 已安裝並設定為可與您叢集通訊的 `kubectl` 命令列工具。
+ 安裝並登入 AWS 的 CLI 具有建立 S3 儲存貯體和物件的足夠許可。
+ 已安裝最新版本的 Python 3。
+ 已安裝適用於 Python 3、Boto 3 的 AWS SDK。
+ 已安裝 PyYAML 程式庫 (`pip install pyyaml`)。

## 步驟 1：建立 S3 儲存貯體目的地 (選用)
<a name="_step_1_create_s3_bucket_destination_optional"></a>

如果您還沒有儲存擷取檔案的 S3 儲存貯體，請建立一個。將 {{bucket-name}} 和 {{region}} 取代為您的值。

```
aws s3api create-bucket --bucket {{<bucket-name>}} \
    --region {{<region>}} \
    --create-bucket-configuration LocationConstraint={{<region>}}
```

**注意**  
除了 以外的所有區域都需要 `--create-bucket-configuration` 參數`us-east-1`。

## 步驟 2：開始封包擷取
<a name="_step_2_start_packet_capture"></a>

使用[節點監控代理程式儲存庫](https://github.com/aws/eks-node-monitoring-agent) (`tools/start-capture.py`) 中的`start-capture.py`指令碼來產生預先簽章的 S3 登入資料、建立`NodeDiagnostic`資源，並將其套用至您的叢集。

1. 識別您要從中擷取流量的節點。

   ```
   kubectl get nodes
   ```

1. 將 [start-capture.py](https://github.com/aws/eks-node-monitoring-agent/blob/main/tools/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
   ```

   指令碼需要使用已安裝 `boto3`和 的 Python 3`pyyaml`，並為您的叢集`kubectl`進行設定。

   指令碼會產生類似下列`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：監控擷取進度
<a name="_step_3_monitor_capture_progress"></a>

檢查擷取的狀態。

```
kubectl describe nodediagnostic {{<node-name>}}
```

狀態會顯示：
+  `Running` 擷取進行時。
+  `Completed` 以及擷取完成和所有檔案上傳`Success`的原因。
+  `Completed` `Failure` 如果擷取發生錯誤，則為 原因。

若要查看完整狀態，包括 `captureID`（用於 S3 路徑識別）：

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

## 步驟 4：從 S3 下載擷取檔案
<a name="_step_4_download_capture_files_from_s3"></a>

狀態顯示 後`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：清除
<a name="_step_5_clean_up"></a>

 `NodeDiagnostic` 資源不會自動刪除。在您取得擷取檔案後清除 。在擷取執行時刪除資源會立即停止擷取。

```
kubectl delete nodediagnostic {{<node-name>}}
```

## 組態選項和行為
<a name="_configuration_options_and_behavior"></a>

如需完整的`packetCapture`規格參考、組態選項和行為詳細資訊，請參閱節點監控代理程式儲存庫中的[封包擷取文件](https://github.com/aws/eks-node-monitoring-agent/blob/main/docs/packet-capture.adoc)。