帮助改进此页面
要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 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-name 和 region 替换为您的值。
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 资源并将其应用于集群。
-
确定要从中捕获流量的节点。
kubectl get nodes -
将 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:监控捕获进度
检查捕获的状态。
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 规范参考、配置选项和行为详细信息,请参阅节点监控代理存储库中的数据包捕获文档