共用方式為


節點自動佈建 (預覽版)

您將工作負載部署至 AKS 時,必須決定有關所需 VM 大小的節點集區設定。 由於您的工作負載變得更複雜,而且需要不同的 CPU、記憶體和功能才能執行,因此必須針對許多資源要求設計 VM 設定的額外負荷會變得困難。

節點自動佈建 (NAP) (預覽版) 會根據擱置的 Pod 資源需求來決定最佳 VM 設定,以最有效率且符合成本效益的方式執行這些工作負載。

NAP 是以開放原始碼 Karpenter 專案為基礎,而 AKS 提供者也是開放原始碼。 NAP 會自動在您的 AKS 叢集上部署、設定和管理 Karpenter。

重要

AKS 的節點自動佈建 (NAP) 目前為預覽狀態。 請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

開始之前

安裝 aks-preview CLI 延伸模組

  1. 使用 az extension add 命令安裝 aks-preview CLI 延伸模組。

    az extension add --name aks-preview
    
  2. 更新擴充功能,以確保您已使用 az extension update 命令安裝最新版本。

    az extension update --name aks-preview
    

註冊 NodeAutoProvisioningPreview 功能旗標

  1. 使用 az feature register 命令註冊 NodeAutoProvisioningPreview 功能旗標。

    az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    

    狀態需要幾分鐘的時間才會顯示「已註冊」

  2. 使用 az feature show 命令確認註冊狀態。

    az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
    
  3. 當狀態顯示為「已註冊」時,請使用 az provider register 命令,重新整理 Microsoft.ContainerService 資源提供者的註冊。

    az provider register --namespace Microsoft.ContainerService
    

限制

  • 唯一允許的網路設定是 Cilium + Overlay + Azure
  • 您無法在節點集區已啟用叢集自動調整程式的叢集中啟用

不支援的功能:

  • Windows 節點集區
  • 將自定義組態套用至節點 kubelet
  • IPv6 叢集
  • 服務主體

    注意

    您可以使用系統指派或使用者指派的受控識別。

  • 磁碟加密集
  • CustomCATrustCertificates
  • 啟動停止模式
  • HTTP Proxy
  • OutboundType 突變。 支援所有 OutboundType,不過您無法在建立之後加以變更。

啟用節點自動佈建

若要啟用節點自動佈建,請使用 az aks create 命令建立新的叢集,並將 --node-provisioning-mode 設定為「Auto」。 您也需要使用重疊網路和 cilium 網路原則。

az aks create --name karpuktest --resource-group karpuk --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium

節點集區

節點自動佈建會使用 VM SKU 清單做為起點,以決定哪一個最適合處於擱置狀態的工作負載。 在初始集區中控制您想要的 SKU,可讓您指定特定的 SKU 系列或 VM 類型,以及佈建者使用的資源數量上限。

例如,如果您有保留執行個體的特定 VM SKU,您可能只想使用這些 VM 做為啟動集區。

您可以在叢集中有多個節點集區定義,但 AKS 會部署您可以修改的預設節點集區定義:

apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: default
spec:
  disruption:
    consolidationPolicy: WhenUnderutilized
    expireAfter: Never
  template:
    spec:
      nodeClassRef:
        name: default

      # 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

支援的節點佈建者需求

具有已知標籤的 SKU 選取器

選取器 描述 範例
karpenter.azure.com/sku-family VM SKU 系列 D、F、L 等
karpenter.azure.com/sku-name 明確 SKU 名稱 Standard_A1_v2
karpenter.azure.com/sku-version SKU 版本 (不含「v」,可以使用 1) 1、2
karpenter.sh/capacity-type VM 配置類型 (現成 / 隨選) 現成或隨選
karpenter.azure.com/sku-cpu VM 中的 CPU 數目 16
karpenter.azure.com/sku-memory VM 中的記憶體 (以 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 是否有加速網路 [true, false]
karpenter.azure.com/sku-storage-premium-capable VM 是否支援進階 IO 儲存體 [true, false]
karpenter.azure.com/sku-storage-ephemeralos-maxsize 暫時性 OS 磁碟大小限制 (以 Gb 為單位) 92
topology.kubernetes.io/zone 可用性區域 [uksouth-1,uksouth-2,uksouth-3]
kubernetes.io/os 作業系統 (僅限預覽期間的 Linux) linux
kubernetes.io/arch CPU 架構 (AMD64 或 ARM64) [amd64, arm64]

若要列出 VM SKU 功能和允許的值,請使用 Azure CLI 中的 vm list-skus 命令。

az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table

節點集區限制

根據預設,NAP 會嘗試在可用的 Azure 配額內排程您的工作負載。 您也可以指定節點集區所使用的資源上限,並在節點集區規格中指定限制。

  # Resource limits constrain the total size of the cluster.
  # Limits prevent Karpenter from creating new instances once the limit is exceeded.
  limits:
    cpu: "1000"
    memory: 1000Gi

節點集區加權

您定義多個節點集區時,可以設定應排程工作負載的喜好設定。 定義節點集區定義的相對加權。

  # 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

Kube 和節點映像更新

具有 NAP 的 AKS 預設會為您管理 Kube 版本升級和 VM OS 磁碟更新。

Kube 升級

NAP 節點集區的 Kube 升級遵循控制平面 Kube 版本。 如果您執行叢集升級,您的 NAP 節點會自動更新,以遵循相同的版本設定。

節點映像更新

有新的映像可用時,預設會自動更新 NAP 節點集區虛擬機器。 如果您想要在特定節點映像版本釘選節點集區,您可以在節點類別上設定 imageVersion:

kubectl edit aksnodeclass default

在節點類別定義中,將 imageVersion 設定為 AKS 版本資訊中列出的其中一個已發佈版本。 您也可以參考 AKS 版本追蹤器,查看區域中映像的可用性

imageVersion 是節點映像上的日期部分,因為僅支援 Ubuntu 22.04,例如「AKSUbuntu-2204-202311.07.0」會是「202311.07.0」

apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
  annotations:
    kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
      nodes
    meta.helm.sh/release-name: aks-managed-karpenter-overlay
    meta.helm.sh/release-namespace: kube-system
  creationTimestamp: "2023-11-16T23:59:06Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
    helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
    helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
  name: default
  resourceVersion: "1792"
  uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
  imageFamily: Ubuntu2204
  imageVersion: 202311.07.0
  osDiskSizeGB: 128

移除 imageVersion 規格會將節點集區還原為更新為最新的節點映像版本。

節點中斷

節點上的工作負載相應減少時,NAP 會使用節點集區規格上的中斷規則來決定何時及如何移除這些節點,並可能重新排程工作負載以更有效率。

您可以使用 kubectl delete node 手動移除節點,但 NAP 也可以控制節點何時應最佳化您的節點。

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

    #  `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
    
    # The amount of time NAP 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

監視選取事件

節點自動佈建會產生可用來監視部署和排程決策的叢集事件。 您可以透過 Kube 事件資料串流來檢視事件。

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