다음을 통해 공유


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 클러스터와 동일한 가상 네트워크에 연결할 수 없습니다.

  1. az network vnet create 명령을 사용하여 가상 네트워크를 만듭니다. 다음 예제에서는 주소 접두사 10.0.0.0/8myAKSSubnet라는 서브넷을 사용하여 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
    
  2. 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 클러스터 만들기

  1. az network vnet subnet show 명령을 사용하여 서브넷 ID를 가져옵니다.

    az network vnet subnet show --resource-group myResourceGroup --vnet-name myVnet --name myAKSSubnet --query id -o tsv
    
  2. 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 사용을 참조하세요.

가상 노드 추가 기능 사용

참고 항목

고급 Netowrking에 Azure CNI를 사용하는 기존 Azure Kubernetes Service 클러스터를 만든 경우 CLI를 사용하여 가상 노드를 추가 기능으로 사용하도록 설정할 수 있어야 합니다.

  • az aks enable-addons 명령을 사용하여 가상 노드를 사용하도록 설정합니다. 다음 예제에서는 이전 단계에서 만든 myVirtualNodeSubnet이라는 서브넷을 사용합니다.

    az aks enable-addons \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --addons virtual-node \
        --subnet-name myVirtualNodeSubnet
    

클러스터에 연결

  1. az aks get-credentials 명령을 사용하여 Kubernetes 클러스터에 연결하도록 kubectl을 구성합니다. 이 단계에서는 자격 증명을 다운로드하고 Kubernetes CLI가 자격 증명을 사용하도록 구성합니다.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  2. 클러스터 노드 목록을 반환하는 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
    

샘플 앱 배포

  1. 파일 virtual-node.yaml을 만들고 다음 YAML에 복사합니다. YAML은 nodeSelectortoleration을 정의하여 노드에서 컨테이너를 예약합니다.

    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
    
  2. kubectl apply 명령을 사용하여 애플리케이션을 실행합니다.

    kubectl apply -f virtual-node.yaml
    
  3. -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 테스트

  1. 웹 클라이언트를 사용하여 데모 애플리케이션으로 이동하여 가상 노드에서 실행되는 Pod를 테스트합니다. Pod에는 내부 IP 주소가 할당되므로 AKS 클러스터의 다른 Pod에서 이 연결을 신속하게 테스트할 수 있습니다.

  2. 테스트 Pod를 만들고 다음 kubectl run -it 명령을 사용하여 터미널 세션을 연결합니다.

    kubectl run -it --rm testvk --image=mcr.microsoft.com/dotnet/runtime-deps:6.0
    
  3. apt-get을 사용하여 Pod에 curl을 설치합니다.

    apt-get update && apt-get install -y curl
    
  4. 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>
    [...]
    
  5. exit 명령을 사용하여 테스트 Pod에 대한 터미널 세션을 종료합니다. 세션이 종료되면 Pod가 삭제됩니다.

가상 노드 제거

  1. kubectl delete 명령을 사용하여 가상 노드에서 실행되는 aci-helloworld Pod를 삭제합니다.

    kubectl delete -f virtual-node.yaml
    
  2. az aks disable-addons 명령을 사용하여 가상 노드를 사용하지 않도록 설정합니다.

    az aks disable-addons --resource-group myResourceGroup --name myAKSCluster --addons virtual-node
    
  3. 다음 명령을 사용하여 가상 네트워크 리소스 및 리소스 그룹을 제거합니다.

    # 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에서 크기 조정 솔루션의 구성 요소 중 하나입니다. 크기 조정 솔루션에 대한 자세한 내용은 다음 문서를 참조하세요.