節點自動佈建 (預覽版)
您將工作負載部署至 AKS 時,必須決定有關所需 VM 大小的節點集區設定。 由於您的工作負載變得更複雜,而且需要不同的 CPU、記憶體和功能才能執行,因此必須針對許多資源要求設計 VM 設定的額外負荷會變得困難。
節點自動佈建 (NAP) (預覽版) 會根據擱置的 Pod 資源需求來決定最佳 VM 設定,以最有效率且符合成本效益的方式執行這些工作負載。
NAP 是以開放原始碼 Karpenter 專案為基礎,而 AKS 提供者也是開放原始碼。 NAP 會自動在您的 AKS 叢集上部署、設定和管理 Karpenter。
重要
AKS 的節點自動佈建 (NAP) 目前為預覽狀態。 請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。
開始之前
- 您需要訂閱 Azure。 如果您沒有 Azure 訂閱,則可以建立免費帳戶。
- 您需要安裝 Azure CLI。
- 安裝
aks-preview
Azure CLI 延伸模組。 最小版本 0.5.170. - 註冊 NodeAutoProvisioningPreviewfeature 旗標。
安裝 aks-preview
CLI 延伸模組
使用
az extension add
命令安裝aks-preview
CLI 擴充功能。az extension add --name aks-preview
更新擴充功能,以確保您已使用
az extension update
命令安裝最新版本。az extension update --name aks-preview
註冊 NodeAutoProvisioningPreview
功能旗標
使用
az feature register
命令註冊NodeAutoProvisioningPreview
功能旗標。az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
狀態需要幾分鐘的時間才會顯示「已註冊」。
使用
az feature show
命令確認註冊狀態。az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
當狀態顯示為「已註冊」時,請使用
az provider register
命令,重新整理 Microsoft.ContainerService 資源提供者的註冊。az provider register --namespace Microsoft.ContainerService
限制
- 唯一允許的網路設定是由 Cilium 提供 (部分機器翻譯) 的 Azure CNI 重疊。
- 您無法在節點集區已啟用叢集自動調整程式的叢集中啟用
不支援的功能
- Windows 節點集區
- 將自訂設定套用至節點 kubelet
- IPv6 叢集
- 服務主體
注意
您可以使用系統指派或使用者指派的受控識別。
- 磁碟加密集
- CustomCATrustCertificates
- 啟動停止模式
- HTTP Proxy
- OutboundType 變動。 支援所有 OutboundType,但在建立後無法加以變更。
啟用節點自動佈建
在新叢集上啟用節點自動佈建
使用
az aks create
命令在新叢集上啟用節點自動佈建,並將--node-provisioning-mode
設定為Auto
。 您還須將--network-plugin
設定為azure
、將--network-plugin-mode
設定為overlay
,並將--network-dataplane
設定為cilium
。az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-provisioning-mode Auto \ --network-plugin azure \ --network-plugin-mode overlay \ --network-dataplane cilium \ --generate-ssh-keys
在現有叢集上啟用節點自動佈建
使用
az aks update
命令在現有叢集上啟用節點自動佈建,並將--node-provisioning-mode
設定為Auto
。 您還須將--network-plugin
設定為azure
、將--network-plugin-mode
設定為overlay
,並將--network-dataplane
設定為cilium
。az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --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