本文說明如何在 Azure Kubernetes Service (AKS) 中使用 Karpenter,設定 AKSNodeClass 資源,以定義 Azure 特定的節點自動佈建(NAP)設定。
AKSNodeClass 允許您自定義 Karpenter 配置的節點的各個方面,例如虛擬機 (VM) 映像、操作系統 (OS) 磁盤大小、每個節點的最大 Pod 數以及 kubelet 配置。
這很重要
自2025 年 11 月 30 日起,Azure Kubernetes Service (AKS) 將不再支援或提供 Azure Linux 2.0 的安全更新。 Azure Linux 2.0 節點映像已凍結在 202512.06.0 發行版本。 自 2026 年 3 月 31 日起,節點映像將被移除,且你將無法擴展節點池。 遷移到支援的 Azure Linux 版本時,可以升級你的節點池到 支援的 Kubernetes 版本,或遷移到 osSku AzureLinux3。 欲了解更多資訊,請參閱 退休GitHub議題 及 Azure 更新退休公告。 欲掌握最新公告與更新,請參考AKS發布說明。
AKSNodeClass 資源概觀
AKSNodeClass 資源允許您設定 NAP 的Azure專屬設定。 每個NodePool資源都必須使用AKSNodeClass參考spec.template.spec.nodeClassRef。 你可以有多個NodePools指向同一個AKSNodeClass,這樣你就能在不同節點集區間共享共同的 Azure 配置。
映像系列設定
imageFamily 欄位會設定透過 AKSNodeClass 佈建之節點的預設 VM 映像檔和啟動程序邏輯。 如果你沒有指定映像家族,就會使用你 Kubernetes 版本的預設作業系統版本。 相容 VM 大小的兩個映像系列都支援 GPU。 欲了解更多關於各 Kubernetes 版本預設作業系統版本的資訊,請參閱 AKS 作業系統版本文件。
支援的映像系列
-
Ubuntu: Ubuntu 是 AKS 節點的預設 Linux 發行版。- 作業系統的預設值會根據你的 Kubernetes 版本而改變。 Ubuntu 22.04 是 Kubernetes 1.25 到 1.33 版本的預設版本。 Ubuntu 24.04 是 Kubernetes 1.34 及更新版本的預設版本。
-
AzureLinux:Azure Linux 是 Microsoft 針對 AKS 工作負載的替代 Linux 發行版。 欲了解更多資訊,請參閱 Azure Linux 文件。
範例映像族組態
下列範例會設定 AKSNodeClass 以使用 AzureLinux 映像族群:
spec:
imageFamily: AzureLinux
符合 FIPS 標準的節點映像配置
您也可以啟用符合聯邦資訊處理標準(FIPS)的節點映像檔。 欲了解更多關於AKS中FIPS的資訊,請參閱 FIPS文件。
該 fipsMode 欄位預設為「停用」,並可設定以下選項:
- FIPS - 選擇符合 FIPS 的節點映像
- 停用 - 不使用符合 FIPS 標準的節點映像檔
以下範例將「AKSNodeClass」配置為選擇符合 FIPS 的節點映像,方法是將 fipsMode 設定為 FIPS:
spec:
fipsMode: FIPS
成品串流
Artifact Streaming 允許你將容器映像從 Azure Container Registry(ACR)串流到 Azure Kubernetes Service (AKS)。 AKS 只會提取 Pod 初次啟動所需的層,縮短部署工作負載所需的時間。
Prerequisites
- Artifact Streaming 需要你在 AKS 叢集中整合 Premium Tier ACR。
- 必須在 ACR 中啟用 Artifact 串流。
請參閱 Artifact Streaming 文件,了解如何在 ACR 中啟用 Artifact Streaming。
在 NAP 叢集中啟用構件串流
啟用 節點自動配置(NAP )的叢集可利用 spec.artifactStreaming.enabledAKSNodeClass CRD 欄位啟用工件串流。 將此欄位設為 true 啟用任何與此 AKSNodeClass CRD 相關的新或現有 NAP 管理節點的工件串流。
apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
name: my-node-class
spec:
# Enables artifact streaming; To use this feature container images must also enable artifact streaming on ACR
# Valid values: true, false; defaults to false if not specified
artifactStreaming:
enabled:
true
注意
若要在 AKS NAP 管理節點使用 artifact streaming 功能,你也必須在 Azure Container Registry(ACR)啟用artifact streaming 功能。 如果你在 ACR 裡沒有設定這個選項,欄位就會預設為 false。
虛擬網路 (VNet) 子網路設定
vnetSubnetID欄位指定應使用哪Azure VNet 子網來配置節點網路介面。 此欄位為選擇性欄位。 如果您未指定子網,NAP 會使用 Karpenter 安裝期間設定的預設子網。 如需詳細資訊,請參閱 NAP 的子網路設定。
子網路設定範例
子網 ID 必須採用完整的 Azure Resource Manager(ARM)格式,如下範例所示:
spec:
vnetSubnetID: "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Network/virtualNetworks/{vnet-name}/subnets/{subnet-name}"
作業系統磁碟大小設定
osDiskSizeGB 欄位會以 GB 為單位指定作業系統磁碟的大小。 預設值為 128 GB,最小值為 30 GB。
針對下列工作負載,請考慮較大的作業系統磁碟大小:
- 將重要資料儲存在本機。
- 需要額外的空間來存放容器映像。
- 具有較高的磁碟 I/O 需求。
作業系統磁碟大小設定範例
spec:
osDiskSizeGB: 256 # 256 GB OS disk
暫時性 OS 磁碟設定
NAP 會在磁碟大小符合要求並可用時,自動使用 暫時性 OS 磁碟。 相較於受控磁碟,暫時性 OS 磁碟可提供更佳的效能和較低的成本。
暫時磁碟選取準則
系統會在下列案例中自動選擇暫時磁碟:
- VM 執行個體類型支援暫時性 OS 磁碟。
- 短暫磁碟容量大於或等於要求的
osDiskSizeGB。 - VM 具有足夠的暫時儲存體容量。
如果不符合這些條件,系統會回復為使用受控磁碟。
暫時磁碟類型和優先順序
Azure 虛擬機可以有不同類型的短暫儲存。 系統會使用下列優先順序:
- 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:
group: karpenter.azure.com
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
此設定確保只會選取暫時性磁碟大於 128 GB 的 VM 執行個體,進而保證指定作業系統磁碟大小的暫時性磁碟使用率。
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
LocalDNS 配置
LocalDNS 部署節點層級 DNS 代理,能在接近工作負載時解決 DNS 查詢,降低查詢延遲並提升在短暫 DNS 中斷時的韌性。 欲了解更多資訊,請參閱 LocalDNS 文件。 預設情況下,LocalDNS 會被設定為停用,並可設定為以下選項:
-
Disabled(預設) - 停用 LocalDNS 功能。 DNS 查詢不會在節點本地解決。 -
Preferred- AKS 會根據節點池的 Kubernetes 版本來管理啟用 LocalDNS 的功能。 組態一律會驗證並包含,但除非使用正確的 Kubernetes 版本,否則不會啟用 LocalDNS。 -
Required- 若所有前置條件皆符合,則在節點池中強制執行 LocalDNS。 如果不符合需求,部署就會失敗。
LocalDNS 設定範例
你可以自訂 LocalDNS 設定,例如 vnetDNSOverrides 和 kubeDNSOverrides。 欲了解更多支援外掛的細節,請參見 自訂 LocalDNS。
spec:
LocalDNS:
mode: Required
vnetDNSOverrides:
- zone: "."
cacheDuration: "3600s"
forwardDestination: VnetDNS
forwardPolicy: Sequential
maxConcurrent: 1000
protocol: PreferUDP
queryLogging: Error
serveStale: Immediate
serveStaleDuration: "3600s"
- zone: "cluster.local"
cacheDuration: "3600s"
forwardDestination: ClusterCoreDNS
forwardPolicy: Sequential
maxConcurrent: 1000
protocol: ForceTCP
queryLogging: Error
serveStale: Immediate
serveStaleDuration: "3600s"
kubeDNSOverrides:
- zone: "."
cacheDuration: "3600s"
forwardDestination: ClusterCoreDNS
forwardPolicy: Sequential
maxConcurrent: 1000
protocol: PreferUDP
queryLogging: Error
serveStale: Immediate
serveStaleDuration: "3600s"
- zone: "cluster.local"
cacheDuration: "3600s"
forwardDestination: ClusterCoreDNS
forwardPolicy: Sequential
maxConcurrent: 1000
protocol: ForceTCP
queryLogging: Error
serveStale: Immediate
serveStaleDuration: "3600s"
Kubelet 設定
kubelet 區段可讓您設定影響節點行為的各種 kubelet 參數。 這些參數是典型的 kubelet 參數,因此 Azure 提供者會直接將參數傳遞給節點上的 kubelet。
這很重要
仔細配置 kubelet 設置,並首先在非生產環境中測試任何更改。
CPU 管理
下列設定可控制 kubelet 的 CPU 管理行為:
spec:
kubelet:
cpuManagerPolicy: "static" # or "none"
cpuCFSQuota: true
cpuCFSQuotaPeriod: "100ms"
-
cpuManagerPolicy:控制 kubelet 如何配置 CPU 資源。 在對延遲敏感的工作負載中,設定為"static"以進行 CPU 關聯。 -
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 可使用的允許不安全 sysctl 清單。 -
containerLogMaxSize:輪替前容器日誌檔的大小上限。 -
containerLogMaxFiles:要保留的容器記錄檔數目上限。 -
podPidsLimit:任何網繭中允許的處理程序數目上限。
Linux 自訂 OS 組態設定
LinuxOSConfig 區段可讓您設定影響節點行為的各種 kubelet 參數。 這些參數是典型的自訂作業系統參數,因此 NAP 會直接將它們傳遞給節點上的 kubelet。
如需更多關於自訂 Linux 作業系統設定、預設值及考量的資訊,請參閱自訂節點設定參數參考。
這很重要
仔細配置 Linux 作業系統設定,並先在非生產環境中測試任何變更。
Linux 檔案處理權限限制設定
請使用以下設定來設定檔案系統的設定。
spec:
linuxOSConfig:
# Sysctl Settings
sysctls:
# File System Settings
fsFileMax: 2000000 # Range: 8192-12000500 Default: Max of available range
fsInotifyMaxUserWatches: 1000000 # Range: 781250-2097152 Default: 1048576
fsAioMaxNr: 1000000 # Range: 65536-6553500 Default: 65536
fsNrOpen: 1000000 # Range: 8192-20000500 Default: 1048576
Linux 插槽與網路調校設定
請使用以下設定來設定 TCP 和網路設定。
spec:
linuxOSConfig:
# Network Settings
netCoreSomaxconn: 65535 # Range: 4096-3240000 Default: 16384
netCoreNetdevMaxBacklog: 5000 # Range: 1000-3240000 Default: 1000
netCoreRmemMax: 134217728 # Range: 212992-134217728 Default: 1048576
netCoreOptmemMax: 102400 # Range: 20480-4194304 Default: 131072
netCoreWmemMax: 134217728 # Range: 212992-134217728 Default: 212992
netCoreRmemDefault: 212992 # Range: 212992-134217728
netCoreWmemDefault: 212992 # Range: 212992-134217728
netIPv4IPLocalPortRange: "1024 65535" # Format: "first last", first: 1024-60999, last: 32768-65535
# Neighbor Table GC Thresholds
netIPv4NeighDefaultGcThresh1: 1024 # Range: 128-80000 Default: 4096
netIPv4NeighDefaultGcThresh2: 2048 # Range: 512-80000 Default: 8192
netIPv4NeighDefaultGcThresh3: 4096 # Range: 1024-80000 Default: 16384
# Note: thresh1 <= thresh2 <= thresh3
# Connection Tracking
netNetfilterNfConntrackBuckets: 131072 # Range: 65536-524288 Default: dynamically calculated
netNetfilterNfConntrackMax: 262144 # Range: 131072-2097152 Default: dynamically calculated
Linux 工作者限制設定
請使用以下設定來設定核心設定。
spec:
linuxOSConfig:
# Kernel Settings
kernelThreadsMax: 100000 # Range: 20-513785 Default: Dynamically calculated
Linux 虛擬記憶體設定
請使用以下選項來調整 Linux 核心程序的虛擬記憶體子系統作業,並將髒資料寫入磁碟。
spec:
linuxOSConfig:
# Memory Management
vmMaxMapCount: 262144 # Range: 65530-262144 Default: Max of available range
vmVfsCachePressure: 100 # Range: 0-100 Default: 100
vmSwappiness: 60 # Range: 0-100 Default: 60
# Swap File Configuration
swapFileSize: "2Gi" # Default: (not set) | Pattern: quantity with units Note: Requires kubelet.failSwapOn: false
# Transparent Huge Pages
transparentHugePageEnabled: "madvise" # Values: [always, madvise, never] Default: always
transparentHugePageDefrag: "defer+madvise" # Values: [always, defer, defer+madvise, madvise, never] Default: madvise
GPU 設定
請使用以下欄位啟用自訂 GPU 驅動程式安裝,例如 NVIDIA GPU 操作員。
spec:
gpu:
mode:
# acceptable values: [driver, none] default(or if not specified): driver
# none skips gpu driver installation, driver has NAP manage the GPU driver installation
none
安全性設定
主機上的加密
以下欄位指定是否啟用已配置節點的主機層加密。 當你將此欄位設為 true時,NAP 只包含支援主機加密的實例選項。
spec:
security:
encryptionatHost:
# acceptable values: [true, false] default(or if not specified): false
false
欲了解更多關於主機加密的資訊,請參閱 《主機加密文件》。
客戶管理金鑰與磁碟加密設定組
NAP 支援使用客戶自控金鑰與磁碟加密集的叢集。 在叢集層級啟用這些選項。 它們沒有你需要設定的 AKSNodeClass 欄位。 確保您的叢集身份具備適當的基於角色的存取控制(RBAC):
- 叢集身分識別擁有磁碟加密集的
Reader存取權。 - 磁碟加密設定資源具有
金鑰保存庫 Crypto Service Encryption UserAzure Key Vault 的存取權限。
關於叢集建立時啟用的客戶管理金鑰及磁碟加密組的資訊,請參閱 Customer-Managed 金鑰文件。
Azure 資源標籤配置
你可以指定Azure資源標籤,適用於所有使用特定 AKSNodeClass 資源建立的虛擬實例。 標籤對於成本追蹤、資源管理以及合規需求非常有用。
標籤限制
- 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:
group: karpenter.azure.com
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, AzureContainerLinux
imageFamily: Ubuntu
# FIPS compliant mode - allows support for FIPS-compliant node images
# Default: Disabled
# Valid values: FIPS, Disabled
fipsMode: Disabled
# Artifact Streaming- allows use of artifact streaming feature; To use this feature container images must also enable artifact streaming on ACR
# Valid values: true, false; defaults to false if not specified
artifactStreaming:
enabled: true
# LocalDNS mode - allows use of LocalDNS feature
# Default: Disabled
# Valid values: Preferred, Required, Disabled
LocalDNS:
mode: Disabled
# additional details on vnetDNSOverrides and kubeDNSOverrides can be added here
# 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
# GPU driver installation (optional)
# Default: driver - NAP manages gpu driver installation
# none skips gpu driver installation
# Valid values: driver, none
gpu:
mode:
driver
# 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 中節點自動布建的詳細資訊,請參閱下列文章: