升級 Azure Kubernetes Service (AKS) 叢集

AKS 叢集生命週期的一部分涉及定期升級至最新的 Kubernetes 版本。 請務必套用最新的安全性版本和升級,以取得最新的功能。 本文說明如何檢查並套用升級至 AKS 叢集。

Kubernetes 版本升級

當您升級支援的 AKS 叢集時,您無法略過 Kubernetes 次要版本。 您必須依主要版本號碼循序執行所有升級。 例如,允許在 1.14.x ->1.15.x1.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 資源提供者作業

警告

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

檢查是否有可用的 AKS 叢集升級

注意

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

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

    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 不支援將叢集升級至較新的 Kubernetes 版本。

升級 AKS 叢集

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

  • 將新的緩衝區節點(或最大激增設定的節點數目)新增至執行指定 Kubernetes 版本的叢集。
  • 封鎖並清空 其中一個舊節點,以將執行中應用程式的中斷降到最低。 如果您使用最大激增,它會 在指定的緩衝區節點數目的同時,封鎖並清空 多個節點。
  • 對於長時間執行的 Pod,您可以設定節點清空逾時,以允許對 Pod 的收回和每個節點正常終止的自定義等候時間。 如果未指定,則預設值為 30 分鐘。
  • 當舊節點完全清空時,系統會重新製作映像以接收新版本,並成為要升級下列節點的緩衝區節點。
  • 您可以選擇性地設定在清空節點和繼續重新安裝映像並移至下一個節點之間等候的時間持續時間。 簡短的間隔可讓您完成其他工作,例如在升級程式期間從 Grafana 儀錶板檢查應用程式健康情況。 建議您儘可能縮短升級程序的時間範圍,盡可能接近 0 分鐘。 否則,較高的節點浸泡時間(預覽)會影響您發現問題前多久的時間。 最小浸泡時間值為0分鐘,最多30分鐘。 如果未指定,預設值為0分鐘。
  • 此程式會重複,直到叢集中的所有節點都升級為止。
  • 在程序結束時,會刪除最後一個緩衝區節點,維護現有的代理程序節點計數和區域平衡。

注意

如果未指定修補程式,叢集會自動升級至指定次要版本的最新 GA 修補程式。 例如,將設定 --kubernetes-version1.21 會導致叢集升級至 1.21.9

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

  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 叢集

自訂節點激增升級

重要

  • 節點激增需要針對每個升級作業所要求的最大激增計數的訂用帳戶配額。 例如,具有五個節點集區的叢集,每個節點計數為四個節點,總共有20個節點。 如果每個節點集區的激增值上限為50%,則需要10個節點的額外計算和IP配額(2個節點* 5個集區),才能完成升級。

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

  • 如果您使用 Azure CNI,請驗證子網中有可用的 IP,以 符合 Azure CNI 的 IP 需求。

AKS 預設會設定升級以激增一個額外的節點。 最大激增設定的預設值可讓 AKS 在現有應用程式的警戒線/清空之前建立額外的節點來取代舊版節點,以將工作負載中斷降到最低。 您可以自訂每個節點集區的最大激增值。 當您增加最大激增值時,升級程式會更快完成,而且您可能會在升級程式期間遇到中斷。

例如,最大激增值為 100% 可提供最快的升級程式,但也會導致節點集區中的所有節點同時清空。 您可能想要使用較高的值,例如用於測試環境。 針對生產節點集區,建議設定max_surge33%。

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 -n mynodepool -g MyResourceGroup --cluster-name MyManagedCluster --max-surge 33%
    
    # Update max surge for an existing node pool 
    az aks nodepool update -n mynodepool -g MyResourceGroup --cluster-name MyManagedCluster --max-surge 5
    

設定節點清空逾時值

有時候,您可能會在特定 Pod 上擁有長時間執行的工作負載,而且無法在運行時間期間重新排程至另一個節點,例如,必須完成執行的記憶體密集型具狀態工作負載。 在這些情況下,您可以設定 AKS 在升級工作流程中將採用的節點清空逾時。 如果未指定節點清空逾時值,則預設值為 30 分鐘。 如果清空逾時值經過且 Pod 仍在執行中,則會停止升級作業。 任何後續PUT作業都應該繼續停止升級。

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

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

設定節點浸泡時間值 (預覽)

若要允許在清空節點並繼續進行重新映像並移至下一個節點之間等候一段時間,您可以將浸泡時間設定為介於 0 到 30 分鐘之間的值。 如果未指定節點浸泡時間值,則預設值為 0 分鐘。

重要

AKS 預覽功能是以自助式、選擇方式提供。 預覽會提供「依目前」和「可用」,且會排除在服務等級協定和有限保固之外。 客戶支援會盡最大努力部分涵蓋 AKS 預覽。 因此,這些功能不適合用於生產環境。 如需詳細資訊,請參閱下列支援文章:

注意

若要使用節點浸泡持續時間(預覽),您必須安裝 aks-preview Azure CLI 延伸模組 0.5.173 版或更新版本。

  • 啟用 aks-preview Azure CLI。

    az extension add --name aks-preview   
    
  • 使用 az aks nodepool addaz aks nodepool updateaz aks nodepool upgrade 命令,為新的或現有的節點集區設定節點浸泡時間。

    # Set node soak time for a new node pool
    az aks nodepool add -n MyNodePool -g MyResourceGroup --cluster-name MyManagedCluster --node-soak-duration 10
    
    # Update node soak time for an existing node pool
    az aks nodepool update -n MyNodePool -g 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 -n MyNodePool -g 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 修補程式和升級指引