使用 Azure Kubernetes Fleet Manager 定义可重用的更新策略

适用于: ✔️车队经理 ✔️中心群集的车队经理

管理员可以通过定义一系列阶段和组来控制对机群管理的群集的更新序列。 用户可以配置审批和暂停应在那些阶段和组中何时发生。 整个配置可以保存为更新策略,可以独立于更新运行或自动升级进行管理,从而根据需要重复使用策略。

本文介绍如何使用组和阶段定义更新策略。

关系图:包含两个更新阶段的示例更新策略。每个更新阶段都包含两个更新组。每个更新组都包含两个成员群集。

先决条件

  • 请参阅舰队更新的概念概述,其中提供了本指南中引用的更新运行、阶段、组和策略的说明。

  • 必须具有包含一个或多个成员群集的舰队资源。 否则,请按照 quickstart 创建 Fleet 资源并将Azure Kubernetes 服务 (AKS)群集加入为成员。

  • 设置以下环境变量:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export CLUSTERID=<aks-cluster-resource-id>
    export STRATEGY=<strategy-name>
    
  • 如果按照本文中的Azure CLI说明进行操作,请安装最新版本的 Azure CLI。 若要安装或升级,请参阅 安装 Azure CLI

  • 还需要fleetAzure CLI扩展。 若要安装它,请运行以下命令:

    az extension add --name fleet
    

    运行 az extension update 命令,更新到最新发布的扩展版本:

    az extension update --name fleet
    

为策略选择群集

可通过两种方法选择每个阶段和更新策略组中包含的群集来控制更新顺序:

  • 成员标签 (建议):将标签分配给每个机队成员,并使用这些 memberSelector 标签选择成员。 每个成员可以有多个标签。
  • 更新组:将更新组分配给每个机群成员,然后在策略中定义与这些组名称匹配的组。 每个成员只能属于一个组。

使用成员选择器创建更新策略(预览版)

成员标签是用于在更新策略中选择群集的建议方法,因为它们提供了更大的灵活性。 有关概念详细信息,请参阅 使用成员标签对群集进行分组

Important

Azure Kubernetes 舰队管理器预览功能可以通过自助服务方式选择性启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

在成员群集上应用标签

将成员群集添加到舰队时应用标签

使用 az fleet member create 命令在机群成员上应用标签。 以下示例将两个标签应用于成员群集: env=stagingtier=frontend

az fleet member create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name member1 \
    --member-cluster-id $CLUSTERID \
    --labels "env=staging tier=frontend"

将标签应用于现有机群成员

使用 az fleet member update 命令在机群成员上应用标签

az fleet member update \
 --resource-group $GROUP \
 --fleet-name $FLEET \
 --name member1 \
 --labels "env=staging tier=frontend"

创建更新策略

更新策略由一个或多个阶段组成,其中一个阶段可以包含一个或多个更新组。

注意

在此功能正式发布之前,将提供Azure门户体验。

  1. 创建 JSON 文件以定义更新运行的阶段和组。 阶段按 JSON 文件中显示的顺序按顺序运行。 组在每个阶段中并行运行。 以下示例文件(example-labels-strategy.json)定义了一个策略,其中包含两个阶段,用于 memberSelector 按标签选择群集,并包括可选 maxConcurrency 设置:

    • staging 阶段使用阶段级别 memberSelector 选择具有标签 env=staging 的所有群集并创建一个隐式组。
    • production 阶段使用阶段级别 memberSelector 来预筛选具有标签 env=production的所有群集,然后定义两个组,每个组都有自己的 memberSelector 组,以按 tier 标签选择群集。

    当在组上设置memberSelector时,组的name字段仅用作状态报告和日志记录的显示标识符,而不再用于基于车队成员的更新组选择。

    {
        "stages": [
            {
                "name": "staging",
                "memberSelector": { "byLabel": "env=staging" },
                "maxConcurrency": "1",
                "afterStageWaitInSeconds": 600
            },
            {
                "name": "production",
                "memberSelector": { "byLabel": "env=production" },
                "maxConcurrency": "4",
                "groups": [
                    {
                        "name": "frontend",
                        "memberSelector": { "byLabel": "tier=frontend" },
                        "maxConcurrency": "3"
                    },
                    {
                        "name": "backend",
                        "memberSelector": { "byLabel": "tier=backend" },
                        "maxConcurrency": "3"
                    }
                ]
            }
        ]
    }
    

注意

maxConcurrency 字段是可选的,控制在阶段或组级别可以并发升级的群集数量。 使用更大的值可以更快地在车队中升级群集,或者使用较小的值进行更受控的推出,以限制爆炸半径(如果出现问题)。

当某个阶段使用 memberSelector 时没有分组(例如像 staging),所有匹配的成员会形成一个单个隐式组,并且阶段的 maxConcurrency 可以直接控制并发性。 定义组时(如 production),阶段级别 maxConcurrency 充当所有组的总体上限。

在此示例中,staging阶段将maxConcurrency设置为"1",因此暂存集群会逐个升级。 阶段production允许最多"4"个群集同时运行,且每个frontend群集和backend组的限制为"3"

值可以是固定整数(例如)"3"或百分比(例如)。 "50%" 如果省略,系统将应用默认值。 有关如何解析这些值及其上限的详细信息,请参阅最大并发性(预览版)。

  1. 使用 az fleet updatestrategy create 命令新建更新策略,并将 --stages 标志设置为 JSON 文件的名称。

    az fleet updatestrategy create \
     --resource-group $GROUP \
     --fleet-name $FLEET \
     --name $STRATEGY \
     --stages example-labels-strategy.json
    

使用更新组创建更新策略

通过将群集分配到单个更新组,还可以在更新策略中选择群集。 可以定义将这些更新组分配到阶段的更新策略。 在更新阶段中,更新将并行应用于每个更新组。 在更新组中,成员群集按顺序更新。

注意

一个舰队成员只能加入一个更新组,但一个更新组内可以有多个舰队成员。 更新组本身不是单独的资源类型。 更新组只是表示来自舰队成员的引用的字符串。 因此,如果删除所有引用通用更新组的机队成员,该特定更新组也不再存在。

将群集分配到更新组

在将成员群集添加到舰队时分配给组

  1. 在 Azure 门户中,导航到 Azure Kubernetes Fleet Manager 资源。

  2. 从服务菜单的“设置”下,选择“成员群集”“添加”>

    用于添加成员集群的 Azure Kubernetes Fleet Manager 的 Azure 门户页面截图。

  3. 选择要添加的群集,然后选择“下一步:查看 + 添加”

  4. 输入要将群集分配到的更新组的名称,然后选择“添加”

    Azure 门户页面的屏幕截图,显示 Azure Kubernetes Fleet Manager 查看并添加成员群集的步骤。

使用 az fleet member create 命令将成员群集添加到舰队时,将成员群集分配给更新组,并将 --update-group 参数设置为更新组的名称。

az fleet member create \
    --resource-group $GROUP \
    --fleet-name $FLEET \
    --name member1 \
    --member-cluster-id $CLUSTERID \
    --update-group group-1a

将现有舰队成员分配给更新组

  1. 在 Azure 门户中,导航到 Azure Kubernetes Fleet Manager 资源。

  2. 从服务菜单的“设置”下,选择“成员群集”

  3. 选择要分配给更新组的群集,然后选择“分配更新组”

    用于将现有成员群集分配到组的 Azure 门户页面截图。

  4. 输入要将群集分配到的更新组的名称,然后选择“分配”

     Azure门户页面的成员群集截图,其中显示了用于更新成员群集的组的窗体。

使用 az fleet member update 命令将现有舰队成员分配给更新组,并将 --update-group 标志设置为更新组的名称。

az fleet member update \
 --resource-group $GROUP \
 --fleet-name $FLEET \
 --name member1 \
 --update-group group-1

创建更新策略

更新策略由一个或多个阶段组成,其中一个阶段可以包含一个或多个更新组。

  1. 在 Azure 门户中,导航到 Azure Kubernetes Fleet Manager 资源。

  2. 在服务菜单中的“设置”下,选择“多群集更新”“策略”>,然后选择“创建”

  3. 输入策略的名称。

  4. 首次查看页面时,会显示一个更新策略说明图,有助于直观显示策略的功能。

     Azure 门户的屏幕截图,其中显示了创建更新策略.

  5. 选择“创建阶段”并输入以下内容:

    • 阶段名称 - 命名阶段 - 它在策略中的所有阶段名称中必须是唯一的。
    • (可选) 阶段审批 - 如果要在此阶段开始之前或完成后等待审批,请选择此选项。 有关详细信息,请参阅 添加审批以更新组和阶段
    • (可选)阶段后暂停 - 如果要在移动到下一阶段之前定义暂停,请选择此选项。
    • (可选) 暂停持续时间 - 选择预定义持续时间,或输入自定义值(以秒为单位)。

     Azure 门户的屏幕截图,其中显示了创建 Azure Kubernetes Fleet Manager 更新策略阶段.

  6. 将一个或多个 更新组 分配到阶段,然后选择“ 创建”。

    注意

    每个更新阶段的最大更新组数为 50

     Azure 门户的屏幕截图,显示在创建 Azure Kubernetes Fleet Manager 更新策略阶段中,选择要包含的更新组。

对于此方案,我们将创建阶段和组,以匹配用于Azure门户过程的详细信息。

  1. 创建 JSON 文件以定义更新运行的阶段和组。 阶段按 JSON 文件中显示的顺序按顺序运行。 组在每个阶段中并行运行,因此排序并不重要。 以下示例文件(example-stages.json)定义了包含两个阶段的策略,并包括可选 maxConcurrencymaxAllowedFailures 设置:

    {
        "stages": [
            {
                "name": "stage-1",
                "maxConcurrency": "7",
                "maxAllowedFailures": "2",
                "groups": [
                    {
                        "name": "group-1",
                        "maxConcurrency": "3",
                        "maxAllowedFailures": "1"
                    },
                    {
                        "name": "group-2",
                        "maxConcurrency": "50%",
                        "maxAllowedFailures": "25%"
                    }
                ],
                "afterStageWaitInSeconds": 300
            },
            {
                "name": "stage-2",
                "maxConcurrency": "100%",
                "maxAllowedFailures": "0",
                "groups": [
                    {
                        "name": "group-3",
                        "maxConcurrency": "2",
                        "maxAllowedFailures": "0"
                    }
                ]
            }
        ]
    }
    

    maxConcurrency

    maxConcurrency 字段是可选的,控制在阶段或组级别可以并发升级的群集数量。 使用更大的值可以更快地在整个机群中升级群集,或者使用较小的值进行更受控的推出,以便在出现问题时限制爆炸半径。

    在此示例中,stage-1maxConcurrency设置为"7",这允许在此阶段多达"7"个群集同时升级。 在 stage-1 中,group-1 将并发性限制为 "3" 个群集,这意味着此组中最多有 "3" 个可以同时升级。 group-2 "50%"最多允许其群集同时升级(例如,如果组包含 4 个群集,则最多可以同时升级 2 个群集)。

    值可以是固定整数(例如)"3"或百分比(例如)。 "100%" 如果省略,系统将应用默认值。 有关如何解析这些值及其上限的详细信息,请参阅最大并发性(预览版)。

    maxAllowedFailures

    maxAllowedFailures 字段是可选的,控制在将组或阶段标记为失败之前允许多少个成员群集升级失败。 默认情况下(如果未设置或 "0"),单个失败将停止整个更新运行。

    此设置仅根据失败次数进行评估。 它不会强制实施最低成功率。 因此,即使部分或所有成员失败,组或阶段也可以以 Completed 结束,只要 Fleet 在作出调度决策时失败阈值尚未被超过。

    在此示例中,stage-1maxAllowedFailures设置为"2",可容忍整个阶段内最多两个成员发生故障。 在 stage-1 中,group-1 可容忍 "1" 发生故障,而 group-2 可容忍其 "25%" 个成员发生故障(例如,如果该组包含 4 个群集,则最多可容忍 1 个成员发生故障)。 stage-2maxAllowedFailures设置为"0",这意味着任何失败都会立即停止此次运行,并且通常对生产阶段很有用。

    对于大多数发布,优先选择百分比值,因为它们对不同规模的群组具有更好的适应性。 避免将该值设为等于成员总数,除非你有意让该分段实际上表现为“永不失败”。

    值可以是固定整数(例如)"3"或百分比(例如)。 "25%" 有关如何解决这些值的详细信息,请参阅允许的最大失败数(预览版)。

  2. 使用 az fleet updatestrategy create 命令新建更新策略,并将 --stages 标志设置为 JSON 文件的名称。

    az fleet updatestrategy create \
     --resource-group $GROUP \
     --fleet-name $FLEET \
     --name $STRATEGY \
     --stages example-stages.json
    

后续步骤

你可以在手动更新操作或自动升级配置中使用更新策略。 请参阅: