从 AKS 群集中的 Linux 节点捕获 TCP 转储
使用 Microsoft Azure Kubernetes 服务 (AKS) 群集时,可能会出现网络问题。 为了帮助调查这些问题,本文介绍如何从 AKS 群集中的 Linux 节点捕获 TCP 转储,然后将捕获下载到本地计算机。
先决条件
- Kubernetes kubectl 工具。 若要使用 Azure CLI 安装 kubectl,请运行 az aks install-cli 命令。
- AKS 群集。 如果没有 AKS 群集,请使用 Azure CLI 或通过Azure 门户创建一个群集。
- Linux 节点上安装的 tcpdump 命令行工具。
注意
可以通过 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 反馈社区。