다음을 통해 공유


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 노드 풀 설명서를 참조하세요.

원하는 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
    

다음 단계

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