다음을 통해 공유


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

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

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

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

중요합니다

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

시작하기 전에

aks-preview CLI 확장 설치

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

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

    az extension update --name aks-preview
    

NodeAutoProvisioningPreview 기능 플래그 등록

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

    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 리소스 공급자의 등록을 새로 고칩니다.

    az provider register --namespace Microsoft.ContainerService
    

제한 사항

  • 노드 풀에 클러스터 자동 크기 조정기가 사용하도록 설정된 클러스터에서는 사용하도록 설정할 수 없습니다.

지원되지 않는 기능

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

    참고 항목

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

  • 디스크 암호화 집합
  • 사용자 정의 CA 신뢰 인증서
  • 시작 중지 모드
  • HTTP 프록시
  • OutboundType 변형입니다. 모든 OutboundType은 지원되지만 만든 후에는 변경할 수 없습니다.
  • 프라이빗 클러스터(및 사용자 고유의 프라이빗 DNS 가져오기)

네트워킹 구성

노드 자동 프로비전으로 사용하도록 설정된 클러스터에 권장되는 네트워크 구성은 다음과 같습니다.

권장되는 네트워크 정책 엔진은 Cilium입니다.

현재 지원 되지 않는 네트워킹 구성은 다음과 같습니다.

  • Calico 네트워크 정책
  • 동적 IP 할당
  • CIDR 블록의 정적 할당

노드 자동 프로비전 사용

새 클러스터에서 노드 자동 프로비전 사용

  • 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를 제어하면 특정 SKU 제품군 또는 가상 머신 유형과 프로비저닝자가 사용하는 최대 리소스 수를 지정할 수 있습니다. 또한 노드 풀 파일에서 스폿 또는 주문형 인스턴스 지정, 여러 아키텍처 등과 같은 다양한 사양을 참조할 수 있습니다.

예를 들어 예약 인스턴스인 특정 가상 머신 크기가 있는 경우 해당 가상 머신만 시작 풀로 사용할 수 있습니다.

클러스터에 여러 노드 풀 정의가 있을 수 있지만 AKS는 수정할 수 있는 기본 노드 풀 정의를 배포합니다.

apiVersion: karpenter.sh/v1
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에 가속화된 네트워킹이 있는지 여부 [참, 거짓]
karpenter.azure.com/sku-storage-premium-capable VM이 프리미엄 IO 스토리지를 지원하는지 여부 [참, 거짓]
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]

가상 머신 SKU 기능 및 허용되는 값을 나열하려면 Azure CLI 명령을 사용합니다 vm list-skus .

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

노드 풀 한도

기본적으로 노드 자동 프로비전은 사용 가능한 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 및 노드 이미지 업데이트

노드 자동 프로비전을 사용하는 AKS는 기본적으로 Kubernetes 버전 업그레이드 및 VM OS 디스크 업데이트를 관리합니다.

Kubernetes 업그레이드

노드 자동 프로비전 노드에 대한 Kubernetes 업그레이드는 컨트롤 플레인 Kubernetes 버전을 따릅니다. 클러스터 업그레이드를 수행하는 경우 노드 자동 프로비전 노드는 동일한 버전 관리를 따르도록 자동으로 업데이트됩니다.

노드 이미지 업데이트

기본적으로 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 사양을 삭제하면 노드 풀이 최신 노드 이미지 버전으로 업데이트되도록 되돌려집니다.

중요합니다

SSH 키를 업데이트한 후 AKS는 노드를 자동으로 업데이트하지 않습니다. 언제든지 [nodepool 업데이트 작업][node-image-upgrade]을 수행하도록 선택할 수 있습니다. 업데이트 SSH 키 작업은 노드 이미지 업데이트가 완료된 후에 적용됩니다. 노드 자동 프로비저닝이 사용하도록 설정된 클러스터의 경우 Kubernetes NodePool 사용자 지정 리소스에 새 레이블을 적용하여 노드 이미지 업데이트를 수행할 수 있습니다.

노드 중단

노드의 워크로드가 축소되면 노드 자동 프로비전은 노드 풀 사양의 중단 규칙을 사용하여 해당 노드를 제거하는 시기와 방법을 결정하고 워크로드를 보다 효율적으로 다시 예약할 수 있습니다. 이는 주로 노드를 삭제하거나 바꾸어 최적의 구성으로 Pod를 bin-pack하는 통합을 통해 수행됩니다. 상태 기반 고려 사항은 ConsolidationPolicy을 사용하여 WhenUnderUtilized, WhenEmpty, 또는 WhenEmptyOrUnderUtilized를 통한 통합을 유도합니다. consolidateAfter 는 작업 간의 버퍼 시간을 허용하도록 설정할 수 있는 시간 기반 조건입니다.

노드를 수동으로 kubectl delete node제거할 수 있지만 노드 자동 프로비전은 사양에 따라 노드를 최적화해야 하는 시기를 제어할 수도 있습니다.

  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

노드 자동 프로비전 해제

노드 자동 프로비전은 다음 경우에만 비활성화할 수 있습니다.

  • 기존 NAP 관리 노드가 없습니다. NAP 관리 노드를 보기 위해서는 kubectl get nodes -l karpenter.sh/nodepool를 사용하세요.
  • 모든 기존 karpenter.sh/NodePools의 spec.limits.cpu가 0으로 설정되었습니다.

노드 자동 프로비전을 사용하지 않도록 설정하는 단계

  1. 모든 karpenter.sh/NodePools spec.limits.cpu 필드를 0으로 설정합니다. 이렇게 하면 새 노드가 생성되지 않지만 현재 실행 중인 노드가 중단되지는 않습니다.

참고 항목

NAP 노드에서 실행 중인 모든 Pod가 NAP가 아닌 노드로 안전하게 마이그레이션되도록 하는 데 신경 쓰지 않는 경우 2단계와 3단계를 건너뛰고 대신 각 NAP 관리 노드에 대한 명령을 사용할 kubectl delete node 수 있습니다.

2단계와 3단계를 건너뛰는 것은 권장되지 않습니다. 일부 pod가 보류 중일 수 있으며 pdb를 존중하지 않을 수 있습니다.

NAP에서 관리되지 않는 노드에서는 실행 kubectl delete node 하지 마세요.

  1. karpenter.azure.com/disable:NoSchedule taint를 모든 karpenter.sh/NodePool에 추가하세요.

    apiVersion: karpenter.sh/v1
    kind: NodePool
    metadata:
      name: default
    spec:
      template:
        spec:
          ...
          taints:
            - key: karpenter.azure.com/disable,
              effect: NoSchedule
    

    이렇게 하면 NAP 관리 노드의 워크로드를 비 NAP 노드로 마이그레이션하고 PDB 및 중단 제한을 적용하는 프로세스가 시작됩니다. Pod가 맞을 수 있는 경우 비 NAP 노드로 마이그레이션됩니다. 고정 크기 용량이 충분하지 않으면 일부 NAP 관리 노드가 유지됩니다.

  2. 기존 고정 크기 ManagedCluster AgentPools를 확장하거나 새 고정 크기 AgentPools를 만들어 NAP 관리 노드에서 부하를 가져옵니다. 이러한 노드가 클러스터에 추가되면 NAP 관리 노드가 드레이닝되고 작업이 고정 규모 노드로 마이그레이션됩니다.

  3. 를 사용하여 kubectl get nodes -l karpenter.sh/nodepool모든 NAP 관리 노드가 삭제되는지 확인합니다. 여전히 NAP 관리 노드가 있는 경우 클러스터가 고정 규모 용량을 초과했으며 나머지 워크로드를 마이그레이션할 수 있도록 더 많은 노드가 필요하다는 것을 의미합니다.

  4. ManagedCluster의 노드 프로비저닝 모드 매개 변수를 .로 업데이트합니다 Manual.

    az aks update \
        --name $CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --node-provisioning-mode Manual