您可能想要變更虛擬機器 (VM) 的大小,以容納不斷增加的部署數量或執行更大的工作負載。 在 AKS 中使用 虛擬機器擴展集 時,不支援直接調整 AKS 執行個體的大小,如 AKS 的支援原則所述:
AKS 代理程式節點在 Azure 入口網站中會顯示為一般的 Azure IaaS 資源。 但這些虛擬機器會部署到自訂的 Azure 資源群組 (通常前面加上 MC_*)。 您無法使用 IaaS API 或資源直接自訂這些節點。 任何未透過 AKS API 完成的自訂變更都不會透過升級、調整、更新或重新開機來保存。
在本文中,您將瞭解調整節點集區大小的建議方法,方法是建立具有所需 SKU 大小的新節點集區、封鎖並清空現有的節點,然後移除現有的節點集區。
重要事項
此方法特定於 虛擬機器擴展集型 AKS 叢集。 使用虛擬機器型節點集區時,您可以使用單一 Azure CLI 命令輕鬆更新現有節點集區中的 VM 大小,並在相同的節點集區中擁有多個 VM 大小。 如需詳細資訊,請參閱 虛擬機器節點集區文件。
原地調整 VMSS 節點集區大小(預覽)
重要事項
AKS 預覽功能可透過自願加入的方式使用。 預覽內容係依「現狀」及「可用情況」提供,不適用於服務等級協議和有限保固。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:
你現在可以使用 az aks nodepool update --node-vm-size <new-size>,只需一個命令即可調整現有以 VMSS 為基礎的節點集區的 VM 大小 (SKU)。 當你觸發此更新時,AKS 資源提供者會透過以下方式進行滾動升級:
- 使用目標 VM 大小快速擴增新節點。
- 正在封鎖隔離並清空舊節點。
- 刪除舊的節點。
這樣可以避免本文後面描述的手動建立/封鎖/排水/刪除流程。
重新調整推出的大小如何運作
重新調整推出的大小會使用與節點映像升級和 Kubernetes 版本升級相同的滾動升級引擎,因此會遵循節點集區上已設定的下列升級相關設定。 尤其是,重新調整大小遵循:
-
最大突增 (
--max-surge):控制在部署期間新增多少具有目標 VM 大小的額外節點。 較高的值會更快調整池大小,但會消耗更多運算與 IP 配額;較低的數值較慢,但干擾較小。 AKS 預設為1,且33%建議用於生產節點池。 -
節點清空逾時 (
--drain-timeout):AKS 在強制刪除每個舊節點之前,會等待該節點上的 Pod 完成驅離多久。 預設值為 30 分鐘。 將此項目結合適當的 PodDisruptionBudgets ,所以工作負載得以安全清空。 -
節點浸入持續時間 (
--node-soak-duration):AKS 在新節點達到 Ready 狀態後,等待多久才進入下一批次。 這有助於讓工作負載先在新的 VM 規格上穩定運作,再繼續部署。
因為重新調整大小會重複使用升級管線,因此會套用相同的先決條件:請確保您的訂用帳戶具有足夠的目標 VM 大小替換容量,以及可供快速增加節點使用的子網路 IP 位址,且您的 PodDisruptionBudgets 允許每次至少逐出一個複本,否則重新調整大小可能會在清空過程中受阻。 關於端對端的建議,請參閱 AKS 節點池升級的最佳實務。
先決條件
- AKS API 版本
2026-01-02-preview或更新版本。 - aks-preview Azure CLI 延伸模組的最新版本。
調整節點池大小
使用 az aks nodepool update 帶有 --node-vm-size 參數的指令來更改現有基於 VMSS 的節點池的虛擬機大小:
az aks nodepool update \
--resource-group MyResourceGroup \
--cluster-name MyManagedCluster \
--name nodepool1 \
--node-vm-size Standard_D4s_v3
驗證與未支援組合
AKS 資源提供者會驗證重新大小請求,並阻擋不相容的虛擬機大小變更。 以下變更是不支援作為就地 VMSS 重新調整大小的一部分:
- 更改 磁碟控制器類型 (例如,從 SCSI 轉為 NVMe)。
- 改變 CPU 架構 (例如從 x64 改為 ARM64)。
- 變更 機密運算 支援(例如啟用或停用 SNP)。
- 變更 虛擬機監控程式世代(例如,從 V1 變更為 V2)。
- 將縮放與 Kubernetes 版本升級 或 節點數量 變更結合在同一操作中。
如果您的目標虛擬機規模需要上述任何變更,請改用以下章節所述的手動封鎖與排水工作流程。
附註
就地調整大小需要額外容量,才能先以目標 VM 大小佈建新節點,再清空舊節點。 如果節點集區已設定為 --max-surge 0(也就是說,--max-unavailable 生效),則調整大小要求會遭到拒絕,並傳回 400 Bad Request。 若要繼續,使用調整大小功能時,請將 --max-surge 設定為至少 1
az aks nodepool update \
--resource-group MyResourceGroup \
--cluster-name MyManagedCluster \
--name nodepool1 \
--node-vm-size Standard_D4s_v3 \
--max-surge 33%
並可選擇在調整大小完成後,還原原始的 --max-surge 和 --max-unavailable 值。
使用所需的 SKU 建立新的節點集區
附註
每個 AKS 叢集必須包含至少一個系統節點集區,且當中至少要有一個節點。 在此範例中,我們使用 --mode of System 來新增系統節點集區,以取代我們想要調整大小的系統節點集區。 您可以隨時 更新節點集區的模式 。 您也可以透過設定 --mode 為 User來新增使用者節點集區。
重設大小時,請務必考慮所有工作負載需求 (例如可用性區域),並據以設定您的 VMSS 節點集區。 您可能需要修改下列命令以最符合您的需求。 如需組態選項的完整清單,請參閱 az aks nodepool add 參考頁面。
使用命令
az aks nodepool add建立新的節點集區。 在此範例中,我們會建立新的節點集區mynodepool,其中包含三個節點和Standard_DS3_v2VM SKU,以取代具有nodepool1VM SKU 的現有節點集區Standard_DS2_v2。az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name mynodepool \ --node-count 3 \ --node-vm-size Standard_DS3_v2 \ --mode System \ --no-wait建立新的節點集區需要幾分鐘的時間。
使用命令
kubectl get nodes取得新節點集區的狀態。kubectl get nodes您的輸出應該類似下列範例輸出,同時顯示新的節點集區
mynodepool和現有的節點集區nodepool1:NAME STATUS ROLES AGE VERSION aks-mynodepool-98765432-vmss000000 Ready agent 23m v1.21.9 aks-mynodepool-98765432-vmss000001 Ready agent 23m v1.21.9 aks-mynodepool-98765432-vmss000002 Ready agent 23m v1.21.9 aks-nodepool1-12345678-vmss000000 Ready agent 10d v1.21.9 aks-nodepool1-12345678-vmss000001 Ready agent 10d v1.21.9 aks-nodepool1-12345678-vmss000002 Ready agent 10d v1.21.9
封鎖現有節點
封鎖將指定的節點標示為不可排程,並防止更多 Pod 新增至節點。
使用命令
kubectl get nodes取得您要封鎖的節點名稱。kubectl get nodes您的輸出應該類似下列範例輸出,顯示您要封鎖的現有節點集區
nodepool1中的節點:NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmss000000 Ready agent 7d21h v1.21.9 aks-nodepool1-12345678-vmss000001 Ready agent 7d21h v1.21.9 aks-nodepool1-12345678-vmss000002 Ready agent 7d21h v1.21.9使用指令
kubectl cordon封鎖現有節點,在空格分隔的清單中指定所需的節點。 例如:kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002您的輸出應該類似下列範例輸出,顯示節點已封鎖:
node/aks-nodepool1-12345678-vmss000000 cordoned node/aks-nodepool1-12345678-vmss000001 cordoned node/aks-nodepool1-12345678-vmss000002 cordoned
清空現有節點
重要事項
若要成功清空節點並收回執行 Pod,請確定任何 PodDisruptionBudgets (PDB) 至少允許一次移動一個 Pod 複本。 否則,清空/收回作業會失敗。 若要檢查此項目,您可以執行 kubectl get pdb -A 並確定 ALLOWED DISRUPTIONS 至少為 1 或以上。
當您清空節點時,在其上執行的 Pod 會被收回,並在其他可排程的節點上重新建立。
使用
kubectl drain命令和--ignore-daemonsets旗標,以及--delete-emptydir-data,清空現有節點,並在空格分隔的清單中指定所需的節點。 例如:重要事項
需要使用
--delete-emptydir-data來收回 AKS 建立的coredns和metrics-serverPod。 如果您不使用此旗標,則會收到錯誤。 如需詳細資訊,請參閱下列 emptydir 上的文件。kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data清空作業完成後,所有 Pod (不包括由常駐程式集控制的 Pod) 都應該在新的節點集區上執行。 您可以使用
kubectl get pods命令加以確認。kubectl get pods -o wide -A
針對 Pod 收回問題進行疑難排解
清空節點時,您可能會遇到下列錯誤:
Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.
根據預設,您的叢集具有 coredns-pdb 為 konnectivity-agent 的由 AKS 管理的 Pod 中斷預算 (例如 MinAvailable 或 1)。 例如,如果有兩個 coredns Pod 正在執行,那麼一次只能中斷一個。 當其中一個 Pod 重新建立且無法使用時,另一個 coredns Pod 會因 Pod 中斷預算而無法被收回。 這個問題會在排程並執行初始 coredns Pod 之後自行解決,讓第二個 Pod 能夠正確收回並重新建立。
移除現有的節點集區
重要事項
當您刪除節點集區時,AKS 不會執行封鎖和清空。 針對目前正在您打算刪除之節點集區上執行且重新排程的 Pod,若要將中斷降到最低,請先在節點集區的所有節點上執行隔離和清空,然後再刪除。
使用命令
az aks nodepool delete刪除原始節點集區。az aks nodepool delete \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name nodepool1使用
kubectl get nodes命令驗證您的 AKS 叢集是否只有新的節點集區,且應用程式和 Pod 是否正常運作。kubectl get nodes您的輸出應該類似下列範例輸出,只顯示新的節點集區
mynodepool:NAME STATUS ROLES AGE VERSION aks-mynodepool-98765432-vmss000000 Ready agent 63m v1.21.9 aks-mynodepool-98765432-vmss000001 Ready agent 63m v1.21.9 aks-mynodepool-98765432-vmss000002 Ready agent 63m v1.21.9
後續步驟
透過封鎖和清空來調整節點集區的大小之後,請深入了解如何使用多個節點集區。