共用方式為


升級 Azure Kubernetes Service (AKS) 叢集

AKS 叢集生命週期包含定期升級至最新 Kubernetes 版本。 請務必套用最新的安全性版本或升級,以取得最新功能。 本文說明如何檢查 AKS 叢集及為其套用升級。

Kube 版本升級

當您升級支援的 AKS 叢集時,無法跳過 Kube 次要版本。 您必須依主要版本號碼的順序執行所有升級。 舉例來說,1.14.x -> 1.15.x 或 1.15.x -> 1.16.x 之間的升級沒有問題, 但不允許 1.14.x -> 1.16.x 的升級。 只有在從「不支援版本」升級回到「支援版本」時,才能跳過多個版本。 舉例來說,您可以從不支援的 1.10.x 升級至支援的 1.12.x 的升級 (若可用)。

從略過兩個以上次要版本的「不支援版本」執行升級時,不具任何功能保證,而且不受服務等級協定和有限瑕疵擔保所保護。 如果您的版本明顯過舊,建議您重改為新建立叢集。

開始之前

  • 如果您使用 Azure CLI,本文會要求您使用 Azure CLI 2.34.1 以上版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI
  • 如果您使用 Azure PowerShell,本文會要求您執行 Azure PowerShell 5.9.0 以上版本。 執行 Get-InstalledModule -Name Az 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure PowerShell
  • 執行升級作業需要 Microsoft.ContainerService/managedClusters/agentPools/write RBAC 角色。 如需 Azure RBAC 角色的詳細資訊,請參閱 Azure 資源提供者作業 (機器翻譯)。
  • 從 1.30 kubernetes 版本和 1.27 LTS 版本開始,當您升級至它們時,Beta API 預設會停用。

警告

AKS 叢集升級會觸發隔離和清空節點。 如果您的可用計算配額較低,升級可能會失敗。 如需詳細資訊,請參閱增加配額

檢查可用的 AKS 叢集升級

注意

若要隨時掌握 AKS 修正程式、發行版本和更新的最新狀態,請參閱 AKS 發行版本追蹤器

  • 請使用 az aks get-upgrades 命令檢查您的叢集可用的 Kube 版本。

    az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster --output table
    

    下列範例輸出顯示目前的版本為 1.26.6,並在 upgrades 下列出可用的版本:

    {
      "agentPoolProfiles": null,
      "controlPlaneProfile": {
        "kubernetesVersion": "1.26.6",
        ...
        "upgrades": [
          {
            "isPreview": null,
            "kubernetesVersion": "1.27.1"
          },
          {
            "isPreview": null,
            "kubernetesVersion": "1.27.3"
          }
        ]
      },
      ...
    }
    

針對 AKS 叢集升級錯誤訊息進行疑難排解

下列範例輸出表示 appservice-kube 延伸模組與您的 Azure CLI 版本不相容 (至少需要 2.34.1 版):

The 'appservice-kube' extension is not compatible with this version of the CLI.
You have CLI core version 2.0.81 and this extension requires a min of 2.34.1.
Table output unavailable. Use the --query option to specify an appropriate query. Use --debug for more info.

如果您收到此輸出,則需要更新 Azure CLI 版本。 az upgrade 命令是在 2.11.0 版中新增,無法與 2.11.0 版之前的版本搭配運作。 您可以按照安裝 Azure CLI 一文所述的方式重新安裝 Azure CLI,以更新舊版。 如果您的 Azure CLI 版本是 2.11.0 或更新版本,請執行 az upgrade,以便將 Azure CLI 升級至最新版本。

如果您的 Azure CLI 已更新,且您收到下列範例輸出,則表示沒有可用的升級:

ERROR: Table output unavailable. Use the --query option to specify an appropriate query. Use --debug for more info.

如果沒有可用升級,請以支援的 Kubernetes 版本建立新叢集,並將工作負載從現有叢集移轉至新叢集。 az aks get-upgrades 顯示沒有可用升級時,AKS 不支援將叢集升級至較新的 Kube 版本。

升級 AKS 叢集

在叢集升級流程期間,AKS 會執行下列作業:

  • 將新的緩衝區節點 (或最大激增中設定的節點數量) 新增至執行指定 Kubernetes 版本的叢集。
  • 將執行中應用程式的中斷降到最低,並隔離和清空其中一個舊的節點。 若您正在使用最大激增,則會同時隔離和清空 (英文) 與指定緩衝節點相同數量的節點。
  • 對於長時間執行的 Pod,您可以設定節點清空逾時,藉此對 Pod 的收回以及每個節點的正常終止自訂等候時間。 如果未指定,則預設值是 30 分鐘。 允許的最小逾時值為 5 分鐘。 清空逾時的最大限制為24小時。
  • 舊節點完全清空時,系統會重新安裝映像以接收新版本,並成為即將升級之後續節點的緩衝區節點。
  • 您可以自行選擇是否要在清空節點與繼續重新安裝映像之間設定一段等候時間,然後再移至下一個節點。 簡短的間隔可讓您完成其他工作,例如在進行升級流程的期間透過 Grafana 儀表板檢查應用程式健康情況。 建議您採用較短的升級流程時間範圍,盡可能接近 0 分鐘, 因為較長的節點測試時間,會影響您發現問題的速度。 最小測試時間值為 0 分鐘,最大為 30 分鐘。 如果未指定,則預設值是 0 分鐘。
  • 此流程會不斷重複,直到叢集中所有節點都升級完畢。
  • 流程結束時,最後一個緩衝區節點會受到刪除,維持現有代理程式節點數量和區域平衡。

注意

如果未指定修補檔,叢集會自動升級至指定次要版本的最新 GA 修補檔。 例如,將 --kubernetes-version 設定為 1.28 會導致叢集升級至 1.28.9

如需詳細資訊,請參閱 AKS 中支援的 Kube 次要版本升級

  1. 使用 az aks upgrade 命令升級叢集。

    az aks upgrade \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --kubernetes-version <KUBERNETES_VERSION>
    
  2. 使用 az aks show 命令確認升級成功。

    az aks show --resource-group myResourceGroup --name myAKSCluster --output table
    

    以下範例輸出顯示叢集目前執行 1.27.3

    Name          Location    ResourceGroup    KubernetesVersion    ProvisioningState    Fqdn
    ------------  ----------  ---------------  -------------------  -------------------  ----------------------------------------------
    myAKSCluster  eastus      myResourceGroup  1.27.3               Succeeded            myakscluster-dns-379cbbb9.hcp.eastus.azmk8s.io
    

設定自動升級通道

您可以在叢集上設定自動升級通道。 如需詳細資訊,請參閱自動升級 AKS 叢集

自訂節點激增升級

重要

  • 節點激增需要訂閱配額,以供每個升級作業的要求最大激增數量。 例如,叢集有 5 個節點集區,每個集區有 4 個節點,總共 20 個節點。 如果每個節點集區的最大激增值為 50%,需有額外計算和 IP 配額 10 個節點 (2 個節點 * 5 個集區),才能完成升級。

  • 節點集區上的最大激增設定為持續性。 後續 Kubernetes 升級或節點版本升級會使用此設定。 您可以隨時變更節點集區的最大激增值。 針對生產節點集區,建議將 max-surge 設定為 33%。

  • 如果您使用 Azure CNI,也請驗證子網路中有可用 IP,以滿足 Azure CNI 的 IP 需求

AKS 預設會將升級設定為激增一個額外節點。 若最大激增設定的預設值為「1」,可讓 AKS 在隔離/清空現有應用程式前,建立額外節點來取代舊版節點,將工作負載中斷降至最低。 您可以自訂每個節點集區的最大激增值。 增加最大激增值後,升級流程會更快完成,但您可能會在升級流程期間遇到中斷情形。

例如,「100%」最大激增值可提供最快的升級流程,但也會導致節點集區中的所有節點同時清空。 建議您針對測試環境使用這類較高的值, 針對生產節點集區,則建議將 max_surge 設定為「33%」

AKS 的最大激增接受整數值和百分比值。 「5」之類的整數表示有五個額外節點要激增。 若值為「50%」,則表示激增值為集區中目前節點數量的一半。 最大激增百分比值最小可為「1%」,最大為「100%」。 百分比值會四捨五入到最接近的節點數量。 如果最大激增值高於要升級的必要節點數目,則會使用要升級的節點數目作為最大激增值。 升級期間,最大激增值最小可為「1」,最大則等於節點集區中的節點數量。 您可以設定較大的值,但不能將用於最大激增的節點數量上限,設為高於升級時集區中包含節點的數量。

設定最大激增值

  • 使用 az aks nodepool addaz aks nodepool update 命令,為新的或現有節點集區設定最大激增值。

    # Set max surge for a new node pool
    az aks nodepool add --name mynodepool --resource-group MyResourceGroup --cluster-name MyManagedCluster --max-surge 33%
    
    # Update max surge for an existing node pool 
    az aks nodepool update --name mynodepool --resource-group MyResourceGroup --cluster-name MyManagedCluster --max-surge 5
    

設定節點清空逾時值

有時候特定 Pod 上可能有長時間執行的工作負載,且在執行階段期間無法重新排程至另一個節點,例如必須結束執行的記憶體密集具狀態工作負載。 在這種情況下,您可以設定 AKS 在升級工作流程中會遵守的節點清空逾時。 如果您沒有指定節點清空逾時值,則預設值為 30 分鐘。 允許的清空逾時最小值為 5 分鐘,清空逾時上限為 24 小時。

如果清空逾時值過後 Pod 仍在執行中,升級作業就會停止。 所有後續 PUT 作業都應該繼續執行已停止的升級。 建議長時間執行的 Pod 設定 [terminationGracePeriodSeconds][https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/]。

  • 使用 az aks nodepool addaz aks nodepool update 命令,為新的或現有節點集區設定節點清空逾時。

    # Set drain timeout for a new node pool
    az aks nodepool add --name mynodepool --resource-group MyResourceGroup --cluster-name MyManagedCluster  --drain-timeout 100
    
    # Update drain timeout for an existing node pool
    az aks nodepool update --name mynodepool --resource-group MyResourceGroup --cluster-name MyManagedCluster --drain-timeout 45
    

設定節點測試時間值

若想讓清空節點與繼續重新安裝映像之間有一段等候時間,您可以將測試時間設定為 0 至 30 分鐘之間的值。 如果您沒有指定節點測試時間值,則預設值為 0 分鐘。

  • 使用 az aks nodepool addaz aks nodepool updateaz aks nodepool upgrade 命令,為新的或現有節點集區設定節點測試時間。

    # Set node soak time for a new node pool
    az aks nodepool add --name MyNodePool --resource-group MyResourceGroup --cluster-name MyManagedCluster --node-soak-duration 10
    
    # Update node soak time for an existing node pool
    az aks nodepool update --name MyNodePool --resource-group MyResourceGroup --cluster-name MyManagedCluster --max-surge 33% --node-soak-duration 5
    
    # Set node soak time when upgrading an existing node pool
    az aks nodepool upgrade --name MyNodePool --resource-group MyResourceGroup --cluster-name MyManagedCluster --max-surge 33% --node-soak-duration 20
    

檢視升級事件

  • 使用 kubectl get events 命令檢視升級事件。

    kubectl get events 
    

    以下範例輸出顯示升級期間列出的上述部分事件:

    ...
    default 2m1s Normal Drain node/aks-nodepool1-96663640-vmss000001 Draining node: [aks-nodepool1-96663640-vmss000001]
    ...
    default 1m45s Normal Upgrade node/aks-nodepool1-96663640-vmss000001   Soak duration 5m0s after draining node: aks-nodepool1-96663640-vmss000001
    ...
    default 9m22s Normal Surge node/aks-nodepool1-96663640-vmss000002 Created a surge node [aks-nodepool1-96663640-vmss000002 nodepool1] for agentpool nodepool1
    ...
    

下一步

若要了解如何設定自動升級,請參閱為 AKS 叢集設定自動升級 (機器翻譯)。

如需升級最佳做法和其他考量的詳細討論,請參閱 AKS 修補檔和升級指導 (機器翻譯)。