노드 자동 프로비전(미리 보기)
AKS에 워크로드를 배포하는 경우 필요한 VM 크기와 관련하여 노드 풀 구성을 결정해야 합니다. 워크로드가 더욱 복잡해지고 실행을 위해 다양한 CPU, 메모리 및 기능이 필요해짐에 따라 수많은 리소스 요청에 대해 VM 구성을 설계해야 하는 오버헤드가 어려워집니다.
NAP(노드 자동 프로비전)(미리 보기)는 보류 중인 Pod 리소스 요구 사항에 따라 가장 효율적이고 비용 효과적인 방식으로 해당 워크로드를 실행하기 위한 최적의 VM 구성을 결정합니다.
NAP는 오픈 소스 Karpenter 프로젝트를 기반으로 하며 AKS 공급자도 오픈 소스입니다. NAP는 AKS 클러스터에서 Karpenter를 자동으로 배포, 구성 및 관리합니다.
Important
AKS에 대한 NAP(노드 자동 프로비전)는 현재 미리 보기 상태입니다. 베타, 미리 보기로 제공되거나 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 약관은 Microsoft Azure 미리 보기에 대한 추가 사용 약관을 참조하세요.
시작하기 전에
- Azure 구독이 필요합니다. Azure 구독이 없는 경우 무료 계정을 만들 수 있습니다.
- Azure CLI를 설치해야 합니다.
aks-preview
Azure CLI 확장을 설치합니다. 최소 버전 0.5.170.- NodeAutoProvisioningPreviewfeature 플래그를 등록합니다.
aks-preview
CLI 확장 설치
az extension add
명령을 사용하여aks-preview
CLI 확장을 설치합니다.az extension add --name aks-preview
az extension update
명령을 사용하여 최신 버전이 설치되어 있는지 확인하려면 확장을 업데이트합니다.az extension update --name aks-preview
NodeAutoProvisioningPreview
기능 플래그 등록
az feature register
명령을 사용하여NodeAutoProvisioningPreview
기능 플래그를 등록합니다.az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
상태가 Registered로 표시되는 데 몇 분 정도 걸립니다.
또한
az feature show
명령을 사용하여 등록 상태를 확인합니다.az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
상태가 Registered(등록됨)를 반영하면
az provider register
명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.az provider register --namespace Microsoft.ContainerService
제한 사항
- 허용되는 유일한 네트워크 구성은 Cilium 제공 Azure CNI 오버레이입니다.
- 노드 풀에 클러스터 자동 크기 조정기가 사용하도록 설정된 클러스터에서는 사용하도록 설정할 수 없습니다.
지원되지 않는 기능
- Windows 노드 풀
- 노드 kubelet에 사용자 지정 구성 적용
- IPv6 클러스터
- 서비스 주체
참고 항목
시스템이 할당한 관리 ID 또는 사용자가 할당한 관리 ID를 사용할 수 있습니다.
- 디스크 암호화 집합
- CustomCATrustCertificates
- 시작 중지 모드
- HTTP 프록시
- OutboundType 변형입니다. 모든 OutboundType은 지원되지만 만든 후에는 변경할 수 없습니다.
노드 자동 프로비전 사용
새 클러스터에서 노드 자동 프로비전 사용
az aks create
명령을 사용하여 새 클러스터에서 노드 자동 프로비전을 사용하도록 설정하고--node-provisioning-mode
을(를)Auto
(으)로 설정합니다. 또한--network-plugin
은(는)azure
(으)로,--network-plugin-mode
은(는)overlay
(으)로 그리고--network-dataplane
은(는)cilium
(으)로 설정해야 합니다.az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-provisioning-mode Auto \ --network-plugin azure \ --network-plugin-mode overlay \ --network-dataplane cilium \ --generate-ssh-keys
기존 클러스터에서 노드 자동 프로비전 사용
az aks update
명령을 사용하여 기존 클러스터에서 노드 자동 프로비전을 사용하도록 설정하고--node-provisioning-mode
을(를)Auto
(으)로 설정합니다. 또한--network-plugin
은(는)azure
(으)로,--network-plugin-mode
은(는)overlay
(으)로 그리고--network-dataplane
은(는)cilium
(으)로 설정해야 합니다.az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium
노드 풀
노드 자동 프로비전은 VM SKU 목록을 시작점으로 사용하여 보류 상태에 있는 워크로드에 가장 적합한 것을 결정합니다. 초기 풀에서 원하는 SKU를 제어하면 특정 SKU 제품군 또는 VM 형식과 프로비전 프로그램이 사용하는 최대 리소스 양을 지정할 수 있습니다.
예를 들어, 예약 인스턴스인 특정 VM SKU가 있는 경우 해당 VM만 시작 풀로 사용하려고 할 수 있습니다.
클러스터에 여러 노드 풀 정의가 있을 수 있지만 AKS는 수정할 수 있는 기본 노드 풀 정의를 배포합니다.
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
name: default
spec:
disruption:
consolidationPolicy: WhenUnderutilized
expireAfter: Never
template:
spec:
nodeClassRef:
name: default
# 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
지원되는 노드 프로비전 도구 요구 사항
잘 알려진 레이블이 있는 SKU 선택기
선택기 | 설명 | 예시 |
---|---|---|
karpenter.azure.com/sku-family | VM SKU 제품군 | D, F, L 등 |
karpenter.azure.com/sku-name | 명시적인 SKU 이름 | Standard_A1_v2 |
karpenter.azure.com/sku-version | SKU 버전("v" 제외, 1개 사용 가능) | 1 , 2 |
karpenter.sh/capacity-type | VM 할당 형식(스폿/주문형) | 스폿 또는 주문형 |
karpenter.azure.com/sku-cpu | VM의 CPU 수 | 16 |
karpenter.azure.com/sku-memory | VM의 메모리(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에 가속화된 네트워킹이 있는지 여부 | [true, false] |
karpenter.azure.com/sku-storage-premium-capable | VM이 프리미엄 IO 스토리지를 지원하는지 여부 | [true, false] |
karpenter.azure.com/sku-storage-ephemeralos-maxsize | 임시 OS 디스크의 크기 제한(GB) | 92 |
topology.kubernetes.io/zone | 가용성 영역 | [uksouth-1,uksouth-2,uksouth-3] |
kubernetes.io/os | 운영 체제(미리 보기 중에는 Linux만 해당) | Linux |
kubernetes.io/arch | CPU 아키텍처(AMD64 또는 ARM64) | [amd64, arm64] |
VM SKU 기능 및 허용되는 값을 나열하려면 Azure CLI에서 vm list-skus
명령을 사용합니다.
az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table
노드 풀 한도
기본적으로 NAP는 사용 가능한 Azure 할당량 내에서 워크로드를 예약하려고 시도합니다. 노드 풀 사양 내에서 한도를 지정하여 노드 풀에서 사용하는 리소스의 상한을 지정할 수도 있습니다.
# Resource limits constrain the total size of the cluster.
# Limits prevent Karpenter from creating new instances once the limit is exceeded.
limits:
cpu: "1000"
memory: 1000Gi
노드 풀 가중치
여러 노드 풀을 정의한 경우 워크로드를 예약해야 하는 위치에 대한 기본 설정을 지정할 수 있습니다. 노드 풀 정의에 대한 상대적 가중치를 정의합니다.
# 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
Kubernetes 및 노드 이미지 업데이트
NAP가 포함된 AKS는 기본적으로 Kubernetes 버전 업그레이드와 VM OS 디스크 업데이트를 관리합니다.
Kubernetes 업그레이드
NAP 노드 풀에 대한 Kubernetes 업그레이드는 컨트롤 플레인 Kubernetes 버전을 따릅니다. 클러스터 업그레이드를 수행하면 NAP 노드가 동일한 버전 관리를 따르도록 자동으로 업데이트됩니다.
노드 이미지 업데이트
기본적으로 NAP 노드 풀 가상 머신은 새 이미지를 사용할 수 있을 때 자동으로 업데이트됩니다. 특정 노드 이미지 버전에서 노드 풀을 고정하려면 노드 클래스에서 imageVersion을 설정할 수 있습니다.
kubectl edit aksnodeclass default
노드 클래스 정의 내에서 imageVersion을 AKS 릴리스 정보에 나열된 게시된 릴리스 중 하나로 설정합니다. AKS 릴리스 추적기를 참조하여 지역별 이미지 사용 가능 여부를 확인할 수도 있습니다.
imageVersion은 Ubuntu 22.04만 지원되므로 노드 이미지의 날짜 부분입니다. 예를 들어, "AKSUbuntu-2204-202311.07.0"은 "202311.07.0"입니다.
apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
annotations:
kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
nodes
meta.helm.sh/release-name: aks-managed-karpenter-overlay
meta.helm.sh/release-namespace: kube-system
creationTimestamp: "2023-11-16T23:59:06Z"
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
name: default
resourceVersion: "1792"
uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
imageFamily: Ubuntu2204
imageVersion: 202311.07.0
osDiskSizeGB: 128
imageVersion 사양을 삭제하면 노드 풀이 최신 노드 이미지 버전으로 업데이트되도록 되돌려집니다.
노드 중단
노드의 워크로드가 스케일 다운되면 NAP는 노드 풀 사양에 대한 중단 규칙을 사용하여 해당 노드를 제거할 시기와 방법을 결정하고 잠재적으로 워크로드 일정을 보다 효율적으로 조정합니다.
kubectl delete node
를 사용하여 노드를 수동으로 제거할 수 있지만 NAP는 노드를 최적화해야 하는 시기를 제어할 수도 있습니다.
disruption:
# Describes which types of Nodes NAP should consider for consolidation
consolidationPolicy: WhenUnderutilized | WhenEmpty
# 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost
# `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
# The amount of time NAP should wait after discovering a consolidation decision
# This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
# You can choose to disable consolidation entirely by setting the string value 'Never'
consolidateAfter: 30s
선택 이벤트 모니터링
노드 자동 프로비전은 배포 및 예약 결정을 모니터링하는 데 사용할 수 있는 클러스터 이벤트를 생성합니다. Kubernetes 이벤트 스트림을 통해 이벤트를 볼 수 있습니다.
kubectl get events -A --field-selector source=karpenter -w
Azure Kubernetes Service