노드 자동 프로비전(미리 보기)

AKS에 워크로드를 배포하는 경우 필요한 VM 크기와 관련하여 노드 풀 구성을 결정해야 합니다. 워크로드가 더욱 복잡해지고 실행을 위해 다양한 CPU, 메모리 및 기능이 필요해짐에 따라 수많은 리소스 요청에 대해 VM 구성을 설계해야 하는 오버헤드가 어려워집니다.

NAP(노드 자동 프로비전)(미리 보기)는 보류 중인 Pod 리소스 요구 사항에 따라 가장 효율적이고 비용 효과적인 방식으로 해당 워크로드를 실행하기 위한 최적의 VM 구성을 결정합니다.

NAP는 오픈 소스 Karpenter 프로젝트를 기반으로 하며 AKS 공급자도 오픈 소스입니다. NAP는 AKS 클러스터에서 Karpenter를 자동으로 배포, 구성 및 관리합니다.

Important

AKS에 대한 NAP(노드 자동 프로비전)는 현재 미리 보기 상태입니다. 베타, 미리 보기로 제공되거나 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 약관은 Microsoft Azure 미리 보기에 대한 추가 사용 약관을 참조하세요.

시작하기 전에

aks-preview CLI 확장 설치

  1. az extension add 명령을 사용하여 aks-preview CLI 확장을 설치합니다.

    az extension add --name aks-preview
    
  2. az extension update 명령을 사용하여 최신 버전이 설치되어 있는지 확인하려면 확장을 업데이트합니다.

    az extension update --name aks-preview
    

NodeAutoProvisioningPreview 기능 플래그 등록

  1. az feature register 명령을 사용하여 NodeAutoProvisioningPreview 기능 플래그를 등록합니다.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    

    상태가 Registered로 표시되는 데 몇 분 정도 걸립니다.

  2. 또한 az feature show 명령을 사용하여 등록 상태를 확인합니다.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. 상태가 Registered(등록됨)를 반영하면 az provider register 명령을 사용하여 Microsoft.ContainerService 리소스 공급자의 등록을 새로 고칩니다.

    az provider register --namespace Microsoft.ContainerService
    

제한 사항

  • 허용되는 유일한 네트워크 구성은 Cilium + Overlay + Azure입니다.
  • 노드 풀에 클러스터 자동 크기 조정기가 사용하도록 설정된 클러스터에서는 사용하도록 설정할 수 없습니다.

지원되지 않는 기능:

  • Windows 노드 풀
  • 노드 kubelet에 사용자 지정 구성 적용
  • IPv6 클러스터
  • 서비스 주체

    참고 항목

    시스템이 할당한 관리 ID 또는 사용자가 할당한 관리 ID를 사용할 수 있습니다.

  • 디스크 암호화 집합
  • CustomCATrustCertificates
  • 시작 중지 모드
  • HTTP 프록시
  • OutboundType 변형입니다. 모든 OutboundType은 지원되지만 만든 후에는 변경할 수 없습니다.

노드 자동 프로비전 사용

노드 자동 프로비전을 사용하도록 설정하려면 az aks create 명령을 사용하여 새 클러스터를 만들고 --node-provisioning-mode를 "Auto"로 설정합니다. 또한 오버레이 네트워킹 및 cilium 네트워크 정책을 사용해야 합니다.

az aks create --name karpuktest --resource-group karpuk --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