다음을 통해 공유


AKS 클러스터의 Windows 노드에서 TCP 덤프 캡처

AKS(Microsoft Azure Kubernetes Service) 클러스터를 사용하는 경우 네트워킹 문제가 발생할 수 있습니다. 이러한 문제를 조사하기 위해 이 문서에서는 AKS 클러스터의 Windows 노드에서 TCP 덤프를 캡처한 다음 로컬 컴퓨터에 캡처를 다운로드하는 방법을 설명합니다.

필수 조건

  • Azure CLI 버전 2.0.59 이상. 웹 브라우저에서 Azure Cloud Shell을 열어 Azure CLI 명령을 입력할 수 있습니다. 또는 로컬 컴퓨터에 Azure CLI 를 설치하거나 업그레이드합니다. 컴퓨터에 설치된 버전을 찾으려면 다음을 실행 az --version합니다.
  • AKS 클러스터. AKS 클러스터 가 없는 경우 Azure CLI 를 사용하거나 Azure Portal을 통해 만듭니다.

1단계: 문제를 해결할 노드 찾기

TCP 덤프를 끌어올 노드를 어떻게 결정합니까? 먼저 Kubernetes 명령줄 클라이언트 kubectl을 사용하여 AKS 클러스터의 노드 목록을 가져옵니다. 지침에 따라 클러스터에 연결하고 Azure Portal 또는 Azure CLIkubectl 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(Secure Shell) 키를 사용하거나 RDP(원격 데스크톱 프로토콜) 연결에서 Windows 관리자 암호를 사용하여 인증합니다. 현재 AKS Windows 노드에 직접 연결할 수 없으므로 두 방법 모두 중간 연결을 만들어야 합니다. SSH 또는 RDP를 통해 노드에 연결하든 관계없이 AKS 노드의 사용자 이름을 지정해야 합니다. 기본적으로 이 사용자 이름은 azureuser입니다. SSH 또는 RDP 연결을 사용하는 것 외에도 HostProcess 컨테이너에서 Windows 노드에 연결할 수 있습니다.

  1. 다음 콘텐츠를 사용하여 hostprocess.yaml을 만듭니다. AKS Windows 노드 이름으로 바꿉니다 AKSWINDOWSNODENAME .

    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 노드의 파일에 액세스하려면 루트 폴더를 HostProcess 컨테이너 내부로 C:\ 전환합니다.

3단계: 패킷 캡처 만들기

SSH 또는 RDP를 통해 또는 HostProcess 컨테이너에서 Windows 노드에 연결된 경우 Windows 명령 프롬프트의 형태가 나타납니다.

azureuser@akswin000000 C:\Users\azureuser>

이제 명령 프롬프트를 열고 추적을 캡처하기 위해 아래의 네트워크 셸(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 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.