Azure 상식

AKS AutoScaling에 대한 이해

ktzzang0601 2025. 8. 6. 00:40

1. AKS node pool 개념

  • Azure Kubernetes Service(AKS)에서 Node Pool이란 Kubernetes 클러스터에서 컨테이너화된 애플리케이션을 실행하는 가상 머신들을 그룹화하여 관리하는 집합입니다. 노드 풀은 크게 시스템 노드 풀과 사용자 노드 풀로 나뉘는데, 시스템 노드 풀은 CoreDNS 및 metrics-server와 같은 중요 시스템 Pod를 호스트하는 기본 목적을 제공합니다. 사용자 노드 풀의 기본 목적은 애플리케이션 Pod를 호스트하는 것입니다. 하지만 AKS 클러스터에 풀을 하나만 포함하려는 경우 시스템 노드 풀에 애플리케이션 Pod를 예약할 수 있습니다. 모든 AKS 클러스터에는 노드가 두 개 이상 있는 시스템 노드 풀이 하나 이상 포함되어야 합니다.

2. AKS Node Pool의 자동 크기 조정 원리 - VMSS 자동 크기 조정 + Kubernetes Horizontal Pod Autoscaling

  • 기본적으로 노드 풀 설정 시 스케일링 방법을 설정할 수 있는데, 자동 크기 조정과 수동 방식 두가지가 있으며, 자동 크기 조정의 경우에는 최소 노드 갯수, 최대 노드 갯수를 지정하여 배포할 노드 수량의 범위를 설정합니다
  • AKS의 AutoScaling  원리는 기본적으로 VMSS AutoScaling 규칙에 기반하여 동작합니다. VMSS AutoScaling은 기본적으로 호스트 메트릭(CPU 사용량, 메모리 사용량)과 일정 혹은 규칙을 기반으로 자동 크기 조정 프로필을 갱신하여 VM 갯수를 관리하나, AKS에서는 이와 더불어 리소스 사용량 및 파드의 스케줄링 요구를 기반으로 노드를 자동으로 추가하거나 제거합니다.
  • Node Pool의 AutoScaling에 핵심 원리는  Horizontal Pod Autoscaling 이다. 각 주기마다, 컨트롤러 매니저는 각 HorizontalPodAutoscaler 정의에 지정된 메트릭에 대해 리소스 사용률을 질의하여  HorizontalPodAutoscaler가 대상으로 하는 각 파드에 대한 리소스 메트릭 API에서 메트릭을 가져온다. 그런 다음, 목표 사용률 값이 설정되면, 컨트롤러는 각 파드의 컨테이너에 대한 동등한 자원 요청을 퍼센트 단위로 하여 사용률 값을 계산한다. 대상 원시 값이 설정된 경우 원시 메트릭 값이 직접 사용된다. 그리고, 컨트롤러는 모든 대상 파드에서 사용된 사용률의 평균 또는 원시 값(지정된 대상 유형에 따라 다름)을 가져와서 원하는 레플리카의 개수를 스케일하는데 사용되는 비율을 생성한다.
  • AKS에서도 Virtual Machine Scale Sets (VMSS)를 이용하여 워커 노드 자동 크기 조정(오토스케일링)을 할 수 있는데, 클러스터 자동 크기 조정 기능을 활성화하고 노드 풀의 최소 및 최대 노드 수를 설정해야 합니다. 클러스터 자동 크기 조정기는 노드 풀의 노드 수를 자동으로 조정하여 워크로드의 요구 사항을 충족하지만, 노드 풀 크기를 직접 조작하는 것은 권장하지 앟기 때문에 HPA (Horizontal Pod Autoscaler)와 결합하여 사용한다.
  • AKS에서는 클러스터 전체 자동 크기 조정기 프로필의 기본값을 변경하여 클러스터 자동 크기 조정기의 세부 정보를 구성할 수 있습니다. 예를 들어 10분 후 노드 사용량이 저조하면 스케일 다운 이벤트가 발생합니다. 15분마다 실행되는 워크로드가 있는 경우 15분 또는 20분 후에 사용량이 저조한 노드를 스케일 다운하도록 자동 크기 조정기 프로필을 변경할 수 있습니다. 클러스터 자동 크기 조정기를 사용하도록 설정하면 다른 설정을 지정하지 않는 한 기본 프로필이 사용되며, 노드 풀별로 자동 크기 조정기 프로필을 설정할 수는 없습니다.
  • HPA 설정
    - kubectl autoscale deployment <디플로이먼트명> --cpu-percent=<목표 CPU 사용률> --min=<최소 파드 수> --max=<최대 파드 수>
  • Node Autoscaler (Cluster Autoscaler)
    - Node Pool 단위로 활성화 (--enable-cluster-autoscaler)
  • 프로필 설정 상세 내용
    설정 설명 기본값
    scan-interval 스케일 업 또는 다운을 위해 클러스터를 다시 평가하는 빈도입니다. 10초
    scale-down-delay-after-add 스케일 업 후 스케일 다운 평가가 다시 시작되기 전까지의 경과 시간입니다. 10분
    scale-down-delay-after-delete 노드 삭제 후 스케일 다운 평가가 다시 시작되기 전까지의 경과 시간입니다. scan-interval
    scale-down-delay-after-failure 스케일 다운 실패 후 스케일 다운 평가가 다시 시작되기 전까지의 경과 시간입니다. 3분
    scale-down-unneeded-time 불필요한 노드를 스케일 다운하기 전까지의 경과 시간입니다. 10분
    scale-down-unready-time 준비되지 않은 노드를 스케일 다운하기 전까지의 경과 시간입니다. 20분
    ignore-daemonsets-utilization 스케일 다운에 대한 리소스 사용률을 계산할 때 DaemonSet Pod가 무시되는지 여부입니다. false
    daemonset-eviction-for-empty-nodes DaemonSet Pod가 빈 노드에서 정상적으로 종료되는지 여부입니다. false
    daemonset-eviction-for-occupied-nodes DaemonSet Pod가 비어있지 않은 노드에서 정상적으로 종료되는지 여부입니다. true
    scale-down-utilization-threshold 요청된 리소스의 합계를 용량으로 나눈 노드 사용률 수준으로, 이 수준의 노드는 스케일 다운 대상으로 고려할 수 있습니다. 0.5
    max-graceful-termination-sec 노드를 스케일 다운하려고 할 때 클러스터 자동 크기 조정기가 Pod 종료를 위해 대기하는 최대 시간(초) 600초
    balance-similar-node-groups 비슷한 노드 풀을 검색하고 두 노드 풀의 노드 수를 균형 있게 조정합니다. false
    expander 스케일 업에 사용하는 노드 풀 확장기의 유형입니다. 가능한 값은 most-pods, random, least-waste  priority입니다. random
    skip-nodes-with-local-storage true인 경우 클러스터 자동 크기 조정기는 로컬 스토리지가 포함된 Pod가 있는 노드를 삭제하지 않습니다(예: EmptyDir 또는 HostPath). false
    skip-nodes-with-system-pods true인 경우 클러스터 자동 크기 조정기는 kube-system에서 Pod가 있는 노드를 삭제하지 않습니다(DaemonSet 또는 미러 Pod 제외). true
    max-empty-bulk-delete 동시에 삭제할 수 있는 빈 노드의 최대 수입니다. 10개 노드
    new-pod-scale-up-delay Kubernetes 스케줄러가 모든 Pod를 예약하기 전에 CA가 작동하지 않도록 하려는 버스트/일괄 처리 규모와 같은 시나리오의 경우, 어느 정도 시간이 지나기 전에 예약되지 않은 Pod를 CA가 무시하도록 지시할 수 있습니다. 0초
    max-total-unready-percentage 클러스터에서 준비되지 않은 노드의 최대 비율입니다. 이 비율을 초과하면 CA가 작업을 중단합니다. 45%
    max-node-provision-time 노드가 프로비전될 때까지 자동 크기 조정기가 대기하는 최대 시간입니다. 15분
    ok-total-unready-count max-total-unready-percentage에 관계없이 준비되지 않은 노드가 허용되는 수입니다. 노드 3개
  • 설정 예시
    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --os-type Windows \
        --name $CONTAINER_D_NODE_POOL_NAME \
        --node-vm-size Standard_D4s_v3 \
        --kubernetes-version 1.20.5 \
        --aks-custom-headers WindowsContainerRuntime=containerd \
        --node-count 1​

3. 참고 문서