共用方式為


在 Azure Kubernetes Service (AKS) 中調整節點集區

您可能想要變更虛擬機器 (VM) 的大小,以容納不斷增加的部署數量或執行更大的工作負載。 在 AKS 中使用 虛擬機器擴展集 時,不支援直接調整 AKS 執行個體的大小,如 AKS 的支援原則所述:

AKS 代理程式節點在 Azure 入口網站中會顯示為一般的 Azure IaaS 資源。 但這些虛擬機器會部署到自訂的 Azure 資源群組 (通常前面加上 MC_*)。 您無法使用 IaaS API 或資源直接自訂這些節點。 任何未透過 AKS API 完成的自訂變更都不會透過升級、調整、更新或重新開機來保存。

在本文中,您將瞭解調整節點集區大小的建議方法,方法是建立具有所需 SKU 大小的新節點集區、封鎖並清空現有的節點,然後移除現有的節點集區。

重要事項

此方法特定於 虛擬機器擴展集型 AKS 叢集。 使用虛擬機器型節點集區時,您可以使用單一 Azure CLI 命令輕鬆更新現有節點集區中的 VM 大小,並在相同的節點集區中擁有多個 VM 大小。 如需詳細資訊,請參閱 虛擬機器節點集區文件

使用所需的 SKU 建立新的節點集區

附註

每個 AKS 叢集必須包含至少一個系統節點集區,且當中至少要有一個節點。 在此範例中,我們使用 --mode of System 來新增系統節點集區,以取代我們想要調整大小的系統節點集區。 您可以隨時 更新節點集區的模式 。 您也可以透過設定 --modeUser來新增使用者節點集區。

重設大小時,請務必考慮所有工作負載需求 (例如可用性區域),並據以設定您的 VMSS 節點集區。 您可能需要修改下列命令以最符合您的需求。 如需組態選項的完整清單,請參閱 az aks nodepool add 參考頁面。

  1. 使用命令 az aks nodepool add 建立新的節點集區。 在此範例中,我們會建立新的節點集區 mynodepool,其中包含三個節點和 Standard_DS3_v2 VM SKU,以取代具有 nodepool1 VM 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
    

    建立新的節點集區需要幾分鐘的時間。

  2. 使用命令 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 新增至節點。

  1. 使用命令 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
    
  2. 使用指令 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 會被收回,並在其他可排程的節點上重新建立。

  1. 使用 kubectl drain 命令和 --ignore-daemonsets 旗標,以及 --delete-emptydir-data,清空現有節點,並在空格分隔的清單中指定所需的節點。 例如:

    重要事項

    需要使用 --delete-emptydir-data 來收回 AKS 建立的 corednsmetrics-server Pod。 如果您不使用此旗標,則會收到錯誤。 如需詳細資訊,請參閱下列 emptydir 上的文件

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. 清空作業完成後,所有 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-pdbkonnectivity-agent 的由 AKS 管理的 Pod 中斷預算 (例如 MinAvailable1)。 例如,如果有兩個 coredns Pod 正在執行,那麼一次只能中斷一個。 當其中一個 Pod 重新建立且無法使用時,另一個 coredns Pod 會因 Pod 中斷預算而無法被收回。 這個問題會在排程並執行初始 coredns Pod 之後自行解決,讓第二個 Pod 能夠正確收回並重新建立。

秘訣

請考慮逐一清空節點,以取得更順暢的收回體驗,並避免節流。 如需詳細資訊,請參閱

移除現有的節點集區

重要事項

當您刪除節點集區時,AKS 不會執行封鎖和清空。 針對目前正在您打算刪除之節點集區上執行且重新排程的 Pod,若要將中斷降到最低,請先在節點集區的所有節點上執行隔離和清空,然後再刪除。

  1. 使用命令 az aks nodepool delete 刪除原始節點集區。

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. 使用 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
    

後續步驟

透過封鎖和清空來調整節點集區的大小之後,請深入了解如何使用多個節點集區