為 Azure Kubernetes Service(AKS)中的節點自動配置(NAP)配置節點池

本文說明如何在 Azure Kubernetes Service (AKS) 中配置節點自動配置(NAP)節點池,包括 SKU 選擇器、資源限制及優先權重。 它還提供了示例來幫助您入門。

AKS Automatic 預設包含 NAP。 對於 AKS Standard 叢集,必須先啟用 NAP 才能設定節點池。

NAP 如何選擇虛擬機作為節點池

NAP 會使用虛擬機器 (VM) SKU 需求來決定擱置工作負載的最佳 VM。 您可以設定:

  • SKU 系列和特定實例類型。
  • 資源限制和優先順序。
  • 現成與隨選執行個體。
  • 架構、GPU 及其他能力需求。

NodePool 資源對 NAP 建立的節點以及在這些節點上執行的 Pod 設定了條件約束。 當你啟用 NAP 並將預設節點池設定為 Auto時,它會建立 預設 NodePool 資源。 你可以修改這些節點池,或建立額外的節點池以符合你的工作負載需求。

NAP 如何評估與選擇節點池

設定 NodePools NAP 時,請記住下列注意事項:

  • NAP 至少需要一個 NodePool 才能運作。
  • NAP 會評估每一個已設定的 NodePool。
  • NAP 會跳過那些帶有 Pod 無法容錯的污點的 NodePools。
  • NAP 會對已佈建的節點套用啟動污點,但不要求 Pod 容錯。
  • NAP 搭配彼此互斥的 NodePools 時效果最佳,其需求彼此不重疊,因此每個 pod 只會符合一個集區。 多重 NodePools 配對時,NAP 會使用權重最高的那個。

檢閱預設節點集區組態

NAP 創建的默認 Karpenter NodePool 名稱為 default 的配置如下:

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
  template:
    spec:
      nodeClassRef:
        group: karpenter.azure.com
        kind: AKSNodeClass
        name: default
      expireAfter: Never
      # 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

NAP 也建立一個 system-surge 節點池,提供關鍵系統附加元件所需的 Linux AMD 64 容量。 當處於待處理狀態的 Pod 可容忍 CriticalAddonsOnly=true:NoSchedule 污點且符合該集區的需求時,NAP 可以從該集區佈建節點。 由池子建立的節點會有 kubernetes.azure.com/mode: system 標籤。

控制預設節點池

當你用 Azure CLI 建立啟用 NAP 的新 AKS 叢集時,請加入--node-provisioning-default-pools一個旗標來控制 AKS 是否建立預設的 NAP NodePools。 你也可以在啟用現有叢集的 NAP 時使用這個旗標 az aks update 。

旗 --node-provisioning-default-pools 標接受以下數值:

  • Auto (預設):建立兩個標準 NodePools 以供立即使用。
  • None:不會建立任何 NodePools。 您必須自行定義。

警告

變更從 Auto 到 None:如果您在現有叢集上將設定從 Auto 變更為 None,則預設的 NodePools 不會自動刪除。 在刪除之前,先定義關鍵系統附加元件的適當替換容量。 如果你不再需要,必須手動刪除預設 NodePools 。

節點集區組態選項

下列各節概述 NAP 中的各種設定選項 NodePools ,包括 已知標籤和 SKU 選取器、 節點集區限制和 節點集區加權。

知名標籤和 SKU 選擇器

Kubernetes 定義了知名的標籤 由 Azure 實作。 您可以在 API 的spec.requirements區段中NodePool定義這些標籤。 NAP 也支援 Azure 專屬標籤,方便更進階的排程。

下表列出你可以在 spec.requirements API 章節 NodePool 中使用的標籤,以定義節點的虛擬機特性:

Selector Description Example
karpenter.sh/capacity-type VM 配置類型 (Spot / 隨需) 付現
karpenter.azure.com/sku-family VM SKU 系列 D、F、L 等。
karpenter.azure.com/sku-series VM SKU 系列 Dpls_v6
karpenter.azure.com/sku-name 明確的 SKU 名稱 Standard_A1_v2
karpenter.azure.com/sku-version SKU版本(不帶“v”,可以使用1個) 1, 2
karpenter.azure.com/sku-cpu VM 中的 CPU 數目 16
karpenter.azure.com/sku-memory 虛擬機器中的記憶體 (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
kubernetes.azure.com/sku-cpu VM 中的 CPU 數目 16
kubernetes.azure.com/sku-memory 虛擬機器中的記憶體 (MiB) 131072
kubernetes.azure.com/cluster AKS 叢集名稱 my-cluster
kubernetes.azure.com/mode 節點池模式 [系統,使用者]
kubernetes.azure.com/priority 優先順序 [現成品,標準]
kubernetes.azure.com/os-sku 作業系統 SKU [Ubuntu, AzureLinux]
kubernetes.azure.com/fips_enabled 是否啟用了 FIPS True
topology.kubernetes.io/zone 可用區域 [UKSOUTH-1,UKSOUTH-2,UKSOUTH-3]
kubernetes.io/os 操作系統 Linux
kubernetes.io/arch CPU 架構(AMD64 或 ARM64) [amd64, arm64]

此表中的記憶體選擇值為 NAP 建立節點報告的 MiB 值。 在新增選擇器之前,先檢查節點上的標籤,確認叢集使用的值。

SKU 系列範例

karpenter.azure.com/sku-family選取器可讓您以特定虛擬機器系列為目標。

家庭 Description
D 系列 具有平衡 CPU 與記憶體比率的一般用途 VM
F系列 具有高 CPU 與記憶體比率的計算最佳化 VM
E系列 適用於記憶體密集型應用程式的記憶體最佳化虛擬機
L 系列 儲存體最佳化的高磁碟傳輸量 VM
N系列 適用於計算密集型工作負載的已啟用 GPU 的 VM

使用 SKU 系列的設定範例:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - D
  - F

GPU SKU 範例

若要使用 NAP 佈建 NVIDIA GPU 節點,請建立一個可選取支援 GPU 的 VM 大小的 NodePool。 以下範例允許 NAP 選擇 N 系列 NVIDIA GPU SKU:

requirements:
- key: karpenter.azure.com/sku-family
  operator: In
  values:
  - N
- key: karpenter.azure.com/sku-gpu-manufacturer
  operator: In
  values:
  - nvidia

如果您想要 AKS 在 NAP 佈建的 GPU 節點上安裝並管理 NVIDIA GPU 驅動程式、裝置外掛程式、資料中心 GPU 管理員(DCGM)計量匯出工具,以及 GPU 健康訊號,請在參考的 AKSNodeClass 中設定受控 GPU。 欲了解更多資訊,請參閱 建立 AKS 管理的 GPU 節點池。

SKU 名稱範例

karpenter.azure.com/sku-name選取器可讓您指定確切的 VM 執行個體類型。

requirements:
- key: karpenter.azure.com/sku-name
  operator: In
  values:
  - Standard_D4s_v3
  - Standard_F8s_v2

SKU 版本範例

karpenter.azure.com/sku-version選取器會以特定世代的 VM SKU 為目標。

requirements:
- key: karpenter.azure.com/sku-version
  operator: In
  values:
  - "3"  # v3 generation
  - "5"  # v5 generation

可用區域範例

topology.kubernetes.io/zone選取器可讓您指定節點的可用區域。

requirements:
- key: topology.kubernetes.io/zone
  operator: In
  values:
  - eastus-1
  - eastus-2

備註

要列出支援區域內可用性區的虛擬機大小,請使用 az vm list-skus 帶有 --location <region> --zone --output table 參數的指令。 確認你選擇的虛擬機大小是否支援需求中的 NodePool 區域。

架構範例

kubernetes.io/arch選取器可讓您指定節點的 CPU 架構。 NAP 同時支援 amd64 和 arm64 節點。

requirements:
- key: kubernetes.io/arch
  operator: In
  values:
  - amd64
  - arm64

作業系統範例

kubernetes.io/os選取器可讓您指定節點的作業系統。

requirements:
- key: kubernetes.io/os
  operator: In
  values:
  - linux

容量類型範例

karpenter.sh/capacity-type 選取器可讓您選擇是否使用現成或隨選執行個體。

備註

當同時指定現成和隨選執行個體時,NAP 會優先使用 現成執行個體。

requirements:
- key: karpenter.sh/capacity-type
  operator: In
  values:
  - spot
  - on-demand

節點集區限制

預設情況下,NAP 會嘗試在你可用的 Azure 配額內排程你的工作負載。 對於動態節點池,你可以在該池所配置的所有節點間指定聚合資源限制。 在下列範例中,cpu: "1000" 會將集區限制為 1,000 個 vCPU 核心,而 memory: 1000Gi 會將其限制為 1,000 GiB 的記憶體:

spec:
  # Resource limits constrain the total size of the node pool.
  # Limits prevent Node Auto Provisioning from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

節點集區權重

當你定義了多個節點池時,可以透過在節點池定義中定義相對權重來設定工作負載應該排程的優先順序。 欄位 weight 接受 1 到 100 的整數,值越高,節點池的優先權越高。 若省略 weight,其值實質上為 0。 例如:

spec:
  # 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

靜態節點池

靜態節點集區會維持在 replicas 欄位中指定的固定數量 NAP 佈建節點,無論 Pod 需求為何。 若要變更節點數,請明確調整 NodePool 的規模,例如使用 kubectl scale 搭配 nodepool static-node-pool --replicas=7。 可選 limits.nodes 值限制節點替換期間產生的明確擴展與臨時容量。 對於靜態節點集區,在 limits 底下,nodes 是唯一受支援的欄位;您無法設定 CPU 或記憶體限制。

apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: static-node-pool
spec:
  replicas: 5
  template:
    spec:
      requirements:
      - key: karpenter.azure.com/sku-name
        operator: In
        values:
          - Standard_D4s_v3
          - Standard_F8s_v2
      - key: topology.kubernetes.io/zone
        operator: In
        values:
          - eastus-1
          - eastus-2
          - eastus-3
  limits:
    nodes: 10

備註

對於靜態節點集區,在 limits 欄位中,你只能設定 nodes。 您無法設定資源限制或weight,且中斷合併不適用。 建立 NodePool後,你無法透過新增或移除 replicas 欄位來切換靜態和動態模式。

後續步驟

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