이 문서에서는 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의 노드 자동 프로비저닝에 대한 자세한 내용은 다음 문서를 참조하세요.