다음을 통해 공유


유지 관리 또는 문제 해결을 위해 AKS(Azure Kubernetes Service) 클러스터 노드에 연결

AKS(Azure Kubernetes Service) 클러스터의 전체 수명 주기 기간에 결과적으로 AKS 노드에 직접 액세스해야 합니다. 유지 관리, 로그 수집 또는 문제 해결 작업을 위해 이 액세스를 사용할 수 있습니다.

인증을 통해 노드에 액세스하며, 메서드는 노드 OS와 연결 방법에 따라 달라집니다. 이 문서에서 설명하는 두 가지 옵션을 통해 AKS Linux 및 Windows 노드를 안전하게 인증합니다. 하나는 Kubernetes API 액세스 권한이 있어야 하고, 다른 하나는 개인 IP 정보를 직접 제공하는 AKS ARM API를 통해 액세스합니다. 보안상의 이유로 AKS 노드는 인터넷에 노출되지 않습니다. 대신 AKS 노드에 직접 연결하려면 kubectl debug 또는 호스트의 개인 IP 주소 중 하나를 사용해야 합니다.

Kubernetes API를 사용하여 노드에 액세스

이 메서드는 kubectl debug 명령을 사용해야 합니다.

시작하기 전에

이 문서에서는 AKS 노드에 연결하고 사용 중인 AKS 클러스터에서 SSH 키를 업데이트하는 방법을 보여 줍니다. 단계를 수행하려면 버전 2.0.64 이상을 지원하는 Azure CLI를 사용해야 합니다. 버전을 확인하려면 az --version을 실행합니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.

SSH 키가 없는 경우 다음 단계를 완료합니다. 노드 OS 이미지에 따라 macOS와 Linux 또는 Windows용 SSH 키 이미지를 만듭니다. 키 쌍을 OpenSSH 형식으로 저장하고 지원되지 않는 형식(예: .ppk)을 사용하지 않도록 합니다. 다음으로, SSH 구성 관리를 참조하여 클러스터에 키를 추가합니다.

Linux 및 macOS

Linux 및 macOS 사용자는 kubectl debug 또는 개인 IP 주소를 사용하여 노드에 액세스할 수 있습니다. Windows 사용자는 프록시를 통해 SSH 문제를 해결하려면 Windows Server 프록시 섹션으로 건너뛰어야 합니다.

kubectl 디버그를 사용하여 연결

대화형 셸 연결을 만들려면 kubectl debug 명령을 사용하여 노드에서 권한 있는 컨테이너를 실행합니다.

  1. 노드를 나열하려면 kubectl get nodes 명령을 사용합니다.

    kubectl get nodes -o wide
    

    샘플 출력:

    NAME                                STATUS   ROLES   AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE
    aks-nodepool1-37663765-vmss000000   Ready    agent   166m   v1.25.6   10.224.0.33   <none>        Ubuntu 22.04.2 LTS
    aks-nodepool1-37663765-vmss000001   Ready    agent   166m   v1.25.6   10.224.0.4    <none>        Ubuntu 22.04.2 LTS
    aksnpwin000000                      Ready    agent   160m   v1.25.6   10.224.0.62   <none>        Windows Server 2022 Datacenter
    
  2. kubectl debug 명령을 사용하여 노드에서 권한 있는 컨테이너를 시작하고 이에 연결합니다.

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    샘플 출력:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    

    이제 권한 있는 컨테이너를 통해 디버깅 Pod로 노드에 액세스할 수 있습니다.

    참고 항목

    권한 있는 컨테이너에서 chroot /host를 실행하여 노드 세션과 상호 작용할 수 있습니다.

kubectl 디버그 모드 종료

노드 작업이 완료되면 대화형 셸 세션을 종료하는 exit 명령을 입력합니다. 대화형 컨테이너 세션이 닫히면 kubectl delete pod에서 사용되는 디버깅 Pod를 삭제합니다.

kubectl delete pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx

SSH용 Windows Server 프록시 연결

Windows Server 노드에서 SSH와 연결하는 방법으로 다음 단계를 따릅니다.

프록시 서버 만들기

지금은 kubectl debug로 Windows Server 노드에 직접 연결할 수 없습니다. 대신 먼저 kubectl로 클러스터의 다튼 노드에 연결한 다음 SSH를 사용하여 해당 노드에서 Windows Server 노드에 연결해야 합니다.

클러스터의 다른 노드에 연결하려면 kubectl debug 명령을 사용합니다. 자세한 내용을 알아보려면 kubectl 섹션에서 위의 단계를 따르세요. AKS 클러스터를 만들 때 제공된 SSH 키와 Windows Server 노드의 내부 IP 주소를 사용하여 다른 노드에서 Windows Server 노드로 이어지는 SSH 연결을 만듭니다.

Important

다른 노드에서 Windows Server 노드로 이어지는 SSH 연결을 만들기 위한 다음 단계는 Azure CLI와 --generate-ssh-keys 매개 변수를 함께 사용하여 AKS 클러스터를 만든 경우에만 사용할 수 있습니다. 대신 자체 SSH 키를 사용하려는 경우 az aks update를 사용하여 기존 AKS 클러스터에서 SSH 키를 관리할 수 있습니다. 자세한 내용은 SSH 노드 액세스 관리를 참조하세요.

참고 항목

Linux 프록시 노드가 다운되거나 응답하지 않는 경우 대신 Azure Bastion 메서드를 사용해 연결합니다.

  1. kubectl debug 명령을 사용하여 프록시(Linux) 노드에서 권한 있는 컨테이너를 시작하고 이에 연결합니다.

    kubectl debug node/aks-nodepool1-37663765-vmss000000 -it --image=mcr.microsoft.com/cbl-mariner/busybox:2.0
    

    샘플 출력:

    Creating debugging pod node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx with container debugger on node aks-nodepool1-37663765-vmss000000.
    If you don't see a command prompt, try pressing enter.
    root@aks-nodepool1-37663765-vmss000000:/#
    
  2. 새 터미널 창을 열고 kubectl get pods 명령을 사용하여 kubectl debug에서 시작한 Pod의 이름을 가져옵니다.

    kubectl get pods
    

    샘플 출력:

    NAME                                                    READY   STATUS    RESTARTS   AGE
    node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx   1/1     Running   0          21s
    

    샘플 출력에서 node-debugger-aks-nodepool1-37663765-vmss000000-bkmmxkubectl debug에서 시작된 Pod의 이름입니다.

  3. kubectl port-forward 명령을 사용하여 배포된 Pod에 대한 연결을 엽니다.

    kubectl port-forward node-debugger-aks-nodepool1-37663765-vmss000000-bkmmx 2022:22
    

    샘플 출력:

    Forwarding from 127.0.0.1:2022 -> 22
    Forwarding from [::1]:2022 -> 22
    

    위의 예제에서는 개발 컴퓨터의 포트 2022에서 배포된 Pod의 포트 22로 네트워크 트래픽을 전달하기 시작합니다. kubectl port-forward를 사용하여 연결을 열고 네트워크 트래픽을 전달하면 kubectl port-forward 명령을 중지할 때까지 연결은 열린 상태로 유지됩니다.

  4. 새 터미널을 열고 kubectl get nodes 명령을 실행하여 Windows Server 노드의 내부 IP 주소를 표시합니다.

    kubectl get no -o custom-columns=NAME:metadata.name,'INTERNAL_IP:status.addresses[?(@.type == \"InternalIP\")].address'
    

    샘플 출력:

    NAME                                INTERNAL_IP
    aks-nodepool1-19409214-vmss000003   10.224.0.8
    

    앞의 예제에서 10.224.0.62는 Windows Server 노드의 내부 IP 주소입니다.

  5. 내부 IP 주소를 사용하여 Windows Server 노드에 대한 SSH 연결을 만들고 개발 컴퓨터의 포트 22 ~ 포트 2022에 연결합니다. AKS 노드의 기본 사용자 이름은 azureuser입니다. 프롬프트를 수락해 연결을 계속합니다. 그러면 Windows Server 노드의 bash 프롬프트가 제공됩니다.

    ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' azureuser@10.224.0.62
    

    샘플 출력:

    The authenticity of host '10.224.0.62 (10.224.0.62)' can't be established.
    ECDSA key fingerprint is SHA256:1234567890abcdefghijklmnopqrstuvwxyzABCDEFG.
    Are you sure you want to continue connecting (yes/no)? yes
    

    참고 항목

    암호 인증을 사용하려면 -o PreferredAuthentications=password 매개 변수를 포함합니다. 예시:

     ssh -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' -o PreferredAuthentications=password azureuser@10.224.0.62
    

호스트 프로세스 컨테이너를 사용하여 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 HPC(호스트 프로세스 컨테이너)를 배포합니다.

  3. kubectl exec -it [HPC-POD-NAME] -- powershell을 사용합니다.

  4. HPC 컨테이너 내에서 PowerShell 명령을 실행하여 Windows 노드에 액세스할 수 있습니다.

참고 항목

Windows 노드의 파일에 액세스하려면 HPC 컨테이너 내부의 루트 폴더를 C:\로 전환해야 합니다.

Windows용 Azure Bastion을 사용하는 SSH

Linux 프록시 노드에 연결할 수 없는 경우 Azure Bastion을 프록시로 사용하는 것이 또 다른 방법입니다. 이 메서드를 사용하려면 클러스터가 있는 가상 네트워크에서 Azure Bastion 호스트를 설정해야 합니다. 자세한 내용은 Azure Bastion을 사용한 연결을 참조하세요.

AKS API에서 개인 IP를 사용하는 SSH(미리 보기)

Kubernetes API에 액세스할 수 없는 경우 AKS 에이전트 풀 API(미리 보기)(미리 보기 버전 07-02-2023 이상에서 사용 가능)을 통해 Node IPNode Name 등의 속성에 액세스하여 AKS 노드에 연결할 수 있습니다.

Important

AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.

IP 주소를 사용하여 노드에 대한 대화형 셸 연결 만들기

편의를 위해 AKS 노드는 개인 IP 주소를 통해 클러스터의 가상 네트워크에 노출됩니다. 그러나 노드에 SSH로 연결하려면 클러스터의 가상 네트워크에 있어야 수 있습니다. 아직 구성된 환경이 없는 경우 Azure Bastion Azure Bastion을 사용하여 클러스터 노드에 SSH로 연결할 수 있는 프록시를 설정할 수 있습니다. Azure Bastion이 클러스터와 동일한 가상 네트워크에 배포되어 있는지 확인합니다.

  1. --nodepool-name 플래그가 있는 특정 노드 풀의 모든 VM을 대상으로 az aks machine list 명령을 사용하여 개인 IP를 획득합니다.

    az aks machine list --resource-group myResourceGroup  --cluster-name myAKSCluster --nodepool-name nodepool1 -o table
    

    다음 예제 출력은 노드 풀에 있는 모든 노드의 내부 IP 주소를 보여 줍니다.

    Name                               Ip           Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    aks-nodepool1-33555069-vmss000001  10.224.0.6   IPv4
    aks-nodepool1-33555069-vmss000002  10.224.0.4   IPv4
    

    노드 풀 내의 특정 노드를 대상으로 하려면 --machine-name 플래그를 사용합니다.

    az aks machine show --cluster-name myAKScluster --nodepool-name nodepool1 -g myResourceGroup --machine-name aks-nodepool1-33555069-vmss000000 -o table
    

    다음 예제 출력은 지정된 모든 노드의 내부 IP 주소를 보여 줍니다.

    Name                               Ip         Family
    ---------------------------------  -----------  -----------
    aks-nodepool1-33555069-vmss000000  10.224.0.5   IPv4
    
  2. 이전 단계에서 얻은 개인 IP 주소를 사용하여 노드에 SSH로 연결합니다. 이 단계는 Linux 컴퓨터에 한해 적용됩니다. Windows 컴퓨터는 Azure Bastion을 사용한 연결을 참조하세요.

    ssh -i /path/to/private_key.pem azureuser@10.224.0.33
    

다음 단계

추가적인 문제 해결 데이터가 필요한 경우 kubelet 로그를 확인하거나 Kubernetes 컨트롤 플레인 로그를 확인하면 됩니다.

SSH 키 관리에 대한 자세한 내용을 알아보려면 SSH 구성 관리를 참조하세요.