

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 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` 命令行工具，以便与您的集群通信。
+ 已安装 Amazon CLI 并登录，并且拥有创建 S3 存储桶和对象的足够权限。
+ 已安装 Python 3 的最新版本。
+ 已安装适用于 Python 3、Boto 3 的 Amazon 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>
```

**注意**  
除 `us-east-1` 外的所有区域都需要 `--create-bucket-configuration` 参数。

## 步骤 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
   ```

   该脚本需要安装 Python 3 以及 `boto3` 和 `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)。