配置 AKSNodeClass 資源,以在 Azure Kubernetes 服務(AKS)中進行節點自動配置(NAP)。

本文說明如何在 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 年 10 月 31 日起,節點映像將被移除,且你將無法擴展你的節點池。 遷移到支援的 Azure Linux 版本時,可以升級你的節點池到 支援的 Kubernetes 版本,或遷移到 osSku AzureLinux3。 欲了解更多資訊,請參閱 退休GitHub議題 及 Azure 更新退休公告。 欲掌握最新公告與更新,請參考AKS發布說明。

AKSNodeClass 資源概觀

AKSNodeClass 資源允許您設定 NAP 的Azure專屬設定。 每個NodePool資源都必須使用AKSNodeClass參考spec.template.spec.nodeClassRef。 你可以有多個NodePools指向同一個AKSNodeClass,這樣你就能在不同節點集區間共享共同的 Azure 配置。

這很重要

更改現有 AKSNodeClass 的某項設定並不會重新配置運行中的節點。 NAP 會將先前組態所佈署的節點標記為已漂移並加以取代,而這會受限於參照NodePool資源上的中斷控制項。 tags欄位是唯一的例外,因為標記變更會套用在現有的 Azure 資源上,而不會取代該節點。 若要深入了解,請參閱漂移和中斷預算。 在你修改供生產工作負載使用的 AKSNodeClass 之前,先檢視這份指引。

映像系列設定

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 文件。
  • AzureContainerLinux:Azure Container Linux 支援 AKS 1.34 及更新版本。 使用第二代虛擬機,並明確啟用兩個可信啟動設定,即使你平時不需要:
    • 將 security.trustedLaunch.vtpm 設定為 true。
    • 將 security.trustedLaunch.secureBoot 設定為 true。
    • 如果你設定 osDiskSizeGB,請使用至少 60 的值。
    • 不要將這個映像家族與其映像不支援的設定搭配使用。 詳情請參閱 Azure Container Linux on AKS。
  • Windows2022: Windows Server 2022 目前為預覽版。 它需要 AMD64 架構,且不支援 Cilium 資料平面。 Windows2022 不支援 FIPS 或 Trusted Launch。 不要設定 linuxOSConfig、啟用 artifact 串流,或將 LocalDNS 設定為非 Disabled。
  • Windows2025: Windows Server 2025 目前處於預覽階段。 它需要 AMD64 架構,且不支援 Cilium 資料平面。 FIPS 是必需的,即使省略 fipsMode,仍會有效地啟用。 不要設定 linuxOSConfig、啟用 artifact 串流,或將 LocalDNS 設定為非 Disabled。

範例映像族組態

下列範例會設定 AKSNodeClass 以使用 AzureLinux 映像族群:

spec:
  imageFamily: AzureLinux

Azure Container Linux 設定

以下範例使用 Azure Container Linux,並設定了必要的可信啟動設定。 它省略 osDiskSizeGB,讓平台選擇支援的磁碟大小。

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: azure-container-linux
spec:
  imageFamily: AzureContainerLinux
  security:
    trustedLaunch:
      vtpm: true
      secureBoot: true

Windows OS 支援(預覽版)

注意

AKS 預覽功能以自助方式提供,並採選擇加入制。 預覽版本係依「現狀」及「可用情況」提供,且不適用於服務等級協定與有限保固。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

NAP 支援 Windows2022 與 Windows2025 圖片。

  • Windows2022: Windows Server 2022 目前為預覽版。 它需要 AMD64 架構,且不支援 Cilium 資料平面。 Windows2022 不支援 FIPS 或 Trusted Launch。 不要設定 linuxOSConfig、不要啟用 artifact 串流,或將 LocalDNS 設定為非 Disabled。
  • Windows2025: Windows Server 2025 目前處於預覽階段。 它需要 AMD64 架構,且不支援 Cilium 資料平面。 FIPS 是必需的,即使省略 fipsMode,實際上仍為啟用狀態。 不要設定 linuxOSConfig、啟用 artifact 串流,或將 LocalDNS 設定為非 Disabled。

Windows2022 設定

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: windows-2025
spec:
  imageFamily: Windows2025

Windows2025 設定

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: windows-2025
spec:
  imageFamily: Windows2025
  security:
    trustedLaunch:
      vtpm: true
      secureBoot: true

這很重要

Windows 映像系列是預覽功能。 使用選擇 kubernetes.io/arch: amd64 和 NodePool 的 Windows kubernetes.io/os: windows,並確保工作負載也選擇 Windows 節點。 詳情請參閱 「設定節點池以在 AKS 上進行節點自動佈建」。

符合 FIPS 標準的節點映像配置

您也可以啟用符合聯邦資訊處理標準(FIPS)的節點映像檔。 欲了解更多關於AKS中FIPS的資訊,請參閱 FIPS文件。

該 fipsMode 欄位預設為「停用」,並可設定以下選項:

  • FIPS - 選擇符合 FIPS 的節點映像
  • 停用 - 不使用符合 FIPS 標準的節點映像檔

以下範例將「AKSNodeClass」配置為選擇符合 FIPS 的節點映像,方法是將 fipsMode 設定為 FIPS:

spec:
  fipsMode: FIPS

實例層級公用 IP 設定

你可以透過設定 nodePublicIP.enabled 為 true,為每個 NAP 配置的節點指派一個公共 IPv4 位址。 你可以選擇性地指定 ipTags 或 prefixIDs。 用其中一種,不要兩者兼用。

使用帶有前綴的實例層級公有 IP

可選擇性地使用 prefixIDs 指定一個 IPv4 公用 IP 前綴。 前綴必須與叢集位於同一區域。 對於區域前綴,則限制對應的 NodePool 至相同的可用區。 你不能同時指定 ipTags 和 prefixIDs 兩個,只用一個。

叢集身份需要使用公共 IP 前綴(如指定)以及建立和管理節點公共 IP 資源的權限。 完整設定、網路安全及驗證指引,請參閱 使用節點公共 IP。

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: public-ip-nodes
spec:
  nodePublicIP:
    enabled: true
    # Optional. Specify at most one IPv4 public IP prefix resource ID.
    prefixIDs:
      - /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/publicIPPrefixes/<prefix-name>

使用實例層級的公用 IP,搭配 IP 標籤和網際網路路由偏好

以下範例說明如何使用帶有 IP 標籤的實例層級公共 IP:

apiVersion: karpenter.azure.com/v1beta1
kind: AKSNodeClass
metadata:
  name: public-ip-nodes
spec:
  nodePublicIP:
    enabled: true
    ipTags:
      - ipTagType: RoutingPreference
        tag: Internet
    # Optional. Specify at most one IPv4 public IP prefix resource ID.
    prefixIDs:
      - /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/publicIPPrefixes/<prefix-name>

成品串流

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"

更新現有 AKSNodeClass 的 LocalDNS 設定

此 localDNS 設定與其他 AKSNodeClass 設定一樣參與漂移偵測。 當你變更現有節點已經參考的 spec.localDNS 上的 AKSNodeClass 時,NAP 會透過標準的 Drift 機制套用該變更。 NAP 不會重新安裝現有節點的映像。

當您變更 LocalDNS 模式或覆寫時,會套用下列行為,例如將mode從Disabled變更為Required:

  • 新節點:在你更新 AKSNodeClass 後,NAP 配置的每個節點都使用新的 LocalDNS 設定。
  • 現有節點:NAP 會將現有的NodeClaim物件標記為已漂移,因為其記錄的組態已不再符合AKSNodeClass。 NAP 會啟動一個使用新 LocalDNS 配置的替代節點,然後將漂移節點設為不可排程、排空並移除。
  • 不重映像:在 AKS 管理的節點池啟用 LocalDNS 會重映像池中所有節點。 NAP 會改為取代該節點。 無論如何,受影響節點上的 pod 都會被驅逐並重新排程,所以要預備同樣的工作負載影響。

這很重要

設定 mode 為 Preferred 或 Disabled 同時也會更改已解析的 AKSNodeClass 設定,並使現有節點產生漂移。 區段內 localDNS 的任何變更,包括 vnetDNSOverrides 和 kubeDNSOverrides 值,都會導致節點替換。

開始更換時

一旦你套用更新後的AKSNodeClass,漂移評估和取代就會開始。 替換遵循標準的 NAP 中斷生命週期,因此速率與時間取決於你在參考 NodePool 的 AKSNodeClass 資源上設定的中斷控制。

NAP 如何協調取代作業

因 LocalDNS 變更引起的漂移遵循下表所述的標準 NAP 中斷控制項:

管理 對 LocalDNS 誘導替換的影響
中斷預算 (spec.disruption.budgets) 速率限制是 NAP 一次替換的節點數量。 如果你不定義預算,NAP 預設為一個 nodes: 10%預算,因此最多同時干擾節點池中 10% 的節點。
預算 schedule 與 duration 將更換限制於維護時段內。 將nodes: "0"設定在視窗外以防止取代。
Pod 中斷預算(PDB) 在節點排空期間套用。 NAP 會等待,而不是驅逐違反 PDB 規定的 Pod。
karpenter.sh/do-not-disrupt 註解 將具有註釋的 Pod 和節點排除在自願性中斷之外,包括漂移。
terminationGracePeriod 限制清空時間上限。 當期間屆滿時,此設定會繞過 PDB 和karpenter.sh/do-not-disrupt註釋。

更換既非完全串聯,也非完全並聯。 NAP 會在移除已漂移的節點前先配置替換容量,但它可以同時替換多個參考相同 AKSNodeClass 的節點,且上限為你的中斷預算設定。

Warning

如果你不為節點池定義中斷預算,也沒有為工作負載定義 Pod 中斷預算,那麼在繁忙的 AKSNodeClass 上變更 localDNS 時,可能會同時中斷多達 10% 的節點,而且沒有應用程式層級的保護,可能導致工作負載停機。 為關鍵工作負載定義 PDB,並在生產叢集上變更 localDNS 之前設定保守的中斷預算。

啟用 LocalDNS 時降低可用性風險

  1. 確認你的自訂 DNS 伺服器能從節點子網透過 UDP 和 TCP 的 53 埠同時回應查詢。 欲了解更多資訊,請參閱 啟用 LocalDNS 前驗證自訂 DNS。

  2. 為每個關鍵工作負載定義 pod 中斷預算。

  3. 請先在受影響的NodePool資源上設定保守的中斷預算,再變更AKSNodeClass如下列範例所示:

    apiVersion: karpenter.sh/v1
    kind: NodePool
    metadata:
      name: default
    spec:
      disruption:
        budgets:
        - nodes: "1"   # Replace one node at a time
    
  4. 請先將localDNS變更套用至非生產AKSNodeClass。 或者,建立一個已啟用 LocalDNS 的 AKSNodeClass,並將工作負載遷移到參考它的 NodePool。

  5. 透過列出節點宣告來監視取代進度。 當沒有 NodeClaim 回報 Drifted 狀態條件時,替換即告完成。

    # List node claims and watch replacements appear as drifted nodes are removed
    kubectl get nodeclaims
    
    # Inspect the status conditions on a specific node claim
    kubectl describe nodeclaim <nodeclaim-name>
    
  6. 確認替換節點上的 LocalDNS 是否啟用。 欲了解更多資訊,請參閱 「驗證 LocalDNS 操作」。

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

受管理的 GPU

欄位 gpu.mode 控制 GPU 驅動程式的安裝。 它接受 Driver 或 None ,並預設為 Driver。 例如,使用 NVIDIA GPU 運算子時,設定 None 為跳過驅動程式安裝。

要選擇使用管理式 NVIDIA GPU 體驗,請使用 mode: Driver 並設定 nvidia.managementMode: Managed。 Linux NVIDIA GPU 節點透過 AKS Machine API 配置模式支援管理型 GPU。 NVIDIA 預設的管理模式是 Unmanaged。

spec:
  gpu:
    mode: Driver
    nvidia:
      managementMode: Managed

欲了解完整的 NAP 管理 GPU 範例及驗證步驟,請參見 AKS 管理的 GPU 節點。

安全性設定

主機上的加密

以下欄位指定是否啟用已配置節點的主機層加密。 當你將此欄位設為 true時,NAP 只包含支援主機加密的實例選項。

spec:
  security:
    encryptionatHost: 
      # acceptable values: [true, false] default(or if not specified): false  
      false

欲了解更多關於主機加密的資訊,請參閱 《主機加密文件》。

客戶管理金鑰與磁碟加密設定組

NAP 支援使用客戶自控金鑰與磁碟加密集的叢集。 在叢集層級啟用這些選項。 它們沒有你需要設定的 AKSNodeClass 欄位。 確保您的叢集身份具備適當的基於角色的存取控制(RBAC):

  • 叢集身分識別擁有磁碟加密集的Reader存取權。
  • 磁碟加密設定資源具有金鑰保存庫 Crypto Service Encryption User Azure Key Vault 的存取權限。

關於叢集建立時啟用的客戶管理金鑰及磁碟加密組的資訊,請參閱 Customer-Managed 金鑰文件。

在 NAP 叢集中啟用可信啟動

啟用 節點自動配置(NAP) 的叢集可使用 AKSNodeClass CRD 的 spec.security.trustedLaunch 欄位來啟用可信啟動。 將 secureBoot 和 vTPM 欄位設為 true,以啟用任何與此 AKSNodeClass CRD 相關聯的新或現有 NAP 管理節點的可信啟動。

spec:
  security:
  # Enables trusted lunch
  # Valid values: true, false; defaults to false if not specified
     trustedLaunch:
       secureBoot: true
       vTPM: true   

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
  # vnetDNSOverrides and kubeDNSOverrides are both required, even when mode is Disabled
  # Each list must include the "." and "cluster.local" zones, and each zone must set all nine fields
  localDNS:
    mode: Disabled
    # vnetDNSOverrides apply to DNS traffic from pods with dnsPolicy:default and from kubelet
    vnetDNSOverrides:
      - zone: "."
        cacheDuration: "3600s"
        forwardDestination: VnetDNS   # the "." zone can't forward to ClusterCoreDNS in vnetDNSOverrides
        forwardPolicy: Sequential
        maxConcurrent: 1000
        protocol: PreferUDP
        queryLogging: Error
        serveStale: Immediate
        serveStaleDuration: "3600s"
      - zone: "cluster.local"
        cacheDuration: "3600s"
        forwardDestination: ClusterCoreDNS   # cluster.local can't forward to VnetDNS
        forwardPolicy: Sequential
        maxConcurrent: 1000
        protocol: ForceTCP
        queryLogging: Error
        serveStale: Immediate
        serveStaleDuration: "3600s"
    # kubeDNSOverrides apply to DNS traffic from pods with dnsPolicy:ClusterFirst
    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"

  # 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

  security:
  # Enables trusted lunch
  # Valid values: true, false; default(or if not specified): false  
     trustedLaunch:
      secureBoot: true
      vTPM: true
  # Encryption at host
     encryptionatHost: 
      # acceptable values: [true, false] default(or if not specified): false  
      false

後續步驟

如需 AKS 中節點自動布建的詳細資訊,請參閱下列文章: