使用 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.100tcpdump dst host.mydomain.comtcpdump 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 反馈社区。