使用計劃維護來排程並控制 Azure Kubernetes Service 叢集的升級

本文將教你如何利用計畫維護來排程並控制 Azure Kubernetes Service (AKS) 中的叢集與節點映像升級。

維護會定期在您的 AKS 叢集上執行。 有兩種類型的維護作業:

您在 AKS 使用計劃性維護功能時,您可以透過您選擇的步調執行這兩種類型的維護,以最小化工作負載的影響。

附註

你可以使用計畫性維護來排程自動升級的時間,但啟用或停用計畫性維護並不代表自動升級會啟用或停用。

開始之前

  • 此文章假設您目前具有 AKS 叢集。 如果您沒有 AKS 叢集,請參閱建立 AKS 叢集。
  • 如果你用的是Azure CLI,請用 az upgrade 指令升級到最新版本。
  • 一個有效的 Azure 訂閱。 如果你沒有Azure訂閱,請在開始前建立一個free帳號。

  • 請用指令 az account set 設定你的訂閱上下文。 例如:

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • Terraform 本地安裝。 安裝說明請參見 Install Terraform。

考量

使用計劃性維護時適用以下考量:

  • AKS 保留針對緊急或重大非計劃性/回應式維護作業中斷原訂計畫性維護時段的權利。 這些維護作業甚至可以在您設定中定義的 notAllowedTime 或 notAllowedDates 期間內執行。
  • 只能盡可能承諾執行維護作業,而且不保證會在指定時段中進行。

排程計劃性維護的設定類型

有三個設定類型可用於排程計劃性維護:

  • default 是控制 AKS 版本的基本設定,涵蓋控制平面元件和系統附加元件升級。 由於 Azure 的安全部署措施,這些版本從最初出貨時間起可能需要長達兩週時間才能推送到所有區域。

    選擇 default,以最不具干擾性的方式排程這些更新。 您可以使用每週發行版本追蹤器依區域監視進行中的 AKS 發行狀態。

  • aksManagedAutoUpgradeSchedule 可控制何時執行指定自動升級通道所排程的叢集升級。 相較於 default 設定,您可以使用此設定來設定更精細的控制節奏和定期設定。 欲了解更多關於叢集自動升級的資訊,請參見自動升級一個 Azure Kubernetes Service 叢集。

  • aksManagedNodeOSUpgradeSchedule 可控制何時執行由節點作業系統自動升級通道排程的節點 OS 安全性修補程式。 相較於 default 設定,您可以使用此設定來設定更精細的控制節奏和定期設定。 如需節點 OS 自動升級通道的詳細資訊,請參閱 自動修補和更新 AKS 叢集節點映像。

我們建議所有叢集的 Kubernetes 版本升級場景都使用aksManagedAutoUpgradeSchedule,以及所有節點作業系統的安全修補場景都使用aksManagedNodeOSUpgradeSchedule。

default 選項僅適用於 AKS 每周版本。 如果你想控制 AKS 控制平面元件(例如 API Server、ETCD 等)和外掛(如 CoreDNS、Metrics Server 等)的升級排程,可以使用 default 這個工具。

這三種配置類型都可以共存。

建立維護時段

附註

當您使用自動升級時,若要確保適當的功能,請使用持續時間為 4 小時以上的維護時段。

附註

從 2023-05-01 API 版本起,請使用下表中的屬性來進行 default 設定。

從 2023-05-01 API 版本開始的 aksManagedAutoUpgradeSchedule 或 aksManagedNodeOSUpgradeSchedule 維護時段和 default 組態具有下列屬性:

名稱 描述 預設值
utcOffset 叢集維護時區。 +00:00
startDate 維護時段開始生效的日期。 建立時間的目前日期
startTime 根據 utcOffset 所決定的時區,開始維護的時間。 不適用
schedule 升級頻率。 有三種類型可供使用:Weekly、AbsoluteMonthly 和 RelativeMonthly。 不適用
intervalDays 維護執行的間隔天數。 僅適用於aksManagedNodeOSUpgradeSchedule。 不適用
intervalWeeks 維護執行的間隔以週為單位。 不適用
intervalMonths 維護執行的間隔以月為單位。 不適用
dayOfWeek 要開始維護的指定星期數。 不適用
durationHours 要執行的維護時間範圍的持續時間。 不適用
notAllowedDates 維護無法執行的日期範圍,由 start 和 end 子屬性決定。 只有在您使用設定檔案建立維護期間時才適用。 不適用

已棄用的屬性

附註

如果你建立 default 包含以下已棄用屬性的組態,它會自動遷移到前表中顯示的新屬性。

[已棄用] 維護時段具有 default 下列舊版屬性:

名稱 描述 預設值
timeInWeek 在 default 設定中,這個屬性包含定義維護時段的 day 和 hourSlots 值。 不適用
timeInWeek.day 在 default 設定中的要在星期幾執行維護。 不適用
timeInWeek.hourSlots 在 default 設定中在特定日期執行維護的時段清單 (以小時為單位)。 不適用
notAllowedTime 維護無法執行的日期範圍,由 start 和 end 子屬性決定。 此屬性只有在您使用設定檔案建立維護期間時才適用。 不適用

排程類型

支援四種排程類型:Daily、 WeeklyAbsoluteMonthlyRelativeMonthly和 。

下表顯示每種維護配置選項可用的類型:

排程類型 default aksManagedClusterAutoUpgradeSchedule aksManagedNodeOSUpgradeSchedule
每日 不支援 ❌ 支援 ✅ (2025 年 6 月之後) 支援 ✅
每週 支援 ✅ 支援 ✅ 支援 ✅
AbsoluteMonthly 不支援 ❌ 支援 ✅ 支援 ✅
RelativeMonthly 不支援 ❌ 支援 ✅ 支援 ✅

每個排程類型顯示的所有欄位都是必要的。

Daily 排程可能看起來會像「每隔三天」:

"schedule": {
    "daily": {
        "intervalDays": 3
    }
}

Weekly 排程可能看起來像「每兩周的星期五」:

"schedule": {
    "weekly": {
        "intervalWeeks": 2,
        "dayOfWeek": "Friday"
    }
}

AbsoluteMonthly 排程可能看起來會像「每三個月,在當月的第一天」:

"schedule": {
    "absoluteMonthly": {
        "intervalMonths": 3,
        "dayOfMonth": 1
    }
}

RelativeMonthly 排程可能看起來像「每隔兩個月,在最後一個星期一」:

"schedule": {
    "relativeMonthly": {
        "intervalMonths": 2,
        "dayOfWeek": "Monday",
        "weekIndex": "Last"
    }
}

weekIndex 的有效值包含 First、Second、Third、Fourth 和 Last。

建立 Terraform 設定檔

Terraform 設定檔定義了 Terraform 所建立和管理的基礎架構。

建立一個名為 main.tf 的檔案,並加入以下程式碼來定義 Terraform 版本並指定Azure提供者:

terraform {
 required_providers {
   azurerm = {
     source  = "hashicorp/azurerm"
     version = "~>4.0"
   }
   azapi = {
     source  = "azure/azapi"
     version = "~>2.0"
   }
 }
}
provider "azurerm" {
 features {}
}
provider "azapi" {}

建立資源群組

將以下程式碼加入 main.tf 以建立Azure資源群組。 更新 location and name 值以符合你的環境。

resource "azurerm_resource_group" "rg" {
 name     = "aks-maintenance-rg"
 location = "East US"
}

建立 AKS 叢集

加入以下程式碼 main.tf 以建立 AKS 叢集。 根據需要更新任何數值以符合你的環境。

resource "azurerm_kubernetes_cluster" "aks" {
 name                = "aks-maintenance-cluster"
 location            = azurerm_resource_group.rg.location
 resource_group_name = azurerm_resource_group.rg.name
 dns_prefix          = "aksmaintenance"
 default_node_pool {
   name       = "nodepool1"
   node_count = 1
   vm_size    = "Standard_DS2_v2"
 }
 identity {
   type = "SystemAssigned"
 }
}

新增維護期間設定

使用 指令 az aks maintenanceconfiguration add 為 AKS 叢集新增維護視窗設定。

第一個範例新增了一項新 default 組態,該組態將維護排定為在時區中 UTC 每週一凌晨 1:00 至凌晨 5:00 執行。 第二個範例新增 aksManagedAutoUpgradeSchedule 設定的命令,以排程在 UTC+5:30 時區的每隔三個星期五,午夜 12:00 到上午 8:00 之間執行一次維護。

# Add a new default configuration
az aks maintenanceconfiguration add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name default --schedule-type Weekly --day-of-week Monday --interval-weeks 1 --duration 4 --utc-offset +00:00 --start-time 01:00

# Add a new aksManagedAutoUpgradeSchedule configuration
az aks maintenanceconfiguration add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name aksManagedAutoUpgradeSchedule --schedule-type Weekly --day-of-week Friday --interval-weeks 3 --duration 8 --utc-offset +05:30 --start-time 00:00
  1. 在 Azure 入口網站,前往你的 AKS 叢集資源。

  2. 在服務選單中,在 設定中選擇 升級。

  3. 在 [升級] >[自動升級排程器] 下方,選取 [新增排程]。

    截圖,顯示在Azure入口新增排程的選項。

  4. 在 [新增維護排程] 窗格上,設定下列維護時段設定:

    • 重複:選取維護時段的頻率。 建議您選取 [每週]。
    • 頻率:選取維護時段排程在星期幾。 建議您選取 [星期日]。
    • 維護開始日期:選取維護時段的開始日期。
    • 維護開始時間:選取維護時段的開始時間。
    • UTC 時差:選取維護時段的 UTC 時差 預設值為 +00:00。

    截圖,顯示在Azure入口新增維護排程的窗格。

  5. 選取 [儲存]。

您可以使用 JSON 檔案以建立維護設定,而不是使用參數。 使用此方法時,可以透過指定 notAllowedDatesdefault、 aksManagedAutoUpgradeSchedule、 和 aksManagedNodeOSUpgradeSchedule 配置,避免在某個日期範圍內進行維護。

  1. 使用維護時段設定建立 JSON 檔案。

    下列範例會建立 default.json 檔案,將維護排程在 UTC 時區的每週二午夜 1:00 至 5:00。 從 2021-05-26 到 2021-05-30 也有一個例外,即使與維護時段重疊,也不允許進行維護。

    {
      "properties": {
        "maintenanceWindow": {
            "schedule": {
                "weekly": {
                    "intervalWeeks": 1,
                    "dayOfWeek": "Tuesday"
                }
            },
            "durationHours": 4,
            "utcOffset": "+00:00",
            "startTime": "01:00",
            "notAllowedDates": [
                {
                    "start": "2021-05-26",
                    "end": "2021-05-30"
                }
            ]
        }
      }
    }
    

    下列範例會建立一個 autoUpgradeWindow.json 檔案,其排程維護在 UTC-08 時區每三個月的第一天上午 9:00 至下午 1:00 之間執行。 從 2023-12-23 到 2024-01-05 也有一個例外,即使與維護時段重疊,也不允許進行維護。

    {
      "properties": {
        "maintenanceWindow": {
            "schedule": {
                "absoluteMonthly": {
                    "intervalMonths": 3,
                    "dayOfMonth": 1
                }
            },
            "durationHours": 4,
            "utcOffset": "-08:00",
            "startTime": "09:00",
            "notAllowedDates": [
                {
                    "start": "2023-12-23",
                    "end": "2024-01-05"
                }
            ]
        }
      }
    }
    
  2. 使用 az aks maintenanceconfiguration add 帶有 --config-file 參數的指令加入維護視窗設定。

    第一個範例會使用 default 檔案新增新的 default.json 設定。 第二個範例會使用 aksManagedAutoUpgradeSchedule 檔案新增新的 autoUpgradeWindow.json 設定。

    # Add a new default configuration
    az aks maintenanceconfiguration add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name default --config-file ./default.json
    
    # Add a new aksManagedAutoUpgradeSchedule configuration
    az aks maintenanceconfiguration add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name aksManagedAutoUpgradeSchedule --config-file ./autoUpgradeWindow.json
    

將維護視窗配置加入 main.tf,並使用 azapi_resource 資源。

預設維護配置

以下範例建立一個 default 維護配置,將維護排程安排在該時區每週六 UTC-04:00 凌晨2:00至6:00之間進行:

resource "azapi_resource" "default_maintenance" {
 type      = "Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2025-10-01"
 name      = "default"
 parent_id = azurerm_kubernetes_cluster.aks.id
 schema_validation_enabled = false
 body = {
   properties = {
     maintenanceWindow = {
       schedule = {
         weekly = {
           dayOfWeek     = "Saturday"
           intervalWeeks = 1
         }
       }
       durationHours = 4
       startTime     = "02:00"
       utcOffset     = "-04:00"
     }
   }
 }
}

自動升級維護設定

以下範例建立維護 aksManagedAutoUpgradeSchedule 配置,將維護排程安排為每週日凌晨1點至5點(時 UTC-04:00 區時間),自2026年4月20日起:

resource "azapi_resource" "auto_upgrade" {
 type      = "Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2025-10-01"
 name      = "aksManagedAutoUpgradeSchedule"
 parent_id = azurerm_kubernetes_cluster.aks.id
 schema_validation_enabled = false
 body = {
   properties = {
     maintenanceWindow = {
       startDate     = "2026-04-20"
       startTime     = "01:00"
       durationHours = 4
       utcOffset     = "-04:00"
       schedule = {
         weekly = {
           dayOfWeek     = "Sunday"
           intervalWeeks = 1
         }
       }
     }
   }
 }
}

Node OS 升級維護配置

以下範例建立維護 aksManagedNodeOSUpgradeSchedule 配置,將維護排程於每週一凌晨3點至7點(時 UTC-04:00 區)執行,時間自2026年4月21日起:

resource "azapi_resource" "node_os_upgrade" {
 type      = "Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2025-10-01"
 name      = "aksManagedNodeOSUpgradeSchedule"
 parent_id = azurerm_kubernetes_cluster.aks.id
 schema_validation_enabled = false
 body = {
   properties = {
     maintenanceWindow = {
       startDate     = "2026-04-21"
       startTime     = "03:00"
       durationHours = 4
       utcOffset     = "-04:00"
       schedule = {
         weekly = {
           dayOfWeek     = "Monday"
           intervalWeeks = 1
         }
       }
     }
   }
 }
}

更新現有維護時段

使用指令 az aks maintenanceconfiguration update 更新現有的維護設定。

下列範例會更新 default 組態,以排定每週五凌晨 2 點至 6 點的維護工作。

az aks maintenanceconfiguration update --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name default --schedule-type Weekly --day-of-week Friday --interval-weeks 1 --duration 4 --utc-offset +00:00 --start-time 02:00
  1. 在 Azure 入口網站中,導覽至 AKS 叢集資源。

  2. 在服務選單中,在 設定中選擇 升級。

  3. 在 [升級] >[自動升級排程器] 下方,選取 [編輯排程]。

    截圖,顯示在Azure入口中編輯排程的選項。

  4. 在 [編輯維護排程] 窗格上,視需要更新維護時段設定。

  5. 選取 [儲存]。

  1. 使用新的維護時段設定來更新設定 JSON 檔案。

    下列範例會更新default.json上一節中的檔案,將維護排程設定為每週一的凌晨 2:00 至凌晨 6:00 執行:

    {
      "properties": {
        "maintenanceWindow": {
            "schedule": {
                "weekly": {
                    "intervalWeeks": 1,
                    "dayOfWeek": "Monday"
                }
            },
            "durationHours": 4,
            "utcOffset": "+00:00",
            "startTime": "02:00",
            "notAllowedDates": [
                {
                    "start": "2021-05-26",
                    "end": "2021-05-30"
                }
            ]
        }
      }
    }
    
  2. 使用 az aks maintenanceconfiguration update 命令與 --config-file 參數更新維護時段組態:

    az aks maintenanceconfiguration update --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name default --config-file ./default.json
    

如果你已經有 Terraform 管理的 AKS 叢集,可以透過修改 Terraform 設定檔並用 terraform apply 指令套用變更來更新維護視窗的設定。

初始化 Terraform

在包含你 main.tf 檔案的目錄中,使用 terraform init 指令初始化 Terraform。 此命令會下載使用 Terraform 管理 Azure 資源所需的 Azure 提供者。

terraform init

建立 Terraform 執行計畫

使用 terraform plan 命令建立 Terraform 執行計畫。 這個指令會顯示 Terraform 會在你的 Azure 訂閱中建立或修改的資源。

terraform plan

套用 Terraform 組態

在確認執行計畫後,使用 terraform apply 指令套用 Terraform 設定。 此指令會建立或修改你Azure訂閱中 main.tf 檔案中定義的資源。

terraform apply

列出現有叢集中的所有維護時段

請使用以下 az aks maintenanceconfiguration list 指令列出 AKS 叢集中目前的維護設定視窗:

az aks maintenanceconfiguration list --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME

在現有叢集中顯示特定的維護設定時段

請使用帶有 az aks maintenanceconfiguration show 參數的 --name 指令在您的 AKS 叢集中查看特定的維護設定視窗:

az aks maintenanceconfiguration show --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name aksManagedAutoUpgradeSchedule

下列範例輸出顯示 aksManagedAutoUpgradeSchedule 的維護時段:

{
  "id": "/subscriptions/<subscription>/resourceGroups/myResourceGroup/providers/Microsoft.ContainerService/managedClusters/myAKSCluster/maintenanceConfigurations/aksManagedAutoUpgradeSchedule",
  "maintenanceWindow": {
    "durationHours": 4,
    "notAllowedDates": [
      {
        "end": "2024-01-05",
        "start": "2023-12-23"
      }
    ],
    "schedule": {
      "absoluteMonthly": {
        "dayOfMonth": 1,
        "intervalMonths": 3
      },
      "daily": null,
      "relativeMonthly": null,
      "weekly": null
    },
    "startDate": "2023-01-20",
    "startTime": "09:00",
    "utcOffset": "-08:00"
  },
  "name": "aksManagedAutoUpgradeSchedule",
  "notAllowedTime": null,
  "resourceGroup": "myResourceGroup",
  "systemData": null,
  "timeInWeek": null,
  "type": null
}

在現有叢集中刪除特定的維護設定時段

用指令 az aks maintenanceconfiguration delete 刪除 AKS 叢集中的維護設定視窗。

下列範例會刪除 autoUpgradeSchedule 維護設定:

az aks maintenanceconfiguration delete --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name autoUpgradeSchedule
  1. 在 Azure 入口網站中,導覽至 AKS 叢集資源。

  2. 從服務功能表中的 [設定] 底下,選取 [叢集設定]。

  3. 在 [升級] >[自動升級排程器] 下方,選取 [編輯排程]。

    截圖,顯示在Azure入口中編輯排程的選項。

  4. 在 [編輯維護排程] 窗格上,選取 [移除排程]。

    螢幕擷取畫面顯示在 Azure 入口網站中編輯維護時段的窗格,其中包含移除排程的按鈕。

用指令 az aks maintenanceconfiguration delete 刪除 AKS 叢集中的維護設定視窗。

下列範例會刪除 autoUpgradeSchedule 維護設定:

az aks maintenanceconfiguration delete --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name autoUpgradeSchedule

要刪除維護設定,請從 Terraform 設定中移除對應的區塊,並用指令 terraform apply 套用變更。

常見問題 (FAQ)

如何檢查叢集中的現有維護設定?

使用 az aks maintenanceconfiguration show (部分機器翻譯) 命令。

回應式非計劃性維護是否也會在 notAllowedDates 期間發生?

是。 AKS 保留針對緊急或重大非計劃性/回應式維護作業中斷原訂維護時段的權利。

如何判斷是否已發生維護事件?

針對版本,請檢查叢集的區域,並在每週發行版本中查閱版本資訊,並查看是否符合您的維護排程。 若要檢視自動升級的狀態,請查閱叢集上的活動記錄。 您還可以查閱升級 AKS 叢集中所述的特定升級相關事件。

AKS 也會發布與升級相關的 Azure 事件方格 事件。 若要深入了解,請參閱以 AKS 作為事件方格來源。

是否可以同時使用多個維護設定?

是,您可以同時執行這三個組態:default、aksManagedAutoUpgradeSchedule 和 aksManagedNodeOSUpgradeSchedule。 如時段重疊則由 AKS 決定執行順序。

我已設定維護期間,但升級未發生。 原因為何?

AKS 自動升級需要一定的時間,通常不超過 15 分鐘,才能考慮維護時段。 建議您在建立或更新維護組態與排程的開始時間之間至少間隔 15 分鐘。

此外,請確保您的叢集會在計劃性維護期間啟動時啟動。 如果停止叢集,會解除分配其控制平面,而且無法執行任何作業。

為什麼其中一個代理程式集區在維護期間外進行升級?

AKS 僅在配置的維護期間開始升級相關操作。 如果操作在視窗關閉前開始,即使超過視窗結束時間,也可以持續執行直到完成。

當窗口關閉時,AKS 不會啟動任何新的升級操作。 任何剩餘的升級作業將延後至未來的適當時機。

範例:如果維護期間為 08:00–12:00,而在 12:00 前開始的叢集或節點集區升級在 12:15 仍在進行中,AKS 會允許該進行中的工作完成。 不過,AKS在12:00後不會啟動新的升級工程。

維護設定是否有任何最佳做法?

如果您使用 通道,建議您將 NodeImage 排程為一週一次,因為每週都會發布新的節點映像。 您也可以加入 SecurityPatch 通道,以接收每日安全性更新。

你可以將 自動升級 排程設定為每月更新,以保持 Kubernetes N-2 支援政策的更新。

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

我可以在單一訂用帳戶中設定所有叢集,以使用相同的維護設定嗎?

不建議針對單一訂用帳戶中的多個叢集使用相同的維護設定,因為這樣做可能會導致 ARM 節流錯誤導致叢集升級失敗。 相反地,建議您交錯每個叢集的維護時段,以避免這些錯誤。

為什麼我的節點池在同一個維護期間被升級兩次?

若在維護期間新增新版本的節點映像檔,AKS 會進行第二次升級,以確保節點池運行最新版本。 這種行為很正常,並不代表有問題。

Azure 能否在底層 VMSS 上使用 AKS 的計畫性維護視窗來維護平台?

否。 AKS 計畫維護視窗專門用於排程及控制 Azure Kubernetes Service 中的 AKS 叢集與節點映像升級。 這不適用於裝載 AKS 節點集區之基礎 VMSS 的 Azure 平台層級維護。 它們獨立運作,彼此之間沒有直接依賴。

Azure 會定期進行平台更新,以提升虛擬機底層主機基礎設施的可靠性、效能與安全性。 這些更新可能包括修補軟體元件、升級網路基礎設施或硬體退役。 平台維護可以無需重啟,也可以需要重新啟動。 對於需要重新開機的維護事件,客戶會事先透過維護通知收到通知,其中包含通常最長可持續四週的 self‑service phase。

若要開始升級 AKS 叢集,請參閱升級 AKS 叢集選項。