이 문서에서는 Karpenter를 사용하여 AKS(Azure Kubernetes Service)에서 NAP(노드 자동 프로비저닝)에 대한 Azure 관련 설정을 정의하도록 리소스를 구성하는 AKSNodeClass 방법을 설명합니다.
AKSNodeClass 를 사용하면 VM(가상 머신) 이미지, 운영 체제(OS) 디스크 크기, 노드당 최대 Pod 및 kubelet 구성과 같이 Karpenter가 프로비전하는 노드의 다양한 측면을 사용자 지정할 수 있습니다.
중요합니다
2025년 11월 30일부터 AKS(Azure Kubernetes Service)는 더 이상 Azure Linux 2.0에 대한 보안 업데이트를 지원하거나 제공하지 않습니다. Azure Linux 2.0 노드 이미지는 202512.06.0 릴리스에서 고정됩니다. 2026년 3월 31일부터 노드 이미지가 제거되며 노드 풀의 크기를 조정할 수 없습니다. 노드 풀을 지원되는 Kubernetes 버전으로 업그레이드하거나 osSku AzureLinux3으로 마이그레이션하여 지원되는 Azure Linux 버전으로 마이그레이션합니다. 자세한 내용은 AKS의 [사용 중지] Azure Linux 2.0 노드 풀을 참조하세요.
AKSNodeClass 리소스 개요
AKSNodeClass 리소스를 사용하면 NAP에 대한 Azure 관련 설정을 구성할 수 있습니다. 각 NodePool 리소스는 AKSNodeClass를 spec.template.spec.nodeClassRef 사용하여 참조해야 합니다. 서로 다른 노드 풀에서 공통 Azure 구성을 공유할 수 있도록 동일한 NodePools을(를) 가리키는 여러 AKSNodeClass을(를) 가질 수 있습니다.
이미지 패밀리 구성
imageFamily 필드는 AKSNodeClass를 통해 프로비전된 노드에 대한 기본 VM 이미지 및 부트스트래핑 논리를 결정합니다. 이미지 패밀리를 지정하지 않으면 기본값은 .입니다 Ubuntu2204. GPU는 호환되는 VM 크기의 두 이미지 패밀리에서 모두 지원됩니다.
지원되는 이미지 패밀리
-
Ubuntu: Ubuntu 22.04 LTS(장기 지원)는 AKS 노드에 대한 기본 Linux 배포입니다. -
AzureLinux: Azure Linux는 AKS 워크로드에 대한 Microsoft의 대체 Linux 배포판입니다. 자세한 내용은 Azure Linux 설명서를 참조하세요.
이미지 패밀리 구성 예제
다음 예제에서는 AKSNodeClass을(를) AzureLinux 이미지 패밀리를 사용하도록 구성합니다.
spec:
imageFamily: AzureLinux
VNet(가상 네트워크) 서브넷 구성
이 vnetSubnetID 필드는 노드 네트워크 인터페이스를 프로비전하는 데 사용해야 하는 Azure VNet 서브넷을 지정합니다. 이 필드는 선택적입니다. 서브넷을 지정하지 않으면 NAP는 Karpenter 설치 중에 구성된 기본 서브넷을 사용합니다. 자세한 내용은 NAP에 대한 서브넷 구성을 참조하세요.
서브넷 구성 예제
서브넷 ID는 다음 예제와 같이 전체 ARM(Azure Resource Manager) 형식이어야 합니다.
spec:
vnetSubnetID: "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Network/virtualNetworks/{vnet-name}/subnets/{subnet-name}"
OS 디스크 크기 구성
osDiskSizeGB 필드는 OS 디스크의 크기를 기가바이트 단위로 지정합니다. 기본값은 128GB이고 최소값은 30GB입니다.
다음과 같은 워크로드에는 더 큰 OS 디스크 크기를 고려합니다.
- 중요한 데이터를 로컬에 저장합니다.
- 컨테이너 이미지에 대한 추가 공간이 필요합니다.
- 디스크 I/O 요구 사항이 높습니다.
OS 디스크 크기 구성 예제
spec:
osDiskSizeGB: 256 # 256 GB OS disk
임시 OS 디스크 구성
NAP는 사용 가능한 경우 임시 OS 디스크를 자동으로 사용하며 요청된 디스크 크기에 적합합니다. 임시 OS 디스크는 관리 디스크에 비해 성능이 더욱 향상되고 비용이 저렴합니다.
임시 디스크 선택 조건
시스템은 다음 시나리오에서 임시 디스크를 자동으로 선택합니다.
- VM 인스턴스 유형은 임시 OS 디스크를 지원합니다.
- 임시 디스크 용량이 요청
osDiskSizeGB된 디스크 용량보다 크거나 같습니다. - VM에는 충분한 임시 스토리지 용량이 있습니다.
이러한 조건이 충족되지 않으면 시스템은 다시 관리 디스크를 사용합니다.
임시 디스크 유형 및 우선 순위 지정
Azure VM에는 다양한 유형의 임시 스토리지가 있을 수 있습니다. 시스템은 다음 우선 순위 순서를 사용합니다.
- NVMe 디스크(최고 성능)
- 캐시 디스크(균형 잡힌 성능)
- 리소스 디스크(기본 성능)
임시 디스크 구성 예제
다음 예제와 같이 노드 풀 요구 사항을 사용하여 노드에 충분한 임시 디스크 용량이 있는지 확인할 수 있습니다.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: ephemeral-disk-pool
spec:
template:
spec:
requirements:
- key: karpenter.azure.com/sku-storage-ephemeralos-maxsize
operator: Gt
values: ["128"] # Require ephemeral disk larger than 128 GB
nodeClassRef:
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
name: my-node-class
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
name: my-node-class
spec:
osDiskSizeGB: 128 # This will use ephemeral disk if available and large enough
이 구성을 사용하면 임시 디스크가 128GB보다 큰 VM 인스턴스 유형만 선택되어 지정된 OS 디스크 크기에 대한 임시 디스크 사용이 보장됩니다.
최대 Pod 구성
maxPods 필드는 노드에서 예약할 수 있는 최대 Pod 수를 지정합니다. 이 설정은 클러스터 밀도와 네트워크 구성 모두에 영향을 줍니다.
최소값 maxPods 은 10이고 최대값은 250입니다.
에 대한 기본 동작 maxPods
기본 동작 maxPods 은 네트워크 플러그 인 구성에 따라 달라집니다. 다음 표에서는 기본값을 요약합니다.
| 네트워크 플러그 인 구성 | 노드당 기본값 maxPods |
|---|---|
| 표준 네트워킹을 사용하는 Azure CNI(v1 또는 NodeSubnet) | 30 |
| 오버레이 네트워킹이 있는 Azure CNI | 250 |
| 없음(네트워크 플러그 인 없음) | 250 |
| 기타 구성 | 110(표준 Kubernetes 기본값) |
최대 Pod 구성 예제
spec:
maxPods: 50 # Allow up to 50 pods per node
Kubelet 구성
kubelet 섹션에서는 노드 동작에 영향을 주는 다양한 kubelet 매개 변수를 구성할 수 있습니다. 이러한 매개 변수는 일반적인 kubelet 인수이므로 Azure 공급자는 단순히 노드의 kubelet에 전달합니다.
중요합니다
kubelet 설정을 신중하게 구성하고 먼저 비프로덕션 환경의 변경 내용을 테스트합니다.
CPU 관리
다음 설정은 kubelet에 대한 CPU 관리 동작을 제어합니다.
spec:
kubelet:
cpuManagerPolicy: "static" # or "none"
cpuCFSQuota: true
cpuCFSQuotaPeriod: "100ms"
-
cpuManagerPolicy: kubelet에서 CPU 리소스를 할당하는 방법을 제어합니다. CPU 고정을 대기 시간에 민감한 워크로드에서 사용하려면"static"로 설정하십시오. -
cpuCFSQuota: CPU 제한을 지정하는 컨테이너에 대해 CPU 완전 공정 스케줄러(CFS) 할당량 적용을 사용하도록 설정합니다. -
cpuCFSQuotaPeriod: CPU CFS 할당량 기간을 설정합니다.
이미지 가비지 수집
다음 설정은 kubelet에 대한 이미지 가비지 수집 동작을 제어합니다.
spec:
kubelet:
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
이러한 설정은 kubelet이 컨테이너 이미지의 가비지 수집을 수행하는 시기를 제어합니다.
-
imageGCHighThresholdPercent: 이미지 가비지 수집을 트리거하는 디스크 사용 비율입니다. -
imageGCLowThresholdPercent: 가비지 수집 후의 대상 디스크 사용 비율입니다.
토폴로지 관리
다음 설정은 kubelet에 대한 토폴로지 관리자 정책을 제어합니다.
spec:
kubelet:
topologyManagerPolicy: "best-effort" # none, restricted, best-effort, single-numa-node
토폴로지 관리자는 CPU 및 디바이스(예: GPU) 리소스에서 대기 시간에 민감한 워크로드에 대한 리소스 할당을 조정하는 데 도움이 됩니다.
시스템 구성
다음 설정을 사용하면 kubelet에 대한 추가 시스템 매개 변수를 구성할 수 있습니다.
spec:
kubelet:
allowedUnsafeSysctls:
- "kernel.msg*"
- "net.ipv4.route.min_pmtu"
containerLogMaxSize: "50Mi"
containerLogMaxFiles: 5
podPidsLimit: 4096
-
allowedUnsafeSysctls: Pod에서 사용할 수 있는 허용된 안전하지 않은 sysctls 목록입니다. -
containerLogMaxSize: 회전 전 컨테이너 로그 파일의 최대 크기입니다. -
containerLogMaxFiles: 보존할 컨테이너 로그 파일의 최대 수입니다. -
podPidsLimit: 모든 Pod에서 허용되는 최대 프로세스 수입니다.
Azure 리소스 태그 구성
특정 AKSNodeClass 리소스를 사용하여 만든 모든 VM 인스턴스에 적용되는 Azure 리소스 태그를 지정할 수 있습니다. 태그는 비용 추적, 리소스 구성 및 규정 준수 요구 사항에 유용합니다.
태그 제한
- Azure 리소스 태그는 리소스당 50개의 태그로 제한됩니다.
- 태그 이름은 대/소문자를 구분하지 않지만 태그 값은 대/소문자를 구분합니다.
- Azure는 사용할 수 없는 일부 태그 이름을 예약합니다. 자세한 내용은 태그 지침 및 제한을 참조하세요.
예제 태그 구성
spec:
tags:
Environment: "production"
Team: "platform"
Application: "web-service"
CostCenter: "engineering"
포괄적인 AKSNodeClass 구성 예제
다음 예제에서는 이 문서에서 설명하는 모든 설정을 포함하는 포괄적인 AKSNodeClass 구성을 보여 줍니다.
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
nodeClassRef:
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
name: comprehensive-example
---
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
name: comprehensive-example
spec:
# Image family configuration
# Default: Ubuntu
# Valid values: Ubuntu, AzureLinux
imageFamily: Ubuntu
# FIPS compliant mode - allows support for FIPS-compliant node images
# Default: Disabled
# Valid values: FIPS, Disabled
fipsMode: Disabled
# Virtual network subnet configuration (optional)
# If not specified, uses the default --vnet-subnet-id from Karpenter installation
vnetSubnetID: "/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/my-vnet/subnets/my-subnet"
# OS disk size configuration
# Default: 128 GB
# Minimum: 30 GB
osDiskSizeGB: 128
# Maximum pods per node configuration
# Default behavior depends on network plugin:
# - Azure CNI with standard networking: 30 pods
# - Azure CNI with overlay networking: 250 pods
# - Other configurations: 110 pods
# Range: 10-250
maxPods: 30
# Azure resource tags (optional)
# Applied to all VM instances created with this AKSNodeClass
tags:
Environment: "production"
Team: "platform-team"
Application: "web-service"
CostCenter: "engineering"
# Kubelet configuration (optional)
# All fields are optional with sensible defaults
kubelet:
# CPU management policy
# Default: "none"
# Valid values: none, static
cpuManagerPolicy: "static"
# CPU CFS quota enforcement
# Default: true
cpuCFSQuota: true
# CPU CFS quota period
# Default: "100ms"
cpuCFSQuotaPeriod: "100ms"
# Image garbage collection thresholds
# imageGCHighThresholdPercent must be greater than imageGCLowThresholdPercent
# Range: 0-100
imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80
# Topology manager policy
# Default: "none"
# Valid values: none, restricted, best-effort, single-numa-node
topologyManagerPolicy: "best-effort"
# Allowed unsafe sysctls (optional)
# Comma-separated list of unsafe sysctls or patterns
allowedUnsafeSysctls:
- "kernel.msg*"
- "net.ipv4.route.min_pmtu"
# Container log configuration
# containerLogMaxSize default: "50Mi"
containerLogMaxSize: "50Mi"
# containerLogMaxFiles default: 5, minimum: 2
containerLogMaxFiles: 5
# Pod process limits
# Default: -1 (unlimited)
podPidsLimit: 4096
다음 단계
AKS의 노드 자동 프로비저닝에 대한 자세한 내용은 다음 문서를 참조하세요.