AKS(Azure Kubernetes Service) 노드 NAP(자동 프로비저닝)에 대한 노드 풀 구성

이 문서에서는 SKU 선택기, 리소스 제한 및 우선 순위 가중치를 포함하여 AKS(Azure Kubernetes Service) NAP(노드 자동 프로비저닝)에 대한 노드 풀을 구성하는 방법을 설명합니다. 또한 시작하는 데 도움이 되는 예제도 제공합니다.

AKS 자동은 기본적으로 NAP를 포함합니다. AKS 표준 클러스터의 경우 노드 풀을 구성하기 전에 NAP를 사용하도록 설정해야 합니다.

NAP가 노드 풀에 대한 VM을 선택하는 방법

NAP는 VM(가상 머신) SKU 요구 사항을 사용하여 보류 중인 워크로드에 가장 적합한 VM을 결정합니다. 다음을 구성할 수 있습니다.

  • SKU 제품군 및 특정 인스턴스 형식.
  • 리소스 제한 및 우선 순위.
  • 스폿 또는 주문형 인스턴스.
  • 아키텍처, GPU 및 기타 기능 요구 사항

리소스는 NodePool NAP가 만드는 노드 및 해당 노드에서 실행되는 Pod에 대한 제약 조건을 설정합니다. 기본 노드 풀 구성이 설정된 상태에서 NAP를 Auto사용하도록 설정하면 기본 NodePool 리소스가 만들어집니다. 이러한 노드 풀을 수정하거나 워크로드 요구 사항에 맞게 추가 노드 풀을 만들 수 있습니다.

NAP에서 노드 풀을 평가하고 선택하는 방법

NAP을 구성할 때는 다음 동작을 염두에 두십시오.

  • NAP를 사용하려면 하나 NodePool 이상의 함수가 필요합니다.
  • NAP는 구성된 NodePool 각을 평가합니다.
  • NAP는 Pod에서 허용되지 않는 테인트로 인해 NodePools를 건너뜁니다.
  • NAP는 프로비전된 노드에 시작 테인트를 적용하지만 Pod 톨러레이션은 요구하지 않습니다.
  • NAP는 각 Pod가 하나의 풀에만 일치하도록 요구 사항이 서로 겹치지 않는 상호 배타적인 NodePools에서 가장 잘 작동합니다. 여러 NodePools 항목이 일치하면 NAP는 가중치가 가장 높은 값을 사용합니다.

기본 노드 풀 구성 검토

NAP에 의해 생성된 기본 Karpenter NodePooldefault의 구성은 다음과 같습니다.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    spec:
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: default
      expireAfter: Never
      # Requirements that constrain the parameters of provisioned nodes.
      # These requirements are combined with pod.spec.affinity.nodeAffinity rules.
      # Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
      # https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: kubernetes.io/os
        operator: In
        values:
        - linux
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
      - key: karpenter.azure.com/sku-family
        operator: In
        values:
        - D

또한 NAP는 system-surge 중요한 시스템 추가 기능에 대한 주문형 Linux AMD64 용량을 제공하는 노드 풀을 만듭니다. 대기 중인 Pod가 CriticalAddonsOnly=true:NoSchedule taint를 허용하고 풀의 요구 사항을 충족하면 NAP는 이 풀에서 노드를 프로비저닝할 수 있습니다. 풀에서 만든 노드에는 레이블이 있습니다 kubernetes.azure.com/mode: system .

기본 노드 풀 제어

Azure CLI 사용하여 NAP에서 사용하도록 설정된 새 AKS 클러스터를 만들 때 AKS에서 기본 NAPNodePools를 만들지 여부를 제어하는 플래그를 포함합니다--node-provisioning-default-pools. 기존 클러스터에서 NAP를 az aks update 사용하도록 설정할 때 이 플래그를 사용할 수도 있습니다.

플래그는 --node-provisioning-default-pools 다음 값을 허용합니다.

  • Auto (기본값): 즉시 사용할 수 있는 두 개의 표준을 NodePools 만듭니다.
  • None: NodePools를 생성하지 않습니다. 직접 정의해야 합니다.

경고

다음으로 AutoNone변경: 기존 클러스터에서 AutoNone 설정을 변경하는 경우 기본값 NodePools 은 자동으로 삭제되지 않습니다. 삭제하기 전에 중요한 시스템 추가 기능에 적합한 대체 용량을 정의합니다. 더 이상 필요하지 않은 경우 기본값 NodePools 을 수동으로 삭제해야 합니다.

노드 풀 구성 옵션

다음 섹션에서는 NodePools, 노드 풀 제한 및 노드 풀 가중치를 포함하여 NAP의 다양한 구성 옵션을 간략하게 설명합니다.

잘 알려진 레이블 및 SKU 선택기

Kubernetes는 Azure가 구현하는 알려진 레이블을 정의합니다. spec.requirements API의 NodePool 섹션에서 이러한 레이블을 정의할 수 있습니다. NAP는 고급 일정 예약을 위해 Azure 특정 레이블도 지원합니다.

다음 표는 spec.requirements API의 NodePool 섹션에서 노드의 VM 특성을 정의하는 데 사용할 수 있는 레이블을 나열합니다.

Selector Description Example
karpenter.sh/capacity-type VM 할당 유형(스폿/주문형) 스폿
karpenter.azure.com/sku-family VM SKU 제품군 D, F, L 등
karpenter.azure.com/sku-series VM SKU 시리즈 Dpls_v6
karpenter.azure.com/sku-name 명시적 SKU 이름 Standard_A1_v2
karpenter.azure.com/sku-version SKU 버전("v"가 없으면 1을 사용할 수 있습니다.) 1, 2
karpenter.azure.com/sku-cpu VM의 CPU 수 16
karpenter.azure.com/sku-memory 가상 시스템의 메모리 (MiB) 131072
karpenter.azure.com/sku-gpu-name GPU 이름 A100
karpenter.azure.com/sku-gpu-manufacturer GPU 제조업체 nvidia
karpenter.azure.com/sku-gpu-count VM당 GPU 수 2
karpenter.azure.com/sku-networking-accelerated VM에 가속화된 네트워킹이 있는지 여부 [참, 거짓]
karpenter.azure.com/sku-storage-premium-capable VM에서 Premium IO 스토리지를 지원하는지 여부 [참, 거짓]
karpenter.azure.com/sku-storage-ephemeralos-maxsize OS(임시 운영 체제) 디스크의 크기 제한(GB) 92
kubernetes.azure.com/sku-cpu VM의 CPU 수 16
kubernetes.azure.com/sku-memory 가상 시스템의 메모리 (MiB) 131072
kubernetes.azure.com/cluster AKS 클러스터 이름 my-cluster
kubernetes.azure.com/mode 노드 풀 모드 [시스템, 사용자]
kubernetes.azure.com/priority 우선 순위 [스폿, 정기]
kubernetes.azure.com/os-sku 운영 체제 SKU [Ubuntu, AzureLinux]
kubernetes.azure.com/fips_enabled FIPS 사용 여부 true
topology.kubernetes.io/zone 가용성 영역 [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os 운영 체제 linux
kubernetes.io/arch CPU 아키텍처(AMD64 또는 ARM64) [amd64, arm64]

이 테이블의 메모리 선택기 값은 NAP에서 만든 노드에 보고된 MiB 값입니다. 선택기를 추가하기 전에 노드의 레이블을 검사하여 클러스터에서 사용하는 값을 확인합니다.

SKU 제품군 예제

karpenter.azure.com/sku-family 선택기를 사용하면 특정 VM 패밀리를 대상으로 지정할 수 있습니다.

패밀리 Description
D 시리즈 CPU와 메모리 비율이 균형 잡힌 범용 VM
F 시리즈 CPU 대 메모리 비율이 높은 컴퓨팅 최적화 VM
E 시리즈 메모리 집약적 애플리케이션용 메모리 최적화 VM
L 시리즈 디스크 처리량이 높은 스토리지 최적화 VM
N 시리즈 계산 집약적 워크로드에 대한 GPU 사용 VM

SKU 제품군을 사용하는 구성 예제:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - D
  - F

GPU SKU 예제

NAP를 사용하여 NVIDIA GPU 노드를 프로비전하려면 GPU 지원 VM 크기를 선택하는 NodePool를 만드세요. 다음 예제에서는 NAP에서 N 시리즈 NVIDIA GPU SKU를 선택할 수 있습니다.

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - N
- key: karpenter.azure.com/sku-gpu-manufacturer
  operator: In
  values:
  - nvidia

AKS가 NVIDIA GPU 드라이버, 디바이스 플러그인, DCGM(Data Center GPU Manager) 메트릭 익스포터 및 NAP에서 프로비저닝한 GPU 노드의 GPU 상태 신호를 설치하고 관리하도록 하려면, 참조된 AKSNodeClass에서 관리형 GPU를 구성하세요. 자세한 내용은 AKS 관리 GPU 노드 풀 만들기를 참조하세요.

SKU 이름 예제

karpenter.azure.com/sku-name 선택기를 사용하면 정확한 VM 인스턴스 유형을 지정할 수 있습니다.

requirements:
- key: karpenter.azure.com/sku-name
  operator: In
  values:
  - Standard_D4s_v3
  - Standard_F8s_v2

SKU 버전 예제

karpenter.azure.com/sku-version 선택기는 특정 세대의 VM SKU를 대상으로 합니다.

requirements:
- key: karpenter.azure.com/sku-version
  operator: In
  values:
  - "3"  # v3 generation
  - "5"  # v5 generation

가용성 영역 예제

topology.kubernetes.io/zone 선택기를 사용하면 노드의 가용성 영역을 지정할 수 있습니다.

requirements:
- key: topology.kubernetes.io/zone
  operator: In
  values:
  - eastus-1
  - eastus-2

비고

지역의 가용성 영역을 지원하는 VM 크기를 나열하려면 매개 변수와 az vm list-skus 함께 --location <region> --zone --output table 명령을 사용합니다. 선택한 VM 크기가 요구 사항의 영역을 지원하는지 확인합니다 NodePool .

아키텍처 예제

kubernetes.io/arch 선택기를 사용하면 노드에 대한 CPU 아키텍처를 지정할 수 있습니다. NAP는 amd64 노드와 arm64 노드를 모두 지원합니다.

requirements:
- key: kubernetes.io/arch
  operator: In
  values:
  - amd64
  - arm64

OS 예제

kubernetes.io/os 선택기를 사용하면 노드에 대한 운영 체제를 지정할 수 있습니다.

requirements:
- key: kubernetes.io/os
  operator: In
  values:
  - linux

용량 유형 예제

karpenter.sh/capacity-type 선택기를 사용하면 스폿 인스턴스 또는 주문형 인스턴스를 사용할지 여부를 지정할 수 있습니다.

비고

NAP는 스폿 인스턴스와 주문형이 모두 지정된 경우 스폿 인스턴스의 우선 순위를 지정합니다.

requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values:
  - spot
  - on-demand

노드 풀 제한

기본적으로 NAP는 사용 가능한 Azure 할당량 내에서 워크로드를 예약하려고 시도합니다. 동적 노드 풀의 경우 해당 풀에서 프로비전된 모든 노드에서 집계 리소스 제한을 지정할 수 있습니다. 다음 예제 cpu: "1000" 에서는 풀을 1,000개 vCPU 코어로 제한하고 memory: 1000Gi 1,000gibibytes의 메모리로 제한합니다.

spec:
  # Resource limits constrain the total size of the node pool.
  # Limits prevent Node Auto Provisioning from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

노드 풀 가중치

여러 노드 풀이 정의된 경우 노드 풀 정의에서 상대적 가중치를 정의하여 워크로드를 예약해야 하는 위치에 대한 기본 설정을 지정할 수 있습니다. weight 필드는 1에서 100까지의 정수를 허용하며, 값이 높을수록 노드 풀의 우선 순위가 높아질 수 있습니다. 생략 weight하면 해당 값은 사실상 0입니다. 다음은 그 예입니다.

spec:
  # Priority given to the node pool when the scheduler considers which to select. 
  # Higher weights indicate higher priority when comparing node pools.
  # Specifying no weight is equivalent to specifying a weight of 0.
  weight: 10

정적 노드 풀

정적 노드 풀은 Pod 수요에 관계없이 필드에 지정된 replicas 고정된 NAP 프로비전 노드 수를 유지합니다. 노드 수를 변경하려면 kubectl scale의 크기를 명시적으로 조정하세요. 예를 들어 nodepool static-node-pool --replicas=7을(를) NodePool와 함께 사용합니다. 선택적 limits.nodes 값은 노드 교체 중에 생성된 명시적 크기 조정 및 임시 용량을 제한합니다. 정적 노드 풀의 nodes 경우 지원되는 유일한 필드 limits입니다. CPU 또는 메모리 제한을 설정할 수 없습니다.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-node-pool
spec:
  replicas: 5
  template:
    spec:
      requirements:
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
          - Standard_D4s_v3
          - Standard_F8s_v2
      - key: topology.kubernetes.io/zone
        operator: In
        values:
          - eastus-1
          - eastus-2
          - eastus-3
  limits:
    nodes: 10

비고

정적 노드 풀의 경우 필드에서만 nodeslimits 설정할 수 있습니다. 리소스 제한을 weight설정할 수 없거나 중단 통합이 적용되지 않습니다. NodePool를 생성한 후에는 replicas 필드를 추가하거나 제거하여 정적 모드와 동적 모드 간에 전환할 수 없습니다.

다음 단계

AKS의 노드 자동 프로비저닝에 대한 자세한 내용은 다음 문서를 참조하세요.