从 AKS 群集中的 Windows 节点捕获 TCP 转储
使用 Microsoft Azure Kubernetes 服务 (AKS) 群集时,可能会出现网络问题。 为了帮助调查这些问题,本文介绍如何从 AKS 群集中的 Windows 节点捕获 TCP 转储,然后将捕获下载到本地计算机。
先决条件
- Azure CLI 版本 2.0.59 或更高版本。 可以在 Web 浏览器中打开 Azure Cloud Shell 以输入 Azure CLI 命令。 或者 在本地计算机上安装或升级 Azure CLI 。 若要查找计算机上安装的版本,请运行
az --version
。 - AKS 群集。 如果没有 AKS 群集,请使用 Azure CLI 或通过Azure 门户创建一个群集。
步骤 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
akswin000000 Ready agent 3m8s v1.20.9 10.240.0.4 <none> Windows Server 2019 Datacenter 10.0.17763.2237 docker://20.10.6
akswin000001 Ready agent 3m50s v1.20.9 10.240.0.115 <none> Windows Server 2019 Datacenter 10.0.17763.2237 docker://20.10.6
akswin000002 Ready agent 3m32s v1.20.9 10.240.0.226 <none> Windows Server 2019 Datacenter 10.0.17763.2237 docker://20.10.6
步骤 2:连接到 Windows 节点
下一步是建立与 AKS 群集节点的连接。 可以使用安全外壳(SSH)密钥或使用远程桌面协议(RDP)连接中的 Windows 管理员密码进行身份验证。 这两种方法都需要创建中间连接,因为当前无法直接连接到 AKS Windows 节点。 无论是通过 SSH 还是 RDP 连接到节点,都需要为 AKS 节点指定用户名。 默认情况下,此用户名为 azureuser。 除了使用 SSH 或 RDP 连接,还可以从 HostProcess 容器连接到 Windows 节点。
使用以下内容创建 hostprocess.yaml 。 替换为
AKSWINDOWSNODENAME
AKS Windows 节点名称。apiVersion: v1 kind: Pod metadata: labels: pod: hpc name: hpc spec: securityContext: windowsOptions: hostProcess: true runAsUserName: "NT AUTHORITY\\SYSTEM" hostNetwork: true containers: - name: hpc image: mcr.microsoft.com/windows/servercore:ltsc2022 # Use servercore:1809 for WS2019 command: - powershell.exe - -Command - "Start-Sleep 2147483" imagePullPolicy: IfNotPresent nodeSelector: kubernetes.io/os: windows kubernetes.io/hostname: AKSWINDOWSNODENAME tolerations: - effect: NoSchedule key: node.kubernetes.io/unschedulable operator: Exists - effect: NoSchedule key: node.kubernetes.io/network-unavailable operator: Exists - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists
kubectl apply -f hostprocess.yaml
运行以下命令,在指定的 Windows 节点中部署 Windows HostProcess 容器。运行
kubectl exec -it [HPC-POD-NAME] -- powershell
命令。在 HostProcess 容器中运行任何 PowerShell 命令以访问 Windows 节点。
注意
若要访问 Windows 节点中的文件,请将根文件夹切换到
C:\
HostProcess 容器内部。
步骤 3:创建数据包捕获
通过 SSH 或 RDP 或 HostProcess 容器连接到 Windows 节点时,将显示一种 Windows 命令提示符形式:
azureuser@akswin000000 C:\Users\azureuser>
现在打开命令提示符,然后输入 下面的 Network Shell (netsh)命令来捕获跟踪(netsh 跟踪开始)。 此命令启动数据包捕获过程。
netsh trace start capture=yes tracefile=C:\temp\AKS_node_name.etl
输出显示类似于以下文本:
Trace configuration:
-------------------------------------------------------------------
Status: Running
Trace File: AKS_node_name.etl
Append: Off
Circular: On
Max Size: 250 MB
Report: Off
跟踪运行时,多次复制问题。 此操作可确保在 TCP 转储中捕获问题。 请记下复制问题的时间戳。 若要在完成后停止数据包捕获,请输入 netsh trace stop
:
azureuser@akswin000000 C:\Users\azureuser>netsh trace stop
Merging traces ... done
Generating data collection ... done
The trace file and additional troubleshooting information have been compiled as "C:\temp\AKS_node_name.cab".
File location = C:\temp\AKS_node_name.etl
Tracing session was successfully stopped.
步骤 4:在本地传输捕获
完成数据包捕获后,标识 HostProcess Pod,以便在本地复制转储。
在本地计算机上,打开第二个控制台,然后运行以下命令
kubectl get pods
获取 Pod 列表:kubectl get pods NAME READY STATUS RESTARTS AGE azure-vote-back-6c4dd64bdf-m4nk7 1/1 Running 2 3d21h azure-vote-front-85b4df594d-jhpzw 1/1 Running 2 3d21h hpc 1/1 Running 0 3m58s
HostProcess Pod 的默认名称为 hpc,如第三行所示。
通过运行以下命令在本地复制 TCP 转储文件。 将 Pod 名称替换为
hpc
.kubectl cp -n default hpc:/temp/AKS_node_name.etl ./AKS_node_name.etl tar: Removing leading '/' from member names kubectl cp -n default hpc:/temp/AKS_node_name.etl ./AKS_node_name.cab tar: Removing leading '/' from member names
.etl 和 .cab 文件现在将存在于本地目录中。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。