View a markdown version of this page

使用 kubectl 和 S3 捕获托管节点上的网络流量 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

使用 kubectl 和 S3 捕获托管节点上的网络流量

了解如何在具有节点监控代理的 Amazon EKS 托管节点上捕获网络流量。代理在节点上运行 tcpdump,压缩捕获文件,并将它们上传到 S3 存储桶。

先决条件

确保您已满足以下条件:

  • 一个具有节点监控代理的现有 Amazon EKS Auto Mode 集群。有关更多信息,请参阅 检测节点运行状况问题并启用自动节点修复

  • 已安装并配置好 kubectl 命令行工具,以便与您的集群通信。

  • 已安装 Amazon CLI 并登录,并且拥有创建 S3 存储桶和对象的足够权限。

  • 已安装 Python 3 的最新版本。

  • 已安装适用于 Python 3、Boto 3 的 Amazon SDK。

  • 已安装 PyYAML 库(pip install pyyaml)。

第 1 步:创建 S3 存储桶目标(可选)

如果还没有用来存储捕获文件的 S3 存储桶,请创建一个。将 bucket-nameregion 替换为您的值。

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

us-east-1 外的所有区域都需要 --create-bucket-configuration 参数。

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

    该脚本需要安装 Python 3 以及 boto3pyyaml,并为您的集群配置 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:监控捕获进度

检查捕获的状态。

kubectl describe nodediagnostic <node-name>

状态将显示:

  • 捕获过程中为 Running

  • 捕获完成并上传所有文件时为 Completed,原因 Success

  • 如果捕获遇到错误则为 Completed,原因 Failure

要查看完整状态(包括 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 规范参考、配置选项和行为详细信息,请参阅节点监控代理存储库中的数据包捕获文档