从 AKS 群集中的 Linux 节点捕获 TCP 转储

使用 Microsoft Azure Kubernetes 服务 (AKS) 群集时,可能会出现网络问题。 为了帮助调查这些问题,本文介绍如何从 AKS 群集中的 Linux 节点捕获 TCP 转储,然后将捕获下载到本地计算机。

先决条件

注意

可以通过 Helm 图表自动执行 TCP 捕获 ,该图表可以在后台作为 DaemonSet 运行。 有关详细信息,请参阅此 自定义 GitHub 工具来捕获 TCP 转储,或使用以下部分中的步骤。

步骤 1:查找要排除故障的节点

如何确定要从中拉取 TCP 转储的节点? 首先使用 Kubernetes 命令行客户端 kubectl 获取 AKS 群集中的节点列表。 按照说明连接到群集并使用 Azure 门户Azure CLI 运行kubectl get nodes --output wide命令。 此时会显示类似于以下输出的节点列表:

$ kubectl get nodes --output wide
NAME                                STATUS   ROLES   AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME
aks-agentpool-34796016-vmss000000   Ready    agent   45h   v1.20.9   10.240.1.81    <none>        Ubuntu 18.04.6 LTS               5.4.0-1062-azure   containerd://1.4.9+azure
aks-agentpool-34796016-vmss000002   Ready    agent   45h   v1.20.9   10.240.2.47    <none>        Ubuntu 18.04.6 LTS               5.4.0-1062-azure   containerd://1.4.9+azure

步骤 2:连接到 Linux 节点

下一步是建立与要从中捕获网络跟踪的 AKS 群集节点的连接。 有关详细信息,请参阅创建与 Linux 节点的交互式 shell 连接

步骤 3:确保已安装 tcpdump

建立与 AKS Linux 节点的连接后,通过运行 tcpdump --version来验证 tcpdump 工具是否已安装在节点上。 如果未安装 tcpdump,将显示以下错误文本:

# tcpdump --version
bash: tcpdump: command not found

然后,通过运行高级包工具的包处理实用工具 apt-get 在 Pod 上安装 tcpdump:

apt-get update && apt-get install tcpdump

如果安装了 tcpdump,将显示类似于以下文本的内容:

# tcpdump --version
tcpdump version 4.9.3
libpcap version 1.8.1
OpenSSL 1.1.1  11 Sep 2018

步骤 4:创建数据包捕获

若要捕获转储,请运行 tcpdump 命令 ,如下所示:

# tcpdump --snapshot-length=0 -vvv -w /capture.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
Got 6

注意

在不使用筛选参数的情况下运行 tcpdump 可能会显著增加数据包捕获 (PCAP) 文件的大小,尤其是在长时间运行时。 因此,建议添加筛选器,例如源、目标和端口。 例如:

  • tcpdump dst 192.168.1.100
  • tcpdump dst host.mydomain.com
  • tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet

跟踪运行时,多次复制问题。 此操作可确保在 TCP 转储中捕获问题。 请记下复制问题的时间戳。 若要在完成后停止数据包捕获,请按 Ctrl+C:

# tcpdump -s 0 -vvv -w /capture.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C526 packets captured
526 packets received by filter
0 packets dropped by kernel

步骤 5:在本地传输捕获

完成数据包捕获后,确定帮助程序 Pod,以便在本地复制转储。 打开第二个控制台,然后通过运行 kubectl get pods获取 Pod 列表,如下所示。

$ kubectl get pods
NAME                                                    READY   STATUS    RESTARTS   AGE
azure-vote-back-6c4dd64bdf-m4nk7                        1/1     Running   0          3m29s
azure-vote-front-85b4df594d-jhpzw                       1/1     Running   0          3m29s
node-debugger-aks-nodepool1-38878740-vmss000000-jfsq2   1/1     Running   0          60s

帮助程序 Pod 具有前缀 node-debugger-aks,如第三行所示。 替换 Pod 名称,然后运行以下 kubectl 命令。 这些命令检索 Linux 节点的数据包捕获。

kubectl cp node-debugger-aks-nodepool1-38878740-vmss000000-jfsq2:/capture.cap capture.cap

注意

chroot /host如果在输入调试 Pod 时使用了该命令,请在源文件之前/capture.cap添加/host该命令。

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区