Azure CLI를 사용하여 가상 노드를 사용하도록 AKS(Azure Kubernetes Service) 클러스터 만들기 및 구성
가상 노드는 ACI(Azure Container Instances)에서 실행되는 Pod와 AKS 클러스터 간의 네트워크 통신을 활성화합니다. 이 통신을 제공하려면 가상 네트워크 서브넷을 만들고 위임된 권한을 할당합니다. 가상 노드는 ‘고급’ 네트워킹(Azure CNI)을 사용하여 만든 AKS 클러스터에서만 작동합니다. 기본적으로 AKS 클러스터는 ‘기본’ 네트워킹(kubenet)을 사용하여 생성됩니다. 이 문서에서는 가상 네트워크 및 서브넷을 만든 다음, 고급 네트워킹을 사용하는 AKS 클러스터에 배포하는 방법을 보여 줍니다.
이 문서에서는 Azure CLI를 사용하여 가상 네트워크 리소스와 가상 노드에서 사용하도록 설정된 AKS 클러스터를 만들고 구성하는 방법을 보여 줍니다.
시작하기 전에
Important
AKS에서 가상 노드를 사용하기 전에 AKS 가상 노드의 제한 사항 및 ACI의 가상 네트워킹 제한 사항을 둘 다 검토합니다. 이 제한 사항은 AKS 클러스터 및 가상 노드의 위치, 네트워킹 구성 및 기타 구성 세부 정보에 영향을 줍니다.
구독에 등록된 ACI 서비스 공급자가 필요합니다.
az provider list
명령을 사용하여 ACI 공급자 등록 상태를 확인할 수 있습니다.az provider list --query "[?contains(namespace,'Microsoft.ContainerInstance')]" -o table
Microsoft.ContainerInstance 공급자는 다음 예제 출력에 나온 대로 Registered로 보고됩니다.
Namespace RegistrationState RegistrationPolicy --------------------------- ------------------- -------------------- Microsoft.ContainerInstance Registered RegistrationRequired
공급자가 NotRegistered로 표시되는 경우
az provider register
를 사용하여 공급자를 등록합니다.az provider register --namespace Microsoft.ContainerInstance
Azure CLI를 사용하는 경우 이 문서에는 Azure CLI 버전 2.0.49 이상이 필요합니다.
az --version
을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요. Azure Cloud Shell을 사용할 수도 있습니다.
Azure Cloud Shell 시작
Azure Cloud Shell은 이 문서의 단계를 실행하는 데 무료로 사용할 수 있는 대화형 셸입니다. 일반적인 Azure 도구가 사전 설치 및 구성되어 있습니다.
Cloud Shell을 열려면 코드 블록의 오른쪽 위 모서리에 있는 사용해 보세요를 선택합니다. 또한 https://shell.azure.com/bash 로 이동하여 별도의 브라우저 탭에서 Cloud Shell을 시작할 수 있습니다. 복사를 선택하여 코드 블록을 복사하여 Cloud Shell에 붙여넣고, Enter 키를 눌러 실행합니다.
리소스 그룹 만들기
Azure 리소스 그룹은 Azure 리소스가 배포되고 관리되는 논리 그룹입니다.
az group create
명령을 사용하여 리소스 그룹을 만듭니다.az group create --name myResourceGroup --location eastus
가상 네트워크 만들기
Important
가상 노드에는 사용자 지정 가상 네트워크 및 연결된 서브넷이 필요합니다. AKS 클러스터와 동일한 가상 네트워크에 연결할 수 없습니다.
az network vnet create
명령을 사용하여 가상 네트워크를 만듭니다. 다음 예제에서는 주소 접두사 10.0.0.0/8과 myAKSSubnet라는 서브넷을 사용하여 myVnet이라는 가상 네트워크를 만듭니다. 기본적으로 이 서브넷의 주소 접두사는 10.240.0.0/16입니다.az network vnet create \ --resource-group myResourceGroup \ --name myVnet \ --address-prefixes 10.0.0.0/8 \ --subnet-name myAKSSubnet \ --subnet-prefix 10.240.0.0/16
az network vnet subnet create
명령을 사용하여 가상 노드에 대한 추가 서브넷을 만듭니다. 다음 예제에서는 주소 접두사 10.241.0.0/16을 사용하여 myVirtualNodeSubnet이라는 서브넷을 만듭니다.az network vnet subnet create \ --resource-group myResourceGroup \ --vnet-name myVnet \ --name myVirtualNodeSubnet \ --address-prefixes 10.241.0.0/16
관리 ID로 AKS 클러스터 만들기
az network vnet subnet show
명령을 사용하여 서브넷 ID를 가져옵니다.az network vnet subnet show --resource-group myResourceGroup --vnet-name myVnet --name myAKSSubnet --query id -o tsv
az aks create
명령을 사용하여 AKS 클러스터를 만들고<subnetId>
를 이전 단계에서 가져온 ID로 바꿉니다. 다음 예제에서는 5개의 노드가 있는 myAKSCluster라는 클러스터를 만듭니다.az aks create \ --resource-group myResourceGroup \ --name myAKSCluster \ --node-count 5 \ --network-plugin azure \ --vnet-subnet-id <subnetId> \ --generate-ssh-keys
몇 분 후에 명령이 완료되고 클러스터에 대한 JSON 형식의 정보가 반환됩니다.
관리 ID에 대한 자세한 내용은 관리 ID 사용을 참조하세요.
가상 노드 추가 기능 사용
az aks enable-addons
명령을 사용하여 가상 노드를 사용하도록 설정합니다. 다음 예제에서는 이전 단계에서 만든 myVirtualNodeSubnet이라는 서브넷을 사용합니다.az aks enable-addons \ --resource-group myResourceGroup \ --name myAKSCluster \ --addons virtual-node \ --subnet-name myVirtualNodeSubnet
클러스터에 연결
az aks get-credentials
명령을 사용하여 Kubernetes 클러스터에 연결하도록kubectl
을 구성합니다. 이 단계에서는 자격 증명을 다운로드하고 Kubernetes CLI가 자격 증명을 사용하도록 구성합니다.az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
클러스터 노드 목록을 반환하는
kubectl get
명령을 사용하여 클러스터에 대한 연결을 확인합니다.kubectl get nodes
다음 예제 출력은 생성된 단일 VM 노드와 Linux용 가상 노드 virtual-node-aci-linux를 보여 줍니다.
NAME STATUS ROLES AGE VERSION virtual-node-aci-linux Ready agent 28m v1.11.2 aks-agentpool-14693408-0 Ready agent 32m v1.11.2
샘플 앱 배포
파일
virtual-node.yaml
을 만들고 다음 YAML에 복사합니다. YAML은 nodeSelector 및 toleration을 정의하여 노드에서 컨테이너를 예약합니다.apiVersion: apps/v1 kind: Deployment metadata: name: aci-helloworld spec: replicas: 1 selector: matchLabels: app: aci-helloworld template: metadata: labels: app: aci-helloworld spec: containers: - name: aci-helloworld image: mcr.microsoft.com/azuredocs/aci-helloworld ports: - containerPort: 80 nodeSelector: kubernetes.io/role: agent beta.kubernetes.io/os: linux type: virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Exists - key: azure.com/aci effect: NoSchedule
kubectl apply
명령을 사용하여 애플리케이션을 실행합니다.kubectl apply -f virtual-node.yaml
-o wide
인수와 함께kubectl get pods
명령을 사용하여 Pod 및 예약된 노드 목록을 가져옵니다.kubectl get pods -o wide
Pod는 다음 예제 출력에 표시된 대로 가상 노드 virtual-node-aci-linux에 예약됩니다.
NAME READY STATUS RESTARTS AGE IP NODE aci-helloworld-9b55975f-bnmfl 1/1 Running 0 4m 10.241.0.4 virtual-node-aci-linux
Pod에는 가상 노드에 사용하도록 위임된 Azure 가상 네트워크 서브넷의 내부 IP 주소가 할당됩니다.
참고 항목
Azure Container Registry에 저장된 이미지를 사용하는 경우 Kubernetes 비밀을 구성하고 사용합니다. 가상 노드의 현재 제한 사항은 통합 Microsoft Entra 서비스 주체 인증을 사용할 수 없다는 것입니다. 비밀을 사용하지 않으면 가상 노드에서 예약된 Pod가 시작되지 않고 오류 HTTP response status code 400 error code "InaccessibleImage"
가 보고됩니다.
가상 노드 Pod 테스트
웹 클라이언트를 사용하여 데모 애플리케이션으로 이동하여 가상 노드에서 실행되는 Pod를 테스트합니다. Pod에는 내부 IP 주소가 할당되므로 AKS 클러스터의 다른 Pod에서 이 연결을 신속하게 테스트할 수 있습니다.
테스트 Pod를 만들고 다음
kubectl run -it
명령을 사용하여 터미널 세션을 연결합니다.kubectl run -it --rm testvk --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
apt-get
을 사용하여 Pod에curl
을 설치합니다.apt-get update && apt-get install -y curl
http://10.241.0.4와 같은
curl
을 사용하여 Pod 주소에 액세스합니다. 이전kubectl get pods
명령에 표시된 고유한 내부 IP 주소를 제공합니다.curl -L http://10.241.0.4
다음과 같이 축소된 예제 출력처럼 데모 애플리케이션이 표시됩니다.
<html> <head> <title>Welcome to Azure Container Instances!</title> </head> [...]
exit
명령을 사용하여 테스트 Pod에 대한 터미널 세션을 종료합니다. 세션이 종료되면 Pod가 삭제됩니다.
가상 노드 제거
kubectl delete
명령을 사용하여 가상 노드에서 실행되는aci-helloworld
Pod를 삭제합니다.kubectl delete -f virtual-node.yaml
az aks disable-addons
명령을 사용하여 가상 노드를 사용하지 않도록 설정합니다.az aks disable-addons --resource-group myResourceGroup --name myAKSCluster --addons virtual-node
다음 명령을 사용하여 가상 네트워크 리소스 및 리소스 그룹을 제거합니다.
# Change the name of your resource group, cluster and network resources as needed RES_GROUP=myResourceGroup AKS_CLUSTER=myAKScluster AKS_VNET=myVnet AKS_SUBNET=myVirtualNodeSubnet # Get AKS node resource group NODE_RES_GROUP=$(az aks show --resource-group $RES_GROUP --name $AKS_CLUSTER --query nodeResourceGroup --output tsv) # Get network profile ID NETWORK_PROFILE_ID=$(az network profile list --resource-group $NODE_RES_GROUP --query "[0].id" --output tsv) # Delete the network profile az network profile delete --id $NETWORK_PROFILE_ID -y # Grab the service association link ID SAL_ID=$(az network vnet subnet show --resource-group $RES_GROUP --vnet-name $AKS_VNET --name $AKS_SUBNET --query id --output tsv)/providers/Microsoft.ContainerInstance/serviceAssociationLinks/default # Delete the service association link for the subnet az resource delete --ids $SAL_ID --api-version 2021-10-01 # Delete the subnet delegation to Azure Container Instances az network vnet subnet update --resource-group $RES_GROUP --vnet-name $AKS_VNET --name $AKS_SUBNET --remove delegations
다음 단계
이 문서에서는 가상 노드에서 Pod를 예약하고 프라이빗 내부 IP 주소를 할당했습니다. 그 대신 서비스 배포를 만들고 부하 분산 장치 또는 수신 컨트롤러를 통해 Pod로 트래픽을 라우팅할 수도 있습니다. 자세한 내용은 AKS에서 기본 수신 컨트롤러 만들기를 참조하세요.
가상 노드는 종종 AKS에서 크기 조정 솔루션의 구성 요소 중 하나입니다. 크기 조정 솔루션에 대한 자세한 내용은 다음 문서를 참조하세요.
Azure Kubernetes Service