유지 관리 또는 문제 해결을 위해 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
명령을 사용하여 노드에서 권한 있는 컨테이너를 실행합니다.
노드를 나열하려면
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
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 메서드를 사용해 연결합니다.
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:/#
새 터미널 창을 열고
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-bkmmx는
kubectl debug
에서 시작된 Pod의 이름입니다.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
명령을 중지할 때까지 연결은 열린 상태로 유지됩니다.새 터미널을 열고
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 주소입니다.
내부 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 노드에 액세스
다음 콘텐츠로
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 HPC(호스트 프로세스 컨테이너)를 배포합니다.kubectl exec -it [HPC-POD-NAME] -- powershell
을 사용합니다.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 IP
및 Node Name
등의 속성에 액세스하여 AKS 노드에 연결할 수 있습니다.
Important
AKS 미리 보기 기능은 셀프 서비스에서 사용할 수 있습니다(옵트인 방식). 미리 보기는 "있는 그대로" 및 "사용 가능한 상태로" 제공되며 서비스 수준 계약 및 제한적 보증에서 제외됩니다. AKS 미리 보기의 일부는 고객 지원팀에서 최선을 다해 지원합니다. 따라서 이러한 기능은 프로덕션 용도로 사용할 수 없습니다. 자세한 내용은 다음 지원 문서를 참조하세요.
IP 주소를 사용하여 노드에 대한 대화형 셸 연결 만들기
편의를 위해 AKS 노드는 개인 IP 주소를 통해 클러스터의 가상 네트워크에 노출됩니다. 그러나 노드에 SSH로 연결하려면 클러스터의 가상 네트워크에 있어야 수 있습니다. 아직 구성된 환경이 없는 경우 Azure Bastion Azure Bastion을 사용하여 클러스터 노드에 SSH로 연결할 수 있는 프록시를 설정할 수 있습니다. Azure Bastion이 클러스터와 동일한 가상 네트워크에 배포되어 있는지 확인합니다.
--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
이전 단계에서 얻은 개인 IP 주소를 사용하여 노드에 SSH로 연결합니다. 이 단계는 Linux 컴퓨터에 한해 적용됩니다. Windows 컴퓨터는 Azure Bastion을 사용한 연결을 참조하세요.
ssh -i /path/to/private_key.pem azureuser@10.224.0.33
다음 단계
추가적인 문제 해결 데이터가 필요한 경우 kubelet 로그를 확인하거나 Kubernetes 컨트롤 플레인 로그를 확인하면 됩니다.
SSH 키 관리에 대한 자세한 내용을 알아보려면 SSH 구성 관리를 참조하세요.
Azure Kubernetes Service