AKS(Azure Kubernetes Service)에서 노드 풀 크기 조정

증가하는 배포 수를 수용하거나 더 큰 워크로드를 실행하도록 VM(가상 머신)의 크기를 변경할 수 있습니다. AKS에 대한 지원 정책에 설명된 대로 AKS에서 Virtual Machine Scale Sets를 사용하는 경우 AKS 인스턴스의 크기를 직접 조정하는 것은 지원되지 않습니다.

AKS 에이전트 노드는 Azure Portal에서 일반 Azure IaaS 리소스로 표시됩니다. 그러나 이러한 가상 머신은 사용자 지정 Azure 리소스 그룹(일반적으로 MC_* 접두사 포함)에 배포됩니다. IaaS API 또는 리소스를 사용하여 이러한 노드에 직접 사용자 지정할 수 없습니다. AKS API를 통해 수행되지 않는 사용자 지정 변경 내용은 업그레이드, 크기 조정, 업데이트 또는 다시 부팅을 통해 유지되지 않습니다.

이 문서에서는 원하는 SKU 크기로 새 노드 풀을 만들고, 기존 노드를 조정 및 드레이닝한 다음, 기존 노드 풀을 제거하여 노드 풀의 크기를 조정하는 권장 방법을 알아봅니다.

중요

이 방법은 Virtual Machine Scale Sets 기반 AKS 클러스터와 관련이 있습니다. Virtual Machines 기반 노드 풀을 사용하는 경우 단일 Azure CLI 명령을 사용하여 기존 노드 풀의 VM 크기를 쉽게 업데이트하고 동일한 노드 풀에 여러 VM 크기를 포함할 수 있습니다. 자세한 내용은 Virtual Machines 노드 풀 설명서를 참조하세요.

VMSS 노드 풀의 크기를 제자리에서 조정(미리 보기)

중요

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

이제 를 사용하여 단일 명령으로 기존 VMSS 기반 노드 풀의 VM 크기(SKU)의 크기를 조정할 수 있습니다 az aks nodepool update --node-vm-size <new-size>. 이 업데이트를 트리거하면 AKS 리소스 공급자는 다음을 통해 롤링 업그레이드를 수행합니다.

  1. 대상 VM 크기로 새 노드 급증
  2. 기존 노드를 코든 처리하고 드레인합니다.
  3. 이전 노드를 삭제합니다.

이렇게 하면 이 문서의 나머지 부분에 설명된 수동 만들기/코돈/드레이닝/삭제 워크플로가 방지됩니다.

크기 조정 롤아웃의 작동 방식

크기 조정 롤아웃은 노드 이미지 업그레이드Kubernetes 버전 업그레이드와 동일한 롤링 업그레이드 엔진을 사용하므로 노드 풀에 이미 구성된 다음 업그레이드 관련 설정을 적용합니다. 특히 크기 조정은 다음 사항을 준수합니다:

  • 최대 서지 (--max-surge): 롤아웃 중에 대상 VM 크기의 추가 노드가 몇 개 추가되는지를 제어합니다. 값이 높을수록 풀의 크기가 더 빨라지지만 더 많은 컴퓨팅 및 IP 할당량을 사용합니다. 낮은 값은 느리지만 중단이 적습니다. AKS의 기본값은 1이며, 33%는 프로덕션 노드 풀에 권장됩니다.
  • 노드 비우기 시간 제한 (--drain-timeout): 각 기존 노드에서 Pod를 축출할 때까지 AKS가 기다리다가 이후 해당 노드를 강제로 삭제하는 시간입니다. 기본값은 30분입니다. 워크로드를 안전하게 드레이닝할 수 있도록 적절한 PodDisruptionBudgets와 함께 사용합니다.
  • 노드 사용 기간 (--node-soak-duration): AKS가 다음 일괄 처리로 이동하기 전에 새 노드가 준비 상태가 된 후 대기하는 시간입니다. 롤아웃을 계속하기 전에 워크로드가 새 VM 크기에서 안정화되도록 하는 데 유용합니다.

크기 조정은 업그레이드 파이프라인을 다시 사용하므로 동일한 필수 구성 요소가 적용됩니다. 구독에 서지 노드에 대해 충분한 대상 VM 크기 대체 용량과 사용 가능한 서브넷 IP가 있는지 확인하고, PodDisruptionBudgets를 통해 한 번에 하나 이상의 복제본을 제거할 수 있는지 확인하고, 그렇지 않으면 드레이닝 중에 크기 조정을 차단할 수 있습니다. 엔드투엔드 권장 사항은 AKS 노드 풀 업그레이드에 대한 모범 사례를 참조하세요.

사전 요구 사항

노드 풀 크기 조정

매개 변수와 az aks nodepool update 함께 --node-vm-size 명령을 사용하여 기존 VMSS 기반 노드 풀의 VM 크기를 변경합니다.

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3

유효성 검사 및 지원되지 않는 조합

AKS 리소스 공급자는 크기 조정 요청의 유효성을 검사하고 호환되지 않는 VM 크기 변경을 차단합니다. 다음 변경 내용은 현재 위치 VMSS 크기 조정의 일부로 지원되지 않습니다 .

  • 디스크 컨트롤러 유형 변경(예: SCSI에서 NVMe로).
  • CPU 아키텍처 변경(예: x64에서 ARM64로).
  • 기밀 컴퓨팅 지원 변경(예: SNP 사용 또는 사용 안 함).
  • 하이퍼바이저 생성 변경(예: V1에서 V2로).
  • 크기 조정을 Kubernetes 버전 업그레이드 또는 노드 수 변경 과 결합하여 동일한 작업에서 변경합니다.

대상 VM 크기에 위의 변경 내용이 필요한 경우 다음 섹션에 설명된 수동 코돈 및 드레이닝 워크플로를 대신 사용합니다.

참고

제자리 크기 조정을 수행하려면 먼저 대상 VM 크기의 새 노드를 프로비전할 수 있는 서지 용량이 있어야 하며, 그 후 기존 노드를 드레이닝(비우기)해야 합니다. 노드 풀이 --max-surge 0로 구성된 경우(즉, --max-unavailable가 적용되는 경우), 크기 조정 요청은 400 Bad Request와 함께 거부됩니다. 계속하려면 크기를 조정할 때 --max-surge를 최소 1로 설정하세요.

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3 \
    --max-surge 33%

필요에 따라 크기 조정이 완료된 후 원래 --max-surge 값과 --max-unavailable 값을 복원합니다.

원하는 SKU로 새 노드 풀 만들기

참고

모든 AKS 클러스터에는 노드가 하나 이상 있는 시스템 노드 풀이 하나 이상 포함되어야 합니다. 이 예제에서는 --modeSystem을 사용하여 크기를 조정하려는 시스템 노드 풀을 대체할 새로운 시스템 노드 풀을 추가합니다. 언제든지 노드 풀의 모드를 업데이트할 수 있습니다. --modeUser로 설정하여 사용자 노드 풀을 추가할 수도 있습니다.

크기를 조정할 때 가용성 영역과 같은 모든 워크로드 요구 사항을 고려하고 그에 따라 VMSS 노드 풀을 구성해야 합니다. 사용자의 요구 사항에 가장 적합하도록 다음 명령을 수정해야 할 수도 있습니다. 구성 옵션의 전체 목록은 az aks nodepool add 참조 페이지를 참조하세요.

  1. 명령을 사용하여 새 노드 풀을 만듭니다 az aks nodepool add . 이 예제에서는 3개의 노드mynodepoolStandard_DS3_v2 VM SKU를 사용하여 VM SKU가 있는 기존 노드 풀을 대체하는 새 노드 풀 nodepool1Standard_DS2_v2 을 만듭니다.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 3 \
        --node-vm-size Standard_DS3_v2 \
        --mode System \
        --no-wait
    

    새 노드 풀을 만드는 데 몇 분 정도 걸립니다.

  2. 명령을 사용하여 새 노드 풀의 상태를 가져옵니다 kubectl get nodes .

    kubectl get nodes
    

    출력은 새 노드 풀과 기존 mynodepool노드 풀 nodepool1 을 모두 보여 주는 다음 예제 출력과 유사해야 합니다.

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

기존 노드 차단

차단은 지정된 노드를 예약 불가로 표시하고 노드에 더 이상 Pod가 추가되지 않도록 합니다.

  1. 명령을 사용하여 kubectl get nodes 코돈하려는 노드의 이름을 가져옵니다.

    kubectl get nodes
    

    출력은 다음 예제 출력과 유사하며, 코돈하려는 기존 노드 풀 nodepool1 의 노드를 보여 줍니다.

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. 명령을 사용하여 kubectl cordon 기존 노드를 코돈하여 공백으로 구분된 목록에서 원하는 노드를 지정합니다. 다음은 그 예입니다.

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    출력은 노드가 코드되어 있음을 보여 주는 다음 예제 출력과 유사해야 합니다.

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-vmss000002 cordoned
    

기존 노드 드레이닝

중요

노드를 성공적으로 드레이닝하고 실행 중인 Pod를 제거하려면 PDB(PodDisruptionBudgets)에서 한 번에 하나 이상의 Pod 복제본을 이동할 수 있는지 확인합니다. 그렇지 않으면 드레인/제거 작업이 실패합니다. 이를 확인하려면 kubectl get pdb -A을(를) 실행하고, ALLOWED DISRUPTIONS이(가) 적어도 1 이상인지 확인할 수 있습니다.

노드를 드레이닝하면 해당 노드에서 실행 중인 Pod가 추방되고 다른 예약 가능한 노드에서 다시 만들어집니다.

  1. 먼저 kubectl drain 명령과 --ignore-daemonsets, --delete-emptydir-data 플래그를 사용하여 기존 노드를 비우고, 공백으로 구분된 목록에서 원하는 노드를 지정합니다. 다음은 그 예입니다.

    중요

    AKS 만들기 --delete-emptydir-datacoredns Pod를 제거하려면 metrics-server를 사용해야 합니다. 이 플래그를 사용하지 않으면 오류가 발생합니다. 자세한 내용은 emptydir 설명서를 참조하세요.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. 드레이닝 작업이 완료되면 디먼 집합으로 제어되는 Pod를 제외한 모든 Pod가 새 노드 풀에서 실행되어야 합니다. kubectl get pods 명령을 사용하여 이를 확인할 수 있습니다.

    kubectl get pods -o wide -A
    

Pod 제거 문제 해결

노드를 드레이닝할 때 다음 오류가 발생할 수 있습니다.

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

기본적으로 클러스터에는 coredns-pdbkonnectivity-agent인 AKS-관리 Pod 중단 예산(예: MinAvailable 또는 1)이 있습니다. 예를 들어 두 개의 coredns Pod가 실행 중인 경우 한 번에 하나만 중단될 수 있습니다. 그 중 하나가 다시 만들어져 사용할 수 없는 경우 다른 coredns Pod는 Pod 중단 예산으로 인해 제거할 수 없습니다. 이 문제는 초기 coredns Pod가 예약되고 실행된 후 자체적으로 해결되므로 두 번째 Pod가 제대로 제거되고 다시 만들어질 수 있습니다.

보다 원활한 제거 환경과 제한을 피하기 위해 노드를 드레이닝하는 것이 좋습니다. 자세한 내용은 다음을 참조하세요.

기존 노드 풀 제거

중요

노드 풀을 삭제하면 AKS는 차단 및 드레이닝을 수행하지 않습니다. 삭제하려는 노드 풀에서 현재 실행 중인 Pod 일정 변경의 중단을 최소화하려면 삭제하기 전에 노드 풀의 모든 노드에서 차단 및 드레이닝을 수행하려고 합니다.

  1. 명령을 사용하여 원래 노드 풀을 삭제합니다 az aks nodepool delete .

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. kubectl get nodes 명령을 사용하여 AKS 클러스터에 애플리케이션과 Pod가 제대로 실행되는 새 노드 풀만 있는지 확인합니다.

    kubectl get nodes
    

    출력은 새 노드 풀 mynodepool만 표시하는 다음 예제 출력과 유사해야 합니다.

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   63m   v1.21.9
    

다음 단계

차단 및 드레이닝을 통해 노드 풀의 크기를 조정한 후 여러 노드 풀 사용에 대해 자세히 알아봅니다.