对集群升级的发布进行排序


本页面介绍如何使用发布顺序来管理 GKE 集群升级。如需了解详情,请参阅使用发布顺序的集群升级简介

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

所需的角色

配置发布顺序

本文档介绍了如何使用按舰队团队范围整理的集群组来创建发布序列。您可以同时包含 Autopilot 和 Standard 集群。

您可以创建最多包含三组集群的序列,并且可以选择在一个组中完成集群升级后您所需的过渡测试时长(最多 30 天)。

如需创建发布序列,集群必须整理到舰队或团队范围组中。如需了解如何整理集群,请参阅社区银行示例。集群整理到组中后,您可以通过定义上游组关系和每个组的过渡时间来创建发布序列。 在发布序列中,上游是指上一个组,下游是指下一个组。

将集群整理到组中

在发布序列中,所有组内的所有集群都必须在同一发布渠道中注册,并且使用同一次要版本。如果不满足这些要求,并且集群之间存在版本差异,则可能会导致版本发布出现问题。如需了解详情,请参阅发布资格

您可以在舰队之间创建发布序列,也可以在团队的团队范围(预览版)之间创建发布序列。

关于使用发布序列的集群升级中所述,团队范围是一种企业舰队级结构,用于将舰队集群的子集与特定应用团队相关联。您必须启用 GKE Enterprise 才能使用团队范围。使用或创建发布序列的团队范围时,存在以下限制:

  • 基于团队的序列需要单租户集群:换句话说,每个集群仅与单个团队关联。发布序列不支持共享集群(在常规舰队团队管理中受支持)。

  • 每个团队范围必须位于不同的舰队中,才能在它们之间创建发布序列。不支持在同一舰队内的不同团队范围之间创建发布序列。

如果您已将集群整理到组中,则可以跳过以下步骤并继续执行创建发布序列

舰队

如需创建基于舰队的发布序列,您必须先将集群分组到舰队中。您可以按部署环境(例如测试、预演和生产)整理集群,如基于舰队的发布序列示例所示。

根据您选择的分组向舰队注册每个集群

团队

如需创建基于团队的发布序列,您必须将集群分组到团队范围内。为此,先按部署环境(例如测试、预演和生产)将集群整理到舰队中,如基于范围的发布序列示例所示。然后,您可以进一步将集群细分为不同团队集群的范围。

  1. 对于顺序中的每个集群,请向舰队注册集群。集群应注册到您要在其中为此集群创建团队范围的项目中的舰队。如果要将集群注册到其他宿主项目中的舰队,请确保为跨项目注册设置必要的权限。
  2. 创建 2-3 个团队范围以组织您的集群。请在团队各自舰队的宿主项目中创建每个范围。一个发布序列中最多可以包含三个团队范围。

    如需查看完整的标志列表,请参阅 gcloud alpha container fleet scopes create 的参考文档。使用 create 命令时,您可以使用创建发布序列说明中的标志。

  3. 将每个集群添加到范围

创建发布顺序

发布序列整理为最多包含三个元素的关联列表

创建发布序列时,您可以为每组集群(舰队或团队范围)设置以下属性:

  • 上游组:上游舰队或团队范围,用于限定下游组的新版本。您不能为序列中的第一个组设置上游组。
  • 过渡时间:组的过渡时间是升级完成(或发布已进行 30 天)与下游组开始升级之间的时间。如需了解详情,请参阅版本资格在发布顺序中的工作原理

对于以下每个命令,请将 SOAK_TIME 替换为您要更新的组的过渡时间。

舰队 - gcloud

以下说明使用 gcloud container fleet clusterupgrade update 命令,但您可以使用 gcloud container fleet clusterupgrade create 命令设置相同的属性。

创建发布序列:

  1. 为序列中的第一个舰队设置过渡时间:

    gcloud container fleet clusterupgrade update \
        --default-upgrade-soaking=SOAK_TIME \
        --project=FIRST_FLEET_PROJECT_ID
    

    FIRST_FLEET_PROJECT_ID 替换为舰队宿主项目的 ID。

  2. 为序列中第二个舰队设置上游舰队和过渡时间:

    gcloud container fleet clusterupgrade update \
        --upstream-fleet=FIRST_FLEET_PROJECT_ID \
        --default-upgrade-soaking=SOAK_TIME \
        --project=SECOND_FLEET_PROJECT_ID
    

    FIRST_FLEET_PROJECT_ID 替换为第一个舰队的宿主项目的 ID,并将 SECOND_FLEET_PROJECT_ID 替换为舰队宿主项目的 ID。

  3. 可选:如果您希望发布序列中有三个舰队,请为序列中的第三个舰队设置上游舰队:

    gcloud container fleet clusterupgrade update \
        --upstream-fleet=SECOND_FLEET_PROJECT_ID \
        --default-upgrade-soaking=SOAK_TIME \
        --project=THIRD_FLEET_PROJECT_ID
    

    SECOND_FLEET_PROJECT_ID 替换为第二个舰队的宿主项目的 ID,并将 THIRD_FLEET_PROJECT_ID 替换为舰队宿主项目的 ID。

舰队 - Terraform

本部分介绍了如何使用 Terraform 创建基于舰队的序列。您还可以使用此资源来更新序列。如需了解详情,请参阅 google_gke_hub_feature 的参考文档。

创建发布序列:

  1. 将以下块添加到 Terraform 配置中,以设置序列中的第一个舰队的过渡时间:

    resource "google_gke_hub_feature" "feature" {
      name = "clusterupgrade"
      location = "global"
      spec {
        clusterupgrade {
          upstream_fleets = []
          post_conditions {
            soaking = "SOAK_TIME"
          }
        }
      }
      project = "FIRST_FLEET_PROJECT_ID"
    }
    

    FIRST_FLEET_PROJECT_ID 替换为舰队宿主项目的 ID。

  2. 将以下块添加到 Terraform 配置中,以设置序列中第二个舰队的上游舰队和过渡时间:

    resource "google_gke_hub_feature" "feature" {
      name = "clusterupgrade"
      location = "global"
      spec {
        clusterupgrade {
          upstream_fleets = ["FIRST_FLEET_PROJECT_ID"]
          post_conditions {
            soaking = "SOAK_TIME"
          }
        }
      }
      project = "SECOND_FLEET_PROJECT_ID"
    }
    

    FIRST_FLEET_PROJECT_ID 替换为第一个舰队的宿主项目的 ID,并将 SECOND_FLEET_PROJECT_ID 替换为舰队宿主项目的 ID。

  3. 可选:如果您希望发布序列中有三个舰队,请将以下块添加到 Terraform 配置中,以便为序列中的舰队设置上游舰队:

    resource "google_gke_hub_feature" "feature" {
      name = "clusterupgrade"
      location = "global"
      spec {
        clusterupgrade {
          upstream_fleets = ["SECOND_FLEET_PROJECT_ID"]
          post_conditions {
            soaking = "SOAK_TIME"
          }
        }
      }
      project = "THIRD_FLEET_PROJECT_ID"
    }
    

    SECOND_FLEET_PROJECT_ID 替换为第二个舰队的宿主项目的 ID,并将 THIRD_FLEET_PROJECT_ID 替换为舰队宿主项目的 ID。

团队 - gcloud

您可以在创建或更新团队范围时设置这些属性。以下说明使用 gcloud alpha container fleet scopes update 命令,但您可以在使用 gcloud alpha container fleet scopes create 命令创建团队范围时设置相同的属性。

对于其中的每个命令,请将变量替换为相应团队范围的名称或该团队范围的舰队宿主项目 ID。

创建发布序列:

  1. 为序列中的第一个范围设置过渡时间:

    gcloud alpha container fleet scopes update projects/FIRST_SCOPE_PROJECT_ID/locations/global/scopes/FIRST_SCOPE_NAME \
        --default-upgrade-soaking=SOAK_TIME \
        --project=FIRST_SCOPE_PROJECT_ID
    
  2. 为顺序中的第二个范围设置上游范围和过渡时间:

    gcloud alpha container fleet scopes update projects/SECOND_SCOPE_PROJECT_ID/locations/global/scopes/SECOND_SCOPE_NAME \
        --upstream-scope=projects/FIRST_SCOPE_PROJECT_ID/locations/global/scopes/FIRST_SCOPE_NAME \
        --default-upgrade-soaking=SOAK_TIME \
        --project=SECOND_SCOPE_PROJECT_ID
    
  3. 可选:如果要在一个发布序列中包含三个团队范围,请在序列中设置第三个范围的上游范围:

    gcloud alpha container fleet scopes update projects/THIRD_SCOPE_PROJECT_ID/locations/global/scopes/THIRD_SCOPE_NAME \
        --upstream-scope=projects/SECOND_SCOPE_PROJECT/locations/global/scopes/SECOND_SCOPE_NAME \
        --default-upgrade-soaking=SOAK_TIME \
        --project=THIRD_SCOPE_PROJECT_ID
    

检查发布顺序的状态

使用以下部分中的命令可以检查升级在发布序列中的进度。如需详细了解所提供的详细信息,请参阅发布序列的状态信息

如需运行这些命令,请确保您拥有每个舰队宿主项目的所需权限。例如,如果序列在不同舰队中具有跨项目范围,则您需要拥有每个项目的权限来描述序列。

对于以下命令,如果您只需要序列中的一个舰队或范围的相关信息,请将 --show-linked-cluster-upgrade 标志替换为 --show-cluster-upgrade

舰队

检查基于舰队的发布序列的状态:

gcloud container fleet clusterupgrade describe \
    --show-linked-cluster-upgrade --project=FLEET_PROJECT_ID

FLEET_PROJECT_ID 替换为序列中任何舰队的宿主项目的 ID。

如需查看完整的标志列表,请参阅 gcloud container fleet clusterupgrade describe 的参考文档。

团队

检查基于团队的发布序列的状态:

gcloud alpha container fleet scopes describe SCOPE_NAME \
    --show-linked-cluster-upgrade
    --project=SCOPE_PROJECT_ID

SCOPE_NAME 替换为发布序列中的任何团队范围的名称,并将 SCOPE_PROJECT_ID 替换为此团队范围的项目 ID。

如需查看完整的标志列表,请参阅 gcloud alpha container fleet scopes describe 的参考文档。

如需查看舰队或团队范围内各个集群的状态,请在舰队宿主项目中运行以下命令并查看 membershipStates 部分:

gcloud container fleet features describe clusterupgrade

发布序列的状态信息

检查版本发布的状态时,您可以查看每个组以及该组中集群的进度。

请参阅下表,了解集群或组的潜在状态:

状态 对于集群 对于组
不符合条件 此集群不符合从升级的条件 此组内的一个或多个集群不符合此升级的条件。
待定 升级尚未开始或集群正在升级。 尚未对组内的任何集群开始进行升级。
IN_PROGRESS 不适用 至少已在一个集群上开始升级,但尚未在所有集群上完成。
过渡 集群已完成升级,但尚未完成过渡。 升级已在所有集群上完成,但尚未完成过渡。
FORCED_SOAKING 升级所用时间超过了最长升级时间(30 天),因此我们强制其进入过渡阶段。升级仍可在集群中继续执行。 升级所用时间超过了最长升级时间(30 天),因此我们强制其进入过渡阶段。升级仍可在集群中继续执行。
完成 升级被视为“完成”,这意味着升级已完成此集群的过渡。 升级被视为“完成”并可供下游组使用,这意味着升级已完成过渡。

在这些命令的输出中,clusterUpgrade(s).specclusterUpgrade(s).state 属性包含有关集群升级的其他信息,例如过渡时间、集群升级替换和升级状态。

管理发布序列

您可以采用多种方式通过发布序列控制自动集群升级,如以下部分所述。

更改组的过渡时间

您可以更改组的默认过渡时间,也可以更改该组升级到特定版本时的过渡时间。

更新默认过渡时间

如需更改组的默认过渡时间,请使用创建发布序列说明中的命令,并省略相应标志来设置上游组。

替换默认过渡时间

您可以更改特定版本发布的过渡时间,使其与组的默认过渡时间不同。例如,如果您已限定新版本并准备好在下一个组内开始升级,则可以将过渡时间设置为零。如果您需要比默认过渡时间更长的时间来限定特定版本,也可以使用此设置。

由于过渡时间是按组设置的,因此如果您要替换序列中其他组的过渡时间,请使用同一命令更新这些组并替换舰队或范围名称,具体取决于序列的类型。

对于本部分中的说明,请替换以下变量:

  • SOAK_TIME:除默认值以外的过渡时间(例如,如果要跳过一次版本发布的过渡时间,则为“0d”)。
  • UPGRADE_NAME:升级的名称,可以是 k8s_control_planek8s_node
  • VERSION:在发布到组后您需要过渡时间的 GKE 版本,例如 1.25.2-gke.400。

舰队 - gcloud

在您要替换特定版本发布所用过渡时间的舰队宿主项目中运行以下命令。

更改舰队的过渡时间:

gcloud container fleet clusterupgrade update
    --add-upgrade-soaking-override=SOAK_TIME \
    --upgrade-selector=name=UPGRADE_NAME,version=VERSION

舰队 - Terraform

将以下 gke_upgrades_overrides 块添加到 clusterupgrade中的 Terraform 配置,以替换特定版本发布使用的过渡时间:

gke_upgrade_overrides {
    upgrade {
      name = "UPGRADE_NAME"
      version = "VERSION"
    }
    post_conditions {
      soaking = "SOAK_TIME"
    }
  }

团队 - gcloud

在团队范围舰队的宿主项目中运行以下命令。将 SCOPE_NAME 替换为在您要替换特定版本发布所用过渡时间的团队范围的名称。

更改团队范围的过渡时间:

gcloud alpha container fleet scopes update SCOPE_NAME \
    --add-upgrade-soaking-override=SOAK_TIME \
    --upgrade-selector=name=UPGRADE_NAME,version=VERSION

更改顺序的次序

如果您要更改序列的顺序,请使用创建发布序列说明中的命令来更新上游组。

延迟完成组的版本发布

如果您需要暂时阻止某个组完成到其集群的新版本发布,则可以向任何尚未升级到目标版本的集群添加维护排除项。这可能会使组暂停进入其过渡时间或下游组,最长可达 30 天。30 天后,组将开始过渡。

您还可以将该组的过渡时间更改为 30 天,以最大程度延长发布序列在进入下一个组之前等待的时间。

如果您需要为下一个组进一步延迟升级开始,则可以为下一个组内的集群使用维护排除项。

在基于舰队和基于团队的发布序列之间切换

您可以从基于舰队的序列切换到基于团队的序列,也可以从基于团队的序列切换到基于舰队的序列。说明假定您在按示例图中所示组织的序列之间进行转换。

舰队到团队

如需将集群从基于舰队的发布序列更改为基于团队的发布序列,请执行以下步骤:

  1. 为每个舰队中的所有集群配置维护排除项,以防止在修改配置时进行任何升级。
  2. 确保您已在舰队宿主项目启用 GKE Enterprise
  3. 在每个舰队中,创建一个或多个团队范围以细分该舰队中的集群组。
  4. 在每个舰队中的匹配团队范围之间创建一个或多个发布序列
  5. 将集群添加到其新的团队范围
  6. 移除为此更改配置的维护排除项

团队到舰队

如需将集群从基于团队的发布序列更改为基于舰队的发布序列,请执行以下步骤:

  1. 为每个舰队中的所有集群配置维护排除项,以防止在修改配置时进行任何升级。
  2. 在舰队之间创建发布序列
  3. 从集群团队范围中移除集群。现在,这些集群只会注册到其范围各自的舰队,而您在上一步中将它们加入了发布序列。
  4. 删除团队范围
  5. 移除为此更改配置的维护排除项

删除顺序

如需删除序列,您需要移除第二个和第三个组的上游关联(如果发布序列包含三个组)。

对于舰队

在发布序列中的第二个和第三个舰队的舰队宿主项目中运行以下命令:

gcloud container fleet clusterupgrade update --reset-upstream-fleet

团队

在发布序列的第二个和第三个团队范围的舰队宿主项目中运行以下命令:

gcloud alpha container fleet scopes update SCOPE_NAME --reset-upstream-scope

SCOPE_NAME 分别替换为第二个和第三个范围的名称。

问题排查

排查发布资格问题

如果发布序列中的所有集群都没有相同的升级目标,则 GKE 可能无法继续升级集群。如果上游组不符合将一个升级目标传递到下游组的条件,则自动升级无法继续。如果上游组中的集群符合下游组中的集群无效升级目标,则自动升级也无法继续。

如需检查您的发布顺序是否存在任何发布资格问题,请检查发布顺序的状态。如果组不符合条件,请按照说明查看组中各个集群的状态。

如需立即推进集群升级,请按照推进部分符合条件的发布的说明,移除状态为 INELIGIBLE 的任何集群。

解决组中的资格问题

在组中,如果集群由于版本较低而不符合条件(例如,组内的大多数集群从 1.23 升级到 1.24,而集群使用 1.22 版),则您可以将集群手动升级到 1.24,以解决版本差异问题。

在组中,如果集群由于版本较高而不符合条件(例如,组内的大多数集群从 1.23 升级到 1.24,而集群使用 1.25 版),则无法手动降级集群来解决版本差异问题,您需要移除集群。

解决组之间的资格问题

在组之间,如果升级目标中存在下游组使用较新版本的不匹配问题(例如,上游组从 1.23 升级到 1.24,而下游组中的集群使用 1.25),您可以手动将上游组中的集群升级到 1.25 以确保升级继续进行。

在组之间,如果升级目标中存在下游组使用较早版本的不匹配问题(例如,上游组从 1.24 升级到 1.25,而下游组中的集群使用 1.23),您可以手动将下游组中的集群升级到 1.24 或 1.25 以确保升级继续进行。

推进部分符合条件的发布

如果组中的集群升级由于发布资格问题(例如,组内的版本差异)而无法完成,则可以从组中移除不符合该组升级目标条件的集群,以完成版本发布并开始过渡时间或进入发布序列中的下一个组。您还可以出于其他原因从组中移除集群,例如,如果此集群的使用情况与组内的其他集群不再相关。

按照从舰队中取消注册集群从团队范围中移除集群的说明操作,具体取决于发布序列的类型。

移除所有阻止组的版本发布完成的集群后,该组的版本发布将完成。请按照说明检查版本发布的状态来确认这一点。

后续步骤