다음을 통해 공유


노드 자동 프로비저닝

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

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

노드 자동 프로비전은 오픈 소스 Karpenter 프로젝트 및 역시 오픈 소스인 AKS Karpenter 공급자를 기반으로 합니다. 노드 자동 프로비저닝은 AKS 클러스터에서 Karpenter를 자동으로 배포, 구성 및 관리합니다.

노드 자동 프로비전 작동 방식

노드 자동 프로비저닝은 보류 중인 Pod 압력에 대응하여 클러스터의 가상 머신(노드)을 프로비저닝, 크기 조정 및 관리합니다. 노드 자동 프로비전은 다음 주요 구성 요소를 사용합니다.

  • NodePool 및 AKSNodeClass: 워크로드에 대한 노드 프로비전 정책, VM 사양 및 제약 조건을 정의하기 위해 만들고 관리하는 사용자 지정 리소스 정의입니다.
  • NodeClaims: 모니터링할 수 있는 프로비전된 노드의 현재 상태를 나타내기 위해 노드 자동 프로비전으로 관리됩니다.
  • 워크로드 리소스 요구 사항: 프로비전 결정을 내리는 Pod, 배포, 작업 및 기타 Kubernetes 리소스의 CPU, 메모리 및 기타 사양입니다.

Prerequisites

Prerequisite Notes
Azure 구독 Azure 구독이 없는 경우 무료 계정을 만들 수 있습니다.
Azure CLI 2.76.0 이상입니다. 버전을 확인하려면 az --version을 실행합니다. Azure CLI 설치 또는 업그레이드에 대한 자세한 내용은 Azure CLI 설치를 참조하세요.

Limitations

  • 노드 풀에 클러스터 자동 크기 조정기를 사용하도록 설정한 클러스터에서는 노드 자동 프로비전을 사용하도록 설정할 수 없습니다.

지원되지 않는 기능

  • Windows 노드 풀
  • IPv6 클러스터
  • 서비스 주체

    Note

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

  • CustomCATrustCertificates
  • 노드 자동 프로비전을 사용하는 클러스터는 중지할 수 없습니다.
  • HTTP 프록시
  • 모든 클러스터 송신 아웃바운드 형식 이 지원되지만 클러스터를 만든 후에는 형식을 변경할 수 없습니다.

Note

프라이빗 클러스터 및 디스크 암호화 집합은 이전에 지원되지 않는 것으로 나열된 NAP 지원 클러스터에서 지원됩니다. 자세한 내용은 2025-09-21 AKS 릴리스 정보를 참조하세요.

네트워킹 구성

다음 네트워크 구성은 노드 자동 프로비전을 사용하도록 설정한 클러스터에 권장됩니다.

자세한 네트워킹 구성 요구 사항 및 권장 사항은 노드 자동 프로비전 네트워킹 구성을 참조하세요.

주요 네트워킹 고려 사항:

  • Cilium을 사용하는 Azure CNI 오버레이를 사용하는 것이 좋습니다.
  • 표준 Load Balancer가 필요합니다.

노드 자동 프로비전 사용

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

노드 자동 프로비저닝은 필드 --node-provisioning-modeAuto로 설정하여 노드 프로비저닝 프로파일을 Auto로 설정함으로써 활성화됩니다. 이 필드의 기본 설정은 Manual입니다.

  • 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(으)로 설정합니다.

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

기본 NodePool 및 AKSNodeClass 예제

클러스터에서 노드 자동 프로비전을 사용하도록 설정한 후 기본 NodePool 및 AKSNodeClass를 만들어 노드 프로비전을 시작할 수 있습니다. 다음은 간단한 예제입니다.

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  template:
    metadata:
      labels:
        intent: apps
    spec:
      requirements:
        - key: karpenter.sh/capacity-type
          operator: In
          values: [spot, on-demand]
        - key: karpenter.azure.com/sku-family
          operator: In
          values: [D]
      expireAfter: Never
  limits:
    cpu: 100
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 0s
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: default
  annotations:
    kubernetes.io/description: "General purpose AKSNodeClass for running Ubuntu2204 nodes"
spec:
  imageFamily: Ubuntu2204

이 예제에서는 다음과 같은 기본 NodePool을 만듭니다.

  • 스폿 및 주문형 인스턴스를 모두 지원합니다.
  • D 시리즈 VM을 사용합니다.
  • CPU 제한을 100으로 설정합니다.
  • 노드가 비어 있거나 활용도가 낮은 경우 통합을 사용하도록 설정합니다.

사용자 지정 가상 네트워크 및 노드 자동 프로비전

AKS를 사용하면 --vnet-subnet-id 매개 변수를 통해 사용자 지정 가상 네트워크에서 노드 자동 프로비전을 사용하도록 설정된 클러스터를 추가할 수 있습니다. 다음 섹션에서는 다음 방법을 자세히 설명합니다.

  • 가상 네트워크 만들기
  • 가상 네트워크를 통해 권한이 있는 관리 ID 만들기
  • 사용자 지정 가상 네트워크에서 노드 자동 프로비전 사용 클러스터 만들기

가상 네트워크 만들기

az network vnet create 명령을 사용하여 가상 네트워크를 만듭니다. az network vnet subnet create 명령을 사용하여 클러스터 서브넷을 만듭니다.

노드 자동 프로비전이 포함된 사용자 지정 가상 네트워크를 사용하는 경우 API 서버 서브넷을 만들고 해당 서브넷에 API 서버 Pod 및 내부 부하 분산 장치를 삽입할 수 있는 AKS 서비스 권한을 부여하는 Microsoft.ContainerService/managedClusters에 위임해야 합니다. 다른 워크로드에는 서브넷을 사용할 수 없지만 동일한 가상 네트워크에 있는 여러 AKS 클러스터에 사용할 수 있습니다. 지원되는 최소 API 서버 서브넷 크기는 /28입니다.

az network vnet create --name ${VNET_NAME} \
--resource-group ${RG_NAME} \
--___location ${LOCATION} \
--address-prefixes 172.19.0.0/16

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name clusterSubnet \
--delegations Microsoft.ContainerService/managedClusters \
--address-prefixes 172.19.0.0/28

가상 네트워크 내의 모든 트래픽은 기본적으로 허용됩니다. 그러나 다른 서브넷 간의 트래픽을 제한하는 NSG(네트워크 보안 그룹) 규칙을 추가한 경우 적절한 권한은 네트워크 보안 그룹 설명서를 참조하세요.

관리 ID 만들기 및 가상 네트워크에 대한 권한 부여

az identity create 명령어를 사용하여 관리형 ID를 만들고 주체 ID를 검색합니다. 명령을 사용하여 가상 네트워크의 네트워크 기여자 역할을 관리 ID에 할당합니다 az role assignment create .

az identity create --resource-group ${RG_NAME} \
--name ${IDENTITY_NAME} \
--___location ${LOCATION}
IDENTITY_PRINCIPAL_ID=$(az identity show --resource-group ${RG_NAME} --name ${IDENTITY_NAME} \
--query principalId -o tsv)

az role assignment create --scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}" \
--role "Network Contributor" \
--assignee ${IDENTITY_PRINCIPAL_ID}

사용자 지정 가상 네트워크에서 노드 자동 프로비전이 사용하도록 설정된 AKS 클러스터 만들기

다음 명령에서 AKS(Azure Kubernetes Service) 클러스터는 az aks create 명령을 사용하여 사용자 지정 가상 네트워크의 일부로 만들어집니다. 고객 가상 네트워크를 만들려면

     	az aks create --name $(AZURE_CLUSTER_NAME) --resource-group $(AZURE_RESOURCE_GROUP) \
    		--enable-managed-identity --generate-ssh-keys -o none --network-dataplane cilium --network-plugin azure --network-plugin-mode overlay \
    		--vnet-subnet-id "/subscriptions/$(AZURE_SUBSCRIPTION_ID)/resourceGroups/$(AZURE_RESOURCE_GROUP)/providers/Microsoft.Network/virtualNetworks/$(CUSTOM_VNET_NAME)/subnets/$(CUSTOM_SUBNET_NAME)" \
    		--node-provisioning-mode Auto
az aks create --resource-group ${RG_NAME} \
--name ${CLUSTER_NAME} \
--___location ${LOCATION} \
--vnet-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/clusterSubnet" \
--assign-identity "/subscriptions/${SUBSCRIPTION_ID}/resourcegroups/${RG_NAME}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${IDENTITY_NAME}" \
--node-provisioning-mode Auto

몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

kubectl 명령을 사용하여 Kubernetes 클러스터에 연결하도록 을 구성합니다. 이 명령은 자격 증명을 다운로드하고 이를 사용하도록 Kubernetes CLI를 구성합니다.

az aks get-credentials --resource-group ${RG_NAME} --name ${CLUSTER_NAME}

kubectl get 명령을 사용하여 클러스터에 대한 연결을 확인합니다. 이 명령은 클러스터 노드 목록을 반환합니다.

kubectl get nodes

노드 풀

SKU 선택기, 제한 및 가중치를 포함한 자세한 노드 풀 구성은 노드 자동 프로비전 노드 풀 구성을 참조하세요.

노드 자동 프로비전은 VM SKU 요구 사항을 사용하여 보류 중인 워크로드에 가장 적합한 가상 머신을 결정합니다. 다음을 구성할 수 있습니다.

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

노드 중단

파괴적 제어

통합 또는 드리프트를 포함한 노드 중단은 다른 방법을 사용하여 제어할 수 있습니다.

Consolidation

노드의 워크로드가 축소되면 노드 자동 프로비전은 중단 규칙을 사용합니다. 이러한 규칙은 효율성을 높이기 위해 노드를 제거하고 워크로드를 다시 예약하는 시기와 방법을 결정합니다. 노드 자동 프로비전은 주로 통합을 사용하여 최적의 Pod 배치를 위해 노드를 삭제하거나 대체합니다. 상태 기반 고려 사항은 ConsolidationPolicy, WhenEmpty, 또는 WhenEmptyOrUnderUtilized을 사용하여 통합을 트리거합니다. consolidateAfter 는 작업 간의 버퍼 시간을 허용하도록 설정할 수 있는 시간 기반 조건입니다.

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

  disruption:
    # Describes which types of Nodes node autoprovisioning should consider for consolidation
    consolidationPolicy: WhenEmptyorUnderutilized
    # 'WhenEmptyorUnderutilized', node autoprovisioning will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is empty or underutilized and could be changed to reduce cost

    #  `WhenEmpty`, node autoprovisioning will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time node autoprovisioning 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 업그레이드

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

AKS에서는 클러스터의 모든 Kubernetes 업그레이드를 자동으로 처리하는 클러스터에 대한 Kubernetes 자동 업그레이드 채널과 노드 자동 프로비전을 결합할 것을 권장합니다. 자동 업그레이드 채널을 계획된 유지 관리 기간과 aksManagedAutoUpgradeSchedule 페어링하면 워크로드에 대한 최적의 시간 동안 클러스터 업그레이드를 예약할 수 있습니다. 클러스터 업그레이드 계획에 대한 자세한 내용은 계획된 유지 관리에 대한 설명서를 참조하세요.

노드 이미지 업데이트

기본적으로 노드 자동 프로비전 노드 풀 가상 머신은 새 이미지 버전을 사용할 수 있을 때 자동으로 업데이트됩니다.

업그레이드가 발생하는 시기를 조절하는 방법에는 여러 가지가 있습니다.

  • 클러스터에 새 이미지를 적용하는 시기를 제어하기 위해 aksManagedNodeOSUpgradeSchedule 유지 관리 기간을 구성합니다.
  • Karpenter 노드 중단 예산 및 Pod 중단 예산을 사용하여 업그레이드 중에 중단이 발생하는 방법과 시기를 제어합니다.

노드 OS 유지 관리 기간(NAP 지원)

NAP(노드 자동 프로비전)은 AKS 계획된 유지 관리 기능을 통해 설정된 노드 운영 체제의 유지 관리 창을 준수합니다. aksManagedNodeOSUpgradeSchedule 유지 관리 구성을 설정하여 NAP가 NAP 프로비저닝된 노드에 대한 새 이미지를 언제 수집할지 제어합니다.

주요 정보:

  • 유지 관리 구성은 aksManagedNodeOSUpgradeSchedule 노드 자동 프로비전이 새 이미지를 선택하는 기간을 결정합니다. 기존 노드가 중단되는 시기를 반드시 결정하지는 않습니다.
  • 업그레이드 메커니즘 및 의사 결정 기준은 NAP/Karpenter와 관련이 있으며 NAP의 드리프트 논리에 의해 평가됩니다. NAP는 Karpenter 노드 중단 예산 및 Pod 중단 예산을 존중합니다.
  • 이러한 NAP 업그레이드 결정은 클러스터NodeImage와 채널SecurityPatch과는 별개입니다. 그러나 aksManagedNodeOSUpgradeSchedule 유지 관리 구성에서도 그것들을 적용할 것입니다.
  • 신뢰할 수 있는 작업을 위해 4시간 이상의 유지 관리 기간을 사용합니다.
  • 유지 관리 구성이 없는 경우 AKS는 대체 일정을 사용하여 새 이미지를 선택할 수 있으며, 이로 인해 예기치 않은 시간에 이미지가 선택될 수 있습니다. 새 이미지 및 업그레이드의 예기치 않은 타이밍을 방지하기 위해 명시적 aksManagedNodeOSUpgradeSchedule 을 정의합니다.

Note

기존 노드 이미지 버전이 90일보다 오래된 경우 NAP에서 최신 이미지 버전을 강제로 선택해야 합니다. 이렇게 하면 기존 유지 관리 기간이 무시됩니다.

NAP 관리 노드에 권장되는 일정 패턴:

  • 주간 주기: 일상적인 노드 이미지 롤아웃에 권장됩니다(예: "매주 일요일").

노드 OS 유지 관리 일정 예제 만들기(JSON + Azure CLI)

  1. 매주 일요일 01:00 UTC부터 4시간 동안 유지 관리 기간으로 설정된 JSON 파일을 nodeosMaintenance.json 이름으로 만듭니다.
{
  "properties": {
    "maintenanceWindow": {
      "durationHours": 4,
      "schedule": {
        "weekly": {
          "intervalWeeks": 1,
          "dayOfWeek": "Sunday"
        }
      },
      "startDate": "2025-01-01",
      "startTime": "01:00",
      "utcOffset": "+00:00"
    }
  }
}
  1. 클러스터에 유지 관리 구성을 추가합니다.
az aks maintenanceconfiguration add --resource-group ${RG_NAME} --cluster-name ${CLUSTER_NAME} --name aksManagedNodeOSUpgradeSchedule --config-file ./nodeosMaintenance.json

업데이트, 보기, 나열 및 삭제:

az aks maintenanceconfiguration update --resource-group ${RG_NAME} --cluster-name ${CLUSTER_NAME} --name aksManagedNodeOSUpgradeSchedule --config-file ./nodeosMaintenance.json
az aks maintenanceconfiguration show --resource-group ${RG_NAME} --cluster-name ${CLUSTER_NAME} --name aksManagedNodeOSUpgradeSchedule
az aks maintenanceconfiguration list --resource-group ${RG_NAME} --cluster-name ${CLUSTER_NAME}
az aks maintenanceconfiguration delete --resource-group ${RG_NAME} --cluster-name ${CLUSTER_NAME} --name aksManagedNodeOSUpgradeSchedule

운영 고려 사항

  • AKS가 새 구성을 조정할 시간이 있는지 확인하기 위해 유지 관리 구성을 만들거나 업데이트하는 것과 예약된 시작 시간 사이에 30분 이상 허용합니다.

자세한 내용, 예제 및 고급 시나리오에 대해서는 계획된 유지 관리를 참조하여 AKS 클러스터의 유지 관리 기간을 예약하는 방법을 확인하십시오.

노드 자동 프로비저닝 메트릭

Prometheus 추가 기능에 대한 Azure Monitor 관리 서비스를 사용하여 노드 자동 프로비저닝의 로그 및 작업을 보려면 컨트롤 플레인 메트릭(미리 보기)을 사용하도록 설정할 수 있습니다.

선택 이벤트 모니터링

노드 자동 프로비저닝은 배포 및 예약 결정을 모니터링하는 데 사용할 수 있는 클러스터 이벤트를 생성합니다. Kubernetes 이벤트 스트림을 통해 이벤트를 볼 수 있습니다.

kubectl get events -A --field-selector source=karpenter -w

노드 자동 프로비전 해제

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

  • 기존 노드 자동 프로비전 관리 노드가 없습니다. 노드 자동 프로비전 관리 노드를 보려면 kubectl get nodes -l karpenter.sh/nodepool을(를) 사용합니다.
  • 모든 기존 karpenter.sh/NodePools의 spec.limits.cpu 필드가 0으로 설정됩니다.

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

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

Note

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

일부 Pod가 보류될 수 있으며 PDB(Pod 중단 예산)를 준수하지 않기에 2단계와 3단계를 건너뛰는 것은 권장되지 않습니다.

노드 자동 프로비전으로 관리되지 않는 노드에서는 kubectl delete node을(를) 실행하지 마세요.

  1. karpenter.azure.com/disable:NoSchedule 모든 karpenter.sh/NodePool taint를 추가합니다.

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

    이 작업을 수행하면 PDB(Pod 중단 예산) 및 중단 한도를 준수하여 노드 자동 프로비전 관리 노드의 워크로드를 NAP가 아닌 노드로 마이그레이션하는 프로세스가 시작됩니다. Pod는 적합할 경우 NAP가 아닌 노드로 마이그레이션됩니다. 고정 크기 용량이 충분하지 않은 경우 일부 노드 자동 프로비전 관리 노드가 그대로 유지됩니다.

  2. 기존 고정 크기 ManagedCluster AgentPools를 확장하거나 새 고정 크기 AgentPools를 만들어 노드 자동 프로비전 관리 노드의 부하를 처리합니다. 이러한 노드가 클러스터에 추가되면 노드 자동 프로비전 관리 노드가 비워지고 작업이 고정 크기 조정 노드로 마이그레이션됩니다.

  3. kubectl get nodes -l karpenter.sh/nodepool을(를) 사용하여 모든 노드 자동 프로비전 관리 노드가 삭제되었는지 확인합니다. 노드 자동 프로비전 관리 노드가 여전히 존재하는 경우 클러스터에 고정 크기 용량이 부족할 가능성이 높습니다. 나머지 워크로드를 마이그레이션할 수 있도록 노드를 더 추가합니다.

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

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