使用 Azure Kubernetes 集群管理器,跨多个集群自动升级 Kubernetes 和节点映像

适用于:✔️机队经理✔️具有中心群集的机队经理

及时安全地使群集保持更新是平台管理员的关键问题。 采用 Azure Kubernetes Fleet Manager 的 更新运行和策略时,可以使用自动升级配置文件,在发布新的 Kubernetes 版本或节点映像版本时自动执行更新运行。

本文介绍如何使用自动升级配置文件,在 Azure Kubernetes 服务 (AKS) 发布新的 Kubernetes 版本或节点映像版本时,自动创建并执行更新运行。

注意

自动升级触发的更新进程遵循您在 AKS 群集级别设置的维护时段。 有关详细信息,请参阅 跨多个成员群集的计划内维护 ,了解如何在配置了计划维护时段的情况下,更新进程处理成员群集。

在您开始之前

  • 阅读 自动升级配置文件的概念性概述,其中介绍了本指南中引用的配置。
  • 使用一个或多个成员群集设置机群管理器。 如果没有,请按照 快速入门 创建机队管理器并加入 AKS 群集作为成员。
  • 配置更新策略。 请按照“更新运行”操作指南文章中的说明进行操作。 使用 Azure CLI 时,您需要更新策略资源标识符来与自动升级配置文件配合使用。
  • 设置以下环境变量以在 Azure CLI 命令中使用:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export AUTOUPGRADEPROFILE=<upgrade-profile-name>
    # Optional
    export STRATEGYID=<strategy-id>
    export CLUSTER=<aks-cluster-name>
    
  • 安装最新的Azure CLI版本。 若要安装或升级,请参阅安装 Azure CLI。

  • 安装最新的fleetAzure CLI扩展。 使用 az extension add 命令安装扩展。

    az extension add --name fleet
    

    使用 az extension update 命令将该扩展更新到最新版本。

    az extension update --name fleet
    
  • 安装和配置Terraform。

  • 安装最新的Azure CLI版本。 若要安装或升级,请参阅安装 Azure CLI。 您使用 Azure CLI 验证 Terraform 创建的自动升级配置文件。

  • 安装最新的fleetAzure CLI扩展。 使用 az extension add 命令安装扩展。

    az extension add --name fleet
    

    使用 az extension update 命令将该扩展更新到最新版本。

    az extension update --name fleet
    
  • 本文中使用的 Terraform 示例会创建自己的资源组和 Azure Kubernetes Fleet Manager,并且不会将任何 AKS 群集作为 Fleet 成员加入其中。 若要在实际更新运行中测试生成的自动升级配置,请在应用该示例后将现有 AKS 群集作为成员加入 Fleet。 有关详细信息,请参阅快速入门。

注意

根据所选的自动升级渠道和节点镜像选项,从节点池快照创建的代理池群集将受到以下影响:

  • 节点映像通道:节点映像升级到由 Fleet Manager 确定的版本。 从代理池中删除对快照(creationData)的引用。
  • 将节点映像设置为:稳定、快速或目标 Kubernetes 次要版本通道:
    • 一致的映像:节点映像升级到由 Fleet Manager 确定的版本。 从代理池中删除对快照(creationData)的引用。
    • 最新映像:代理池保留对快照(creationData)的引用,并且不会修改节点映像。

有关详细信息,请参阅 了解节点映像升级和快照。

创建自动更新配置文件

使用 az fleet autoupgradeprofile create 命令创建自动升级配置文件。

可以通过在 --disabled 命令中包括 az fleet autoupgradeprofile create 标志来禁用自动升级配置文件。 若要重新启用已禁用的自动升级配置文件,请在不使用 az fleet autoupgradeprofile create 标志的情况下重新运行 --disabled 命令。

注意

禁用自动升级配置文件不会影响任何正在进行中的更新任务。 但是,在重新启用该配置文件之前,此过程将停止生成新的更新运行记录。

Kubernetes 稳定通道更新

更新到次要版本 N-1 上支持的最新 Kubernetes 修补程序版本,其中 N 是最新支持的次要版本。

逐个更新成员群集

使用 az fleet autoupgradeprofile create 命令按顺序更新成员群集。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --channel Stable

使用现有更新策略更新成员群集

使用现有更新策略更新成员群集。 使用 az fleet autoupgradeprofile create 命令,并将 --update-strategy-id 参数设置为现有更新策略的 ID。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --update-strategy-id $STRATEGYID \
  --channel Stable

使用具有一致节点映像的现有更新策略更新成员群集

使用现有更新策略更新成员群集,并确保在每个Azure区域中使用相同的节点映像版本。 使用 az fleet autoupgradeprofile create 命令,并将 --node-image-selection 参数设置为 Consistent。 所有成员群集都运行相同的节点映像版本。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --update-strategy-id $STRATEGYID \
  --channel Stable \
  --node-image-selection Consistent

使用具有最新节点映像的现有更新策略更新成员群集

使用现有更新策略更新成员群集,并确保每个Azure区域使用最新的可用节点映像版本。 使用 az fleet autoupgradeprofile create 命令,并将 --node-image-selection 参数设置为 Latest。 成员群集可以运行多个节点映像版本。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --update-strategy-id $STRATEGYID \
  --channel Stable \
  --node-image-selection Latest

节点图像通道更新

使用新修补的计算机映像更新节点,其中包括安全修复和 bug 修复。

逐个更新节点映像

使用 az fleet autoupgradeprofile create 命令按顺序更新成员集群的节点映像。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --channel NodeImage

使用现有更新策略更新节点映像

使用现有更新策略更新成员群集的节点映像。 使用 az fleet autoupgradeprofile create 命令,并将 --update-strategy-id 参数设置为现有更新策略的 ID。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --update-strategy-id $STRATEGYID \
  --channel NodeImage 

目标 Kubernetes 次要版本更新

使用 --target-kubernetes-version 参数更新到定义的目标 Kubernetes 次要版本。 请以 {主版本号}.{次版本号} 格式提供版本号(例如,1.33)。 当修补程序可用时,Fleet Manager 自动升级会自动将成员群集升级到指定目标版本的最新修补程序版本。

重要

使用目标 Kubernetes 次要版本通道时,请记住如下信息:

  • 必须指定 --target-kubernetes-version 参数。 其他自动升级通道(快速、稳定、节点映像和安全修补程序)不支持此参数。
  • 长期支持 (LTS) 标志 --long-term-support仅在使用 目标 Kubernetes 次要版本 通道时可用。 对于其他通道,请将此标志设置为 False。
  • 只能为带有标志的自动升级配置文件选择 LTS Kubernetes 版本(--long-term-support)。 要使 Fleet 自动升级在这种情况下继续正常工作,请确保生成的更新运行任务中的所有集群均已启用 LTS。 遇到第一个非 LTS 群集时,非 LTS 群集会导致更新运行失败。
  • 不能将目标 Kubernetes 版本设置为 AKS 尚未发布的将来的 Kubernetes 版本。

将成员群集更新到特定的 Kubernetes 次要版本

使用 --target-kubernetes-version 命令,并将 az fleet autoupgradeprofile create 参数设置为所需版本,以将成员群集更新到特定的 Kubernetes 次版本。 以下示例将成员群集更新到 Kubernetes 版本 1.33。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --channel TargetKubernetesVersion \
  --target-kubernetes-version "1.33"

将启用了 LTS 的成员群集更新为特定的 Kubernetes 次要版本

使用 az fleet autoupgradeprofile create 命令,将 --long-term-support 参数设置为所需版本并启用 --target-kubernetes-version 标志,把已启用 LTS 的成员群集更新到特定的 Kubernetes 次要版本。 以下示例使用 LTS 将成员群集更新到 Kubernetes 版本 1.29。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --channel TargetKubernetesVersion \
  --target-kubernetes-version "1.29" \
  --long-term-support

安全补丁通道更新

使用安全修补程序更新 Linux 节点。 尽可能通过实时补丁应用更新。 否则,请部署包含安全修复的新机器映像。

使用安全修补程序逐个更新节点

使用 az fleet autoupgradeprofile create 命令按顺序更新成员集群的节点映像。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --channel SecurityPatch

使用现有更新策略更新具有安全修补程序的节点

使用现有更新策略更新成员群集的节点映像。 使用 az fleet autoupgradeprofile create 命令,并将 --update-strategy-id 参数设置为现有更新策略的 ID。

az fleet autoupgradeprofile create \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --update-strategy-id $STRATEGYID \
  --channel SecurityPatch 

查看自动升级方案

自动升级配置属于 Fleet 级资源。 它们不直接附加到单个 AKS 群集。 若要确定哪些配置文件可以更新你的 AKS 群集,请先列出 Fleet 成员,并确认这些群集是 Fleet 的成员。

az fleet member list \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --query "[].{memberName:name,clusterResourceId:clusterResourceId}" \
  --output table

使用 az fleet autoupgradeprofile list 命令列出舰队的所有自动升级配置文件。

az fleet autoupgradeprofile list \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --output table

使用 az fleet autoupgradeprofile show 命令显示舰队的特定自动升级配置文件。 在输出中查看通道、状态和 updateStrategyId。

az fleet autoupgradeprofile show \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE

如果 updateStrategyId 为空,则配置文件使用 逐个 更新顺序,并按顺序将 Fleet 的成员集群纳入其中。 如果 updateStrategyId 包含资源 ID,请显示所引用的策略,以便查看用于确定生成的更新运行包含哪些 Fleet 成员的阶段、组或成员选择器。

PROFILE_STRATEGY_ID=$(az fleet autoupgradeprofile show \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE \
  --query updateStrategyId \
  --output tsv)

if [[ -n "$PROFILE_STRATEGY_ID" ]]; then
  az fleet updatestrategy show \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name "${PROFILE_STRATEGY_ID##*/}"
fi

删除自动升级配置文件

使用 az fleet autoupgradeprofile delete 命令删除现有自动更新配置文件。 运行此命令后,系统会提示确认删除。 若要跳过确认并立即删除配置文件,请在命令中加入 --yes。

az fleet autoupgradeprofile delete \
  --resource-group $GROUP \
  --fleet-name $FLEET \
  --name $AUTOUPGRADEPROFILE

注意

删除自动升级配置文件不会影响任何正在进行的更新运行。

创建自动更新配置文件

本节中的 Terraform 示例会创建一个资源组、一个 Azure Kubernetes Fleet Manager(未包含中心群集)以及一个 Fleet 自动升级配置文件。 默认情况下,该配置文件使用带有 Latest 节点映像选择的 Stable 通道,并默认处于启用状态。 设置 auto_upgrade_channel、node_image_selection、auto_upgrade_disabledtarget_kubernetes_version和long_term_support变量以匹配前面各节中所述的通道和选项。 该示例未设置更新策略,因此生成的配置文件始终使用 逐个 更新序列。

查看 Terraform 代码

  1. 创建一个目录来测试示例 Terraform 代码,并将其设为当前目录。
  2. 创建名为 providers.tf 的文件并插入以下代码:
terraform {
  required_version = ">= 1.9.0"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
    azapi = {
      source  = "Azure/azapi"
      version = "~> 2.0"
    }
    random = {
      source  = "hashicorp/random"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  features {}
  environment = "china"
}

provider "azapi" {
}
  1. 创建名为 variables.tf 的文件并插入以下代码:
variable "location" {
  type        = string
  description = "Azure region where the resource group and Fleet Manager are created."
  default     = "chinanorth3"
}

variable "resource_group_name" {
  type        = string
  description = "Name of the resource group. If null, a unique name is generated."
  default     = null
}

variable "fleet_name" {
  type        = string
  description = "Name of the Azure Kubernetes Fleet Manager. If null, a unique name is generated."
  default     = null
}

variable "auto_upgrade_profile_name" {
  type        = string
  description = "Name of the Fleet auto-upgrade profile. If null, a unique name is generated."
  default     = null
}

variable "auto_upgrade_channel" {
  type        = string
  description = "Auto-upgrade channel used by the profile."
  default     = "Stable"

  validation {
    condition     = contains(["Rapid", "Stable", "NodeImage", "TargetKubernetesVersion"], var.auto_upgrade_channel)
    error_message = "Auto-upgrade channel must be one of: Rapid, Stable, NodeImage, TargetKubernetesVersion."
  }
}

variable "target_kubernetes_version" {
  type        = string
  description = "Target Kubernetes version in major.minor format, for example 1.31. Required when auto_upgrade_channel is TargetKubernetesVersion; otherwise leave null."
  default     = null

  validation {
    condition     = var.target_kubernetes_version == null || can(regex("^[0-9]+\\.[0-9]+$", var.target_kubernetes_version))
    error_message = "Target Kubernetes version must be in major.minor format, for example 1.31."
  }

  validation {
    condition     = var.auto_upgrade_channel != "TargetKubernetesVersion" || var.target_kubernetes_version != null
    error_message = "Target Kubernetes version is required when auto_upgrade_channel is TargetKubernetesVersion."
  }
}

variable "node_image_selection" {
  type        = string
  description = "Node image selection type. Latest uses the newest image per region; Consistent waits for the same image version across all member regions."
  default     = "Latest"

  validation {
    condition     = contains(["Latest", "Consistent"], var.node_image_selection)
    error_message = "Node image selection must be either Latest or Consistent."
  }
}

variable "auto_upgrade_disabled" {
  type        = bool
  description = "Set to true to stop the profile from creating new automatic update runs. In-progress update runs aren't cancelled."
  default     = false
}

variable "long_term_support" {
  type        = bool
  description = "Whether the profile targets long-term support Kubernetes versions. Only supported on the TargetKubernetesVersion channel."
  default     = false

  validation {
    condition     = !var.long_term_support || var.auto_upgrade_channel == "TargetKubernetesVersion"
    error_message = "Long-term support can only be enabled when auto_upgrade_channel is TargetKubernetesVersion."
  }
}

variable "tags" {
  type        = map(string)
  description = "Tags to apply to created resources."
  default = {
    environment = "demo"
    managed_by  = "terraform"
  }
}
  1. 创建名为 main.tf 的文件并插入以下代码:
resource "random_string" "suffix" {
  length  = 5
  lower   = true
  numeric = true
  special = false
  upper   = false
}

locals {
  resource_group_name       = coalesce(var.resource_group_name, "rg-fleet-update-${random_string.suffix.result}")
  fleet_name                = coalesce(var.fleet_name, "fleet-update-${random_string.suffix.result}")
  auto_upgrade_profile_name = coalesce(var.auto_upgrade_profile_name, "stable-profile-${random_string.suffix.result}")

  # targetKubernetesVersion is only valid on the TargetKubernetesVersion channel.
  auto_upgrade_properties = merge(
    {
      channel         = var.auto_upgrade_channel
      disabled        = var.auto_upgrade_disabled
      longTermSupport = var.long_term_support
      nodeImageSelection = {
        type = var.node_image_selection
      }
    },
    var.auto_upgrade_channel == "TargetKubernetesVersion" ? {
      targetKubernetesVersion = var.target_kubernetes_version
    } : {}
  )
}

resource "azurerm_resource_group" "example" {
  name     = local.resource_group_name
  location = var.location
  tags     = var.tags
}

resource "azurerm_kubernetes_fleet_manager" "example" {
  name                = local.fleet_name
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  tags                = var.tags
}

# autoUpgradeProfiles is only available on the preview API version, which requires schema validation to be disabled.
resource "azapi_resource" "auto_upgrade_profile" {
  type                      = "Microsoft.ContainerService/fleets/autoUpgradeProfiles@2025-04-01-preview"
  name                      = local.auto_upgrade_profile_name
  parent_id                 = azurerm_kubernetes_fleet_manager.example.id
  schema_validation_enabled = false

  body = {
    properties = local.auto_upgrade_properties
  }
}
  1. 创建名为 outputs.tf 的文件并插入以下代码:
output "resource_group_name" {
  description = "Name of the created resource group."
  value       = azurerm_resource_group.example.name
}

output "fleet_manager_name" {
  description = "Name of the Azure Kubernetes Fleet Manager."
  value       = azurerm_kubernetes_fleet_manager.example.name
}

output "fleet_manager_id" {
  description = "Resource ID of the Azure Kubernetes Fleet Manager."
  value       = azurerm_kubernetes_fleet_manager.example.id
}

output "auto_upgrade_profile_name" {
  description = "Name of the Fleet auto-upgrade profile."
  value       = azapi_resource.auto_upgrade_profile.name
}

output "auto_upgrade_profile_id" {
  description = "Resource ID of the Fleet auto-upgrade profile."
  value       = azapi_resource.auto_upgrade_profile.id
}
  1. 将示例 terraform.tfvars.example 的文件复制到 terraform.tfvars 同一目录中,然后编辑值以匹配自动升级通道、节点映像选择和其他所需选项。

    cp terraform.tfvars.example terraform.tfvars
    

初始化、验证和应用配置

运行 terraform init,将 Terraform 部署进行初始化。 此命令下载管理Azure资源所需的Azure提供程序。

terraform init

运行 terraform fmt 以一致地设置配置文件的格式。

terraform fmt

运行 terraform 验证 以确认配置文件在语法上有效。

terraform validate

运行 terraform plan 以创建执行计划。

terraform plan -out main.tfplan

运行 terraform apply 以将执行计划应用到您的云基础架构。

terraform apply main.tfplan

查看自动升级方案

从 Terraform 输出中获取资源组、机群管理器和自动升级配置文件名称。

resource_group_name=$(terraform output -raw resource_group_name)
fleet_manager_name=$(terraform output -raw fleet_manager_name)
auto_upgrade_profile_name=$(terraform output -raw auto_upgrade_profile_name)

使用 az fleet autoupgradeprofile show 命令显示自动升级配置文件的通道、状态和更新顺序。

az fleet autoupgradeprofile show \
  --resource-group $resource_group_name \
  --fleet-name $fleet_manager_name \
  --name $auto_upgrade_profile_name

该示例未设置更新策略,因此输出中的 updateStrategyId 为空,配置文件使用 逐个 更新顺序依次更新 Fleet 的成员集群。 使用以下命令列出当前机队成员。

az fleet member list \
  --resource-group $resource_group_name \
  --fleet-name $fleet_manager_name \
  --output table

删除自动升级配置文件

运行-destroy命令并使用标志,以创建销毁执行计划。

terraform plan -destroy -out main.destroy.tfplan

运行 terraform apply 以应用销毁计划。

terraform apply main.destroy.tfplan

Warning

此命令会删除自动升级配置、Azure Kubernetes Fleet Manager 资源以及此示例创建的资源组,而不只是该配置。 如果已将 AKS 群集作为 Fleet 成员加入,请先取消其 Fleet 成员身份。 在运行此命令之前,确认资源组不包含要保留的其他资源。

创建自动更新配置文件

更新到次要版本 N-1 上支持的最新 Kubernetes 修补程序版本,其中 N 是最新支持的次要版本。

  1. 在 Azure 门户中,导航到 Azure Kubernetes 舰队管理器资源。

  2. 在服务菜单中的 “设置”下,选择 “多群集更新>自动升级配置文件>+ 创建”。

  3. 在 “创建自动升级配置文件”上,配置以下选项:

    • 在 “自动升级详细信息”下:
      • 自动升级配置文件名称:输入自动升级配置文件的名称。
      • 状态:选择“启用或禁用”。 发布新版本时不会触发已禁用的自动升级配置文件。
      • 更新顺序:选择 阶段 或 逐个。
    • 在 自动升级触发器下:
      • 频道:选择 “稳定”。
      • 节点映像:选择 最新映像 或 一致映像。
    • 在 策略详细信息下:
      • 如果选择了更新序列并使用阶段,请选择一个现有策略或创建新的策略。
  4. 选择创建以创建自动升级配置文件。

    用于使用稳定通道创建自动升级配置文件的 Azure Kubernetes Fleet Manager Azure 门户窗格的屏幕截图。

查看自动升级方案

自动升级配置属于 Fleet 级资源。 它们不直接附加到单个 AKS 群集。 若要确定哪些配置文件可以更新 AKS 群集,请确认群集是机队的成员,然后查看机队的配置文件及其更新序列。

  1. 在 Azure 门户中,导航到 Azure Kubernetes 舰队管理器资源。
  2. 在服务菜单中,选择 “机队成员”,并确认 AKS 群集显示在成员列表中。
  3. 在 “设置”下,选择 “多群集更新>自动升级配置文件”。
  4. 选择自动升级配置文件以查看其通道、状态和更新序列。
  5. 如果更新序列是 一个接一个,则配置文件按顺序包括舰队的成员群集。 如果更新序列使用 阶段,请检查相关策略的阶段、组和成员选择器,以确定所生成的更新运行包含哪些 Fleet 成员。

删除自动升级配置文件

  1. 在 Azure 门户中,导航到 Azure Kubernetes 舰队管理器资源。
  2. 在服务菜单中的 “设置”下,选择 “多群集更新>自动升级配置文件”。
  3. 选择要删除的配置文件,然后选择“ 删除>是 ”以确认。

注意

删除自动升级配置文件不会影响任何正在进行的更新运行。

验证自动升级

仅当新的 Kubernetes 或节点映像可用时,才会自动升级。 触发自动升级时,会创建一个带链接的更新运行,因此你可以使用 manage update run 来查看自动升级的结果。

您还可以将现有版本作为基准进行检查。

使用带有 --query 参数的 az aks show 命令,按 currentKubernetesVersion 属性筛选输出,以获取成员集群的当前 Kubernetes 版本。

az aks show \
  --resource-group $GROUP \
  --name $CLUSTER \
  --query currentKubernetesVersion

使用 az aks show 命令并指定 --query 参数,将输出筛选为 nodeImageVersion 属性,以获取成员群集的当前节点映像版本。

az aks show \
  --resource-group $GROUP \
  --name $CLUSTER \
  --query "agentPoolProfiles[].{name:name,mode:mode, nodeImageVersion:nodeImageVersion, osSku:osSku, osType:osType}"

更新运行完成后,可以重新运行这些命令并查看已部署的更新版本。

从自动升级配置文件生成更新运行

创建自动升级配置文件后,可能需要一些时间,新的 Kubernetes 或节点映像版本才会触发自动升级,以创建和执行更新操作。 通过自动升级,可以随时使用 az fleet autoupgradeprofile generate-update-run 命令生成新的更新运行。 生成的更新运行基于当前 AKS 发布的 Kubernetes 或节点映像版本。

有关从自动升级配置文件创建按需更新运行的详细信息,请参阅 从自动升级配置文件生成更新运行。