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

使用 Microsoft Azure Kubernetes 服务 (AKS) 群集时,可能会出现网络问题。 为了帮助调查这些问题,本文介绍如何从 AKS 群集中的 Windows 节点捕获 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
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 节点。

  1. 使用以下内容创建 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
    
  2. kubectl apply -f hostprocess.yaml运行以下命令,在指定的 Windows 节点中部署 Windows HostProcess 容器。

  3. 运行 kubectl exec -it [HPC-POD-NAME] -- powershell 命令。

  4. 在 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,以便在本地复制转储。

  1. 在本地计算机上,打开第二个控制台,然后运行以下命令 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,如第三行所示。

  2. 通过运行以下命令在本地复制 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 反馈社区