使用 Azure Kubernetes Service (AKS) 中的叢集自動調整程式

為了符合 AKS 中的應用程式需求,您可能需要調整執行工作負載的節點數目。 叢集自動調整程式元件可以監看叢集中由於資源限制而無法調度的 Pod。 當叢集自動調整程式偵測到問題時,它會相應增加節點集區中的節點數目,以符合應用程式需求。 它也會定期檢查未充分利用的節點,並在可安全重新排程工作負載且符合縮減條件時將其移除。

本文說明如何在以 開放原始碼 Kubernetes 版本為基礎的 AKS 中啟用和管理叢集自動調整程式。

開始之前

本文需要使用 Azure CLI 2.0.76 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。

啟用或停用某個叢集上的叢集自動擴縮工具

重要事項

叢集自動調整程式是一項 Kubernetes 元件。 雖然 AKS 叢集使用 虛擬機器擴展集 來管理節點,但請不要手動啟用或編輯縮放集自動縮放的設定。 請讓 Kubernetes 叢集自動調整程式管理所需的調整設定。 如需詳細資訊,請參閱我可以在節點資源群組中修改 AKS 資源嗎?

在新叢集上啟用叢集自動調整程式

  1. 使用 az group create 命令建立資源群組。

    az group create --name myResourceGroup --location eastus
    
  2. 使用 az aks create 命令建立 AKS 叢集,然後使用 --enable-cluster-autoscaler 參數,並指定節點 --min-count 和 --max-count,在叢集的節點集區上啟用和設定叢集自動調整程式。 以下範例指令建立一個叢集,包含一個由虛擬機縮放集(VM Scale Set)支援的單一節點,啟用叢集自動縮放器,並設定最少一個節點,最多三個節點:

    az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku standard \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --generate-ssh-keys
    

    建立叢集和設定叢集自動調整程式設定需要幾分鐘的時間。

在現有的叢集上啟用叢集自動調整程式

使用 az aks update 命令更新現有的叢集,並使用 --enable-cluster-autoscaler 參數在節點集區上啟用和設定叢集自動調整程式,並指定節點 --min-count 和 --max-count。 下列範例命令會更新現有的 AKS 叢集,以在叢集的節點集區上啟用叢集自動調整程式,並設定至少一個和最多三個節點:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3

更新叢集和設定叢集自動調整程式設定,需要幾分鐘的時間。

在叢集上停用叢集自動調整程式

使用 az aks update 命令和 --disable-cluster-autoscaler 參數來停用叢集自動調整程式。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --disable-cluster-autoscaler

當叢集自動調整程式停用時,不會移除節點。

附註

您可以使用 az aks scale 命令,在停用叢集自動調整程式之後,手動調整叢集。 如果您使用水平 Pod 自動調整程式,該功能會在停用叢集自動調整程式的情況下繼續執行,但如果所有節點資源皆在使用中,Pod 最後可能會無法排程。

在叢集上重新啟用叢集自動調整程式

若想要在現有叢集上重新啟用叢集自動調整程式,可以使用 az aks update 命令並指定 --enable-cluster-autoscaler、--min-count 與 --max-count 參數。

啟用或停用節點池的叢集自動調整器

在多個節點集區上使用叢集自動調整程式

您可以在多個節點集區上使用叢集自動調整程式,且能在各個節點集區上啟用叢集自動調整程式,還能將唯一的自動調整規則傳遞給每個節點集區。

使用 az aks nodepool update 命令更新現有節點集區上的設定。

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

在節點集區上停用叢集自動調整程式

使用 az aks nodepool update 命令和 --disable-cluster-autoscaler 參數在節點集區上停用叢集自動調整程式。

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --disable-cluster-autoscaler

在節點集區上重新啟用叢集自動調整程式

若想要在節點集區上重新啟用叢集自動調整程式,可以使用 az aks nodepool update 命令並指定 --enable-cluster-autoscaler、--min-count 與 --max-count 參數。

附註

如果您打算搭配跨多個區域的節點集區使用叢集自動調整程式,並利用與磁碟區拓撲排程等區域相關的排程功能,建議每個區域都有一個節點集區,並透過自動調整程式設定檔啟用 --balance-similar-node-groups。 這可確保自動調整程式可以成功相應增加,並讓節點集區的大小保持平衡。

更新叢集自動調整程式設定

隨著應用程式需求的變化,您可能需要調整叢集自動調整程式的節點計數來有效縮放。

使用 az aks update 命令變更節點計數,並使用 --update-cluster-autoscaler 參數及指定更新節點 --min-count 和 --max-count 更新叢集自動調整程式。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

附註

叢集自動調整程式會在實際計數因外部因素而低於最小值的情況下,強制執行最小計數,例如現成品收回期間或透過 AKS API 變更最小計數值時。

使用叢集自動調整程式設定檔

您可以變更整個叢集的自動調整程式設定檔的預設值,以此方式設定叢集自動調整程式的細部詳細資料。 例如,在節點使用率過低 10 分鐘後之後,就會發生縮小事件。 如果有每隔 15 分鐘執行一次的工作負載,建議您變更自動調整程式設定檔,以便在節點使用量過低 15 或 20 分鐘後將之縮小。 啟用叢集自動調整程式時,除非指定不同的設定,否則會使用預設設定檔。

重要事項

叢集自動調整程式設定檔會影響使用叢集自動調整程式的所有節點集區。 無法為每個節點集區設定一個自動調整程式設定檔。 您設定設定檔時,任何已啟用叢集自動調整程式的現有節點集區都會立即開始使用設定檔。

叢集自動調整程式設定檔設定

下表列出叢集自動調整程式設定檔的可用設定:

設定 描述 預設值
scan-interval 重新評估叢集以進行擴大或縮小的頻率。 10 秒
scale-down-delay-after-add 擴大後再繼續進行縮小評估的時間長度。 10 分鐘
scale-down-delay-after-delete 節點刪除後再繼續進行縮小評估的時間長度。 scan-interval
scale-down-delay-after-failure 縮小失敗後再繼續進行縮小評估的時間長度。 三分鐘
scale-down-unneeded-time 節點在符合縮小條件前,處於不需要狀態的時間長度。 10 分鐘
scale-down-unready-time 未就緒節點在符合縮小條件前,處於不需要狀態的時間長度。 20 分鐘
ignore-daemonsets-utilization 計算縮小的資源使用率時,是否忽略 DaemonSet Pod。 false
daemonset-eviction-for-empty-nodes DaemonSet Pod 是否會從空白節點正常終止。 false
daemonset-eviction-for-occupied-nodes DaemonSet Pod 是否會從非空白節點正常終止。 true
scale-down-utilization-threshold 將節點上所有 Pod 的 CPU 請求總和與記憶體請求總和相比取最大值,然後除以該節點對應的可分配資源,如果結果低於某一範圍即可考慮縮小規模。 0.5
max-graceful-termination-sec 嘗試縮小節點時,叢集自動調整程式等待 Pod 終止的秒數上限。 600 秒
balance-similar-node-groups 偵測相似的節點集區,並平衡其間的節點數目。 false
expander 要用於擴大的節點集區展開器類型。 可能的值包括:most-pods、random、least-waste 和 priority。 random
skip-nodes-with-local-storage 如果 true,叢集自動調整程式不會刪除具有本機儲存體 Pod 的節點,例如 EmptyDir 或 HostPath。 false
skip-nodes-with-system-pods 如果 true,叢集自動調整程式不會從 kube 系統刪除具有 Pod 的節點 (但 DaemonSet 或鏡像 Pod 除外)。 true
max-empty-bulk-delete 可以同時刪除的空白節點數目上限。 10 個節點
new-pod-scale-up-delay 針對在 Kubernetes 排程器可以排程所有 Pod 之前,不想讓 CA 採取行動的高載/批次調整案例,您可以在 Pod 達到特定存留期前,先告訴 CA 忽略未排程的 Pod。 0 秒
max-total-unready-percentage 叢集中未讀取節點的最大百分比。 超過此百分比之後,CA 會停止作業。 45%
max-node-provision-time 自動調整程式等候佈建節點的時間上限。 15 分鐘
ok-total-unready-count 不論 max-total-unready-percentage 是多少,都允許的未讀取節點數目。 三個節點

附註

ignore-daemonsets-utilization、daemonset-eviction-for-empty-nodes 和 daemonset-eviction-for-occupied-nodes 參數是從 API 2024-05-01 版正式推出。

在新叢集上設定叢集自動調整程式設定檔

使用 az aks create 命令建立 AKS 叢集,並使用 cluster-autoscaler-profile 參數設定叢集自動調整程式設定檔。

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --cluster-autoscaler-profile scan-interval=30s \
    --generate-ssh-keys

在現有叢集上設定叢集自動調整程式設定檔

使用 az aks update 命令和 cluster-autoscaler-profile 參數在現有叢集上設定叢集自動調整程式。 下列範例將掃描間隔設為 30 秒:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s

設定叢集自動調整程式設定檔以積極縮小

附註

針對在短間隔內頻繁擴增和縮減的叢集不建議積極縮小,因為這可能會導致在這些情況下延長節點佈建時間。 增加 scale-down-delay-after-add 可藉由讓節點保持在較長的時間來處理傳入工作負載,在這些情況中提供協助。

下列指令會設定積極的縮減設定檔。 它每 30 秒掃描叢集一次,節點新增後立即恢復縮減評估,失敗後一分鐘恢復縮減評估,三分鐘後允許不需要及未準備好的節點可縮減規模,優雅終止限制為 30 秒,允許最多 1,000 個空節點同時刪除,並將未準備好節點的限制提高至 100% 或 1,000 個節點。 它也明確保留預設行為,即不會跳過有本地儲存的節點,且最多需等待 15 分鐘才能配置節點。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s,scale-down-delay-after-add=0m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=3m,scale-down-unready-time=3m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=1000,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

針對突發性工作負載設定叢集自動調整程式設定檔

以下指令為突發工作負載配置一個設定檔。 它每 20 秒掃描叢集一次,新增節點後暫停縮減評估 10 分鐘以保留容量以應付突發,失敗後一分鐘恢復評估,五分鐘後允許不需要及未準備好的節點可縮減,優雅終止時間限制為 30 秒,允許同時刪除最多 100 個空節點, 並將未準備好節點的上限提高至 100% 或 1,000 個節點。 它也明確保留預設行為,即不會跳過有本地儲存的節點,且最多需等待 15 分鐘才能配置節點。

az aks update \
    --resource-group "myResourceGroup" \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=20s,scale-down-delay-after-add=10m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=5m,scale-down-unready-time=5m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=100,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

將叢集自動調整程式設定檔重設定為預設值

使用 az aks update 命令重新設定叢集自動調整程式設定檔。。

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile ""

在叢集自動擴展器中使用 ProvisioningRequest

ProvisioningRequest 是一個自訂資源,你可以用來為一組相關 pods 請求資源。 叢集自動擴縮器會將這些 Pod 視為一個整體。 根據你指定的配置類別,叢集自動縮放器可以保留現有資源給 pod,或是擴大叢集規模。

附註

  • ProvisioningRequest 支援需有運行 Kubernetes 1.33 或更新版本的 AKS 叢集。
  • 使用 ProvisioningRequest 時,請考慮使用較積極的縮容設定檔,以便快速移除因部分完成或未完成擴容而未使用的節點。
配置類別 描述
check-capacity.autoscaling.x-k8s.io 檢查叢集是否有足夠的資源可供指定的 Pod 使用。 如果資源可用,叢集自動擴縮器會為 ProvisioningRequest 保留這些資源 10 分鐘,以防止其他 ProvisioningRequests 取得相同的資源。
best-effort-atomic-scale-up.autoscaling.x-k8s.io 叢集自動擴展器會盡力在一次擴展操作中配置完整所需資源。 如果無法全部佈建,ProvisioningRequest會失敗,叢集自動調整程式會在退避一段時間後重試。

如需示範 Kueue 與叢集自動縮放程式及 ProvisioningRequest 整合的端對端範例,請參閱 在 AKS 上使用受控 Kueue 搭配叢集自動縮放程式。

取出叢集自動調整程式記錄和狀態

您可以從叢集自動調整程式擷取記錄和狀態更新,以幫助診斷和偵錯自動調整程式事件。 AKS 會代表您管理叢集自動調整程式,並在受控控制平面中執行。 要收集其控制平面日誌,請在 Azure 入口網站為 AKS 叢集建立 Azure 監視器 診斷設定,或使用 az monitor diagnostic-settings create,並啟用cluster-autoscaler日誌類別。

  1. 請設定一條資源日誌規則,將叢集自動擴展器的日誌推送到 Log Analytics,使用「配置 AKS 控制平面的資源日誌集合」指令。 請務必在選取 [記錄]cluster-autoscaler 選項時,勾選 的核取方塊。

  2. 選擇叢集上的 日誌 區塊。

  3. 如果你的診斷設定使用 Azure 診斷模式,請在 Log Analytics 輸入以下查詢:

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

    如果你的診斷設定使用資源專屬模式,請輸入以下查詢:

    AKSControlPlane
    | where Category == "cluster-autoscaler"
    
  4. 在 CLI 上檢視叢集自動調整程式未觸發擴增事件。

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. 檢視 CLI 上的叢集自動調整程式警告事件。

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. 叢集自動調整程式也會將健康狀態寫出至名為 configmap 的 cluster-autoscaler-status。 您可以使用以下 kubectl 指令取得此狀態:

    kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
    

如需詳細資訊,請參閱 Kubernetes/自動調整程式 GitHub 專案常見問題。

叢集自動調整程式指標

你可以用控制平面指標(預覽版)搭配 Prometheus 的 Azure 監視器 管理服務來收集叢集自動縮放器的指標。 controlplane-cluster-autoscaler抓取目標預設是關閉的,所以你必須啟用它才能收集這些指標。

可用的指標包括 cluster_autoscaler_unschedulable_pods_count 和 cluster_autoscaler_unneeded_nodes_count,顯示無法排程的 pod 數量及標記為移除候選節點的數量。 你也可以透過 cluster_autoscaler_cluster_safe_to_autoscale 監控叢集是否可安全地自動調整規模,以及透過 cluster_autoscaler_scale_down_in_cooldown 監控縮減是否處於冷卻期。

本文示範如何自動調整 AKS 節點數目。 您也可以使用水平 Pod 自動調整程式,自動調整執行應用程式的 Pod 數目。 如需使用水平 Pod 自動調整程式的步驟,請參閱調整 AKS 中的應用程式。

若要進一步協助改善叢集資源使用率,並釋放其他 Pod 的 CPU 和記憶體,請參閱垂直 Pod 自動調整程式。