手动升级集群或节点池

默认情况下,Google Kubernetes Engine (GKE) 集群和 GKE Standard 节点池会启用自动升级

本页面介绍如何为 GKE 集群的控制平面或节点手动请求升级或降级。您可以按如下方式手动升级版本:

为了升级集群,GKE 会更新控制平面和节点正在运行的版本。集群会升级到较新的次要版本(例如 1.24 到 1.25)或较新的补丁版本(例如 1.24.2-gke.100 到 1.24.5-gke.200)。如需了解详情,请参阅 GKE 版本控制和支持

您可以详细了解自动和手动升级集群的工作原理。您还可以通过配置维护期和排除项来控制可以和不能自动升级的时间。

新版本的 GKE 会定期发布,您可以通过集群通知接收有关每个特定集群可用的新版本的通知。如需查找集群的特定自动升级目标,请获取有关集群升级的信息

如需了解可用的版本,请参阅版本控制。如需详细了解集群,请参阅集群架构。如需了解如何升级集群,请参阅升级集群的最佳做法

准备工作

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

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

将数据保存到永久性磁盘

升级节点池之前,请务必将需要保留的所有数据存储在使用永久性磁盘永久性卷的 Pod 中。 在升级期间,永久性磁盘会被卸载,而不是被清空,并且其数据会在 Pod 之间“移交”。

永久性磁盘存在以下限制:

  • 运行 Pod 的节点必须是 Compute Engine 虚拟机
  • 这些虚拟机和永久性磁盘必须位于同一 Compute Engine 项目和地区中

如需了解如何将 Persistent Disk 添加到现有节点实例,请参阅 Compute Engine 文档中的添加地区级 Persistent Disk 或调整其大小

关于升级

集群的控制平面节点将分别升级。

无论您的集群是否已注册发布版本,集群控制平面都会始终定期升级

限制

Alpha 版集群无法升级。

支持的版本

版本说明会通知何时推出新版本以及何时不再提供旧版本。您可以随时使用以下命令列出所有支持的集群和节点版本:

gcloud container get-server-config \
    --location=CONTROL_PLANE_LOCATION

CONTROL_PLANE_LOCATION 替换为控制平面的位置(区域或可用区),例如 us-central1us-central1-a

如果您的集群已在发布渠道中注册,您可以升级到与发布控制平面具有相同次要版本的其他发布渠道中的补丁版本。例如,您可以将集群从常规渠道中的版本 1.21.12-gke.1700 升级到快速渠道中的 1.21.13-gke.900。如需了解详情,请参阅从较新的渠道运行补丁版本。所有 Autopilot 集群都在发布渠道中注册。

降级限制

在某些情况下,您可以将集群版本降级到早期版本。

如需缓解集群控制平面升级失败的问题,您可以将控制平面降级为之前的补丁版本(如果版本为同一次要版本中的早期补丁版本)。例如,如果集群的控制平面正在运行 GKE 1.25.3-gke.400,则您可以将该控制平面降级为 1.25.2-gke.100(如果该版本仍然可用)。

您无法将 Kubernetes 集群控制平面降级为早期次要版本。例如,如果您的控制平面在运行 GKE 1.25 版,则无法降级到 1.24 版。如果您尝试执行此操作,系统会显示以下错误消息:

ERROR: (gcloud.container.clusters.upgrade) ResponseError: code=400,
message=Master cannot be upgraded to "1.24.3-gke.100": specified version is not
newer than the current version.

您无法降级集群的控制平面的次要版本,因此我们建议您在新的次要版本可用但在该版本成为默认版本之前,在测试环境中测试并验证集群的次要版本升级。如果您的集群可能会受到下一个次要版本的重大更改(例如即将移除已弃用的 API 或功能)的影响,则强烈建议您执行这样的操作。

如需缓解节点池升级失败的问题,您可以将节点池降级为早期补丁版本或次要版本。请确保您不会将节点降级到比集群控制平面版本低两个以上次要版本的版本。

升级集群

Google 会自动升级集群和节点。为了更好地控制集群及其节点接收的自动升级,您可以在发布渠道中注册集群。所有 Autopilot 集群都在发布渠道中自动注册。

如需详细了解如何管理集群的 GKE 版本,请参阅升级

您可以在新版本推出后的任意时间启动手动升级

手动升级控制平面

启动集群升级时,您有几分钟无法修改集群的配置,直到可再次访问控制平面为止。如果您需要在控制平面升级期间防止停机,请考虑使用 Autopilot 集群区域级 Standard 集群。此操作不会影响运行工作负载的工作器节点的可用性,因为它们在控制平面升级期间仍然可用。

您可以使用 Google Cloud 控制台或 Google Cloud CLI 手动升级 Autopilot 或标准控制平面。

gcloud

如需查看集群的控制平面的可用版本,请运行以下命令:

gcloud container get-server-config \
    --location=CONTROL_PLANE_LOCATION

如需升级到默认的集群版本,请运行以下命令:

gcloud container clusters upgrade CLUSTER_NAME \
    --master \
    --location=CONTROL_PLANE_LOCATION

如需升级到特定的非默认版本,请按如下方式指定 --cluster-version 标志:

gcloud container clusters upgrade CLUSTER_NAME \
    --master \
    --location=CONTROL_PLANE_LOCATION \
    --cluster-version=VERSION

VERSION 替换为您要将集群升级到的版本。您可以使用具体的版本(如 1.18.17-gke.100),也可以使用版本别名(如 latest)。如需了解详情,请参阅指定集群版本

控制台

如需手动更新集群控制平面,请执行以下步骤:

  1. 进入 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击集群的名称。

  3. 集群基本信息下,点击版本旁边的 可用升级

  4. 选择所需的版本,然后点击保存更改

升级标准控制平面后,您可以升级其节点。默认情况下,使用 Google Cloud 控制台创建的标准节点已启用自动升级,因此该操作会自动执行。Autopilot 总是自动升级节点。

降级集群

  1. 在降级之前设置维护排除项,以防止 GKE 在您降级控制平面后自动升级控制平面。
  2. 将集群控制平面降级为早期补丁版本:

     gcloud container clusters upgrade CLUSTER_NAME \
         --master \
         --location=CONTROL_PLANE_LOCATION \
         --cluster-version=VERSION
    

停用集群自动升级

基础架构安全性对于 GKE 而言具有较高的优先级,因此,控制平面会定期升级,并且无法停用。但是,您可以通过应用维护期和排除项来临时暂停控制平面和节点的升级。

您可以停用节点自动升级,但我们不建议您这样做。

检查最近的控制平面升级历史记录

如需查看集群近期的自动升级历史记录的快照,请获取有关集群升级的信息

或者,您也可以列出近期的操作,以查看控制平面的升级时间:

gcloud container operations list --filter="TYPE:UPGRADE_MASTER AND TARGET:CLUSTER_NAME" \
    --location=CONTROL_PLANE_LOCATION

升级节点池

默认情况下,集群的节点已启用自动升级。节点自动升级可确保集群的控制平面和节点版本保持同步,并且符合 Kubernetes 版本倾斜支持政策,该政策可确保控制平面与最多比控制平面低两个次要版本的节点兼容。例如,Kubernetes 1.29 控制平面与 Kubernetes 1.27 节点兼容。

最佳实践

请勿停用节点自动升级,以便您的集群能够从上一段中列出的升级中受益。

借助 GKE 节点池升级,您可以选择两种可配置的升级策略,即超额配置升级蓝绿升级

选择策略使用参数调整策略可最符合您的集群环境的需求。

节点升级的工作原理

当某个节点正在升级时,GKE 会停止将新的 Pod 调度到该节点上,并尝试将其正在运行的 Pod 调度到其他节点上。这与重新创建节点的其他事件(例如启用或停用节点池中的功能)类似。

在自动或手动升级节点期间,PodDisruptionBudget (PDB)Pod 终止宽限期最长为 1 小时。如果在节点上运行的 Pod 在 1 小时后无法被调度到新节点上,GKE 会无论如何启动升级。即使您将 PDB 配置为始终提供所有副本(通过将 maxUnavailable 字段设置为 00%,或者将 minAvailable 字段设置为 100% 或副本数量),此行为也会适用。在所有这些情况下,GKE 都会在一小时后删除 Pod,以便进行节点删除。

最佳实践

如果工作负载需要更灵活且能够安全终止,请使用蓝绿升级,这样可以提供额外过渡时间设置,从而将 PDB 检查延长超过默认的 1 小时。

如需详细了解在节点终止期间一般会发生什么情况,请参阅有关 Pod 的主题。

只有在重新创建所有节点且集群处于所需状态后,升级才算完成。当新升级的节点向控制平面注册时,GKE 会将该节点标记为可调度。

新节点实例会运行所需的 Kubernetes 版本以及:

只有当节点池中的所有节点都重新创建完毕后,节点池升级才算完成。如果升级已开始但未完成,且处于部分升级状态,则节点池版本可能无法反映所有节点的版本。如需了解详情,请参阅节点池升级不完整后,某些节点版本与节点池版本不一致。如需确定节点池升级是否已完成,请检查节点池升级状态。 如果升级操作已超出保留期限,请检查各个节点版本是否与节点池版本一致。

手动升级节点池

您可以将节点池版本手动升级为与控制平面版本匹配的版本,或仍然可用且与控制平面兼容的先前版本。您可以手动并行升级多个节点池,而 GKE 一次只能自动升级一个节点池。

手动升级节点池时,GKE 会移除使用 kubectl 添加到各个节点的所有标签。为避免这种情况,请改为将标签应用于节点池

在手动升级节点池之前,请考虑以下条件:

  • 升级节点池可能会中断在该节点池中运行的工作负载。为避免出现此情况,您可以创建具有所需版本的新节点池并迁移工作负载。迁移后,您可以删除旧的节点池。
  • 如果升级某个 Ingress 处于错误状态的节点池,则实例组不会同步。如需解决此问题,请先使用 kubectl get ing 命令检查状态。如果未同步实例组,您可以重新应用用于创建 Ingress 的清单来解决该问题。

您可以使用 Google Cloud 控制台或 Google Cloud CLI 将节点池手动升级到与控制平面兼容的版本。

gcloud

本部分的命令中使用以下变量:

  • CLUSTER_NAME:要升级的节点池的集群的名称。
  • NODE_POOL_NAME:要升级的节点池的名称。
  • CONTROL_PLANE_LOCATION:控制平面的位置(区域或可用区),例如 us-central1us-central1-a
  • VERSION:节点升级到的 Kubernetes 版本。例如 --cluster-version=1.7.2cluster-version=latest

升级节点池:

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME \
  --location=CONTROL_PLANE_LOCATION

如需在节点上指定其他版本的 GKE,请使用可选 --cluster-version 标志:

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME \
  --location=CONTROL_PLANE_LOCATION \
  --cluster-version VERSION

如需详细了解如何指定版本,请参阅版本控制

如需了解详情,请参阅 gcloud container clusters upgrade 文档。

控制台

如需使用 Google Cloud 控制台升级节点池,请执行以下步骤:

  1. 进入 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击集群的名称。

  3. 集群详情页面上,点击节点标签页。

  4. 节点池部分,点击要升级的节点池的名称。

  5. 点击 修改

  6. 点击节点版本下的更改

  7. 节点版本下拉列表中选择所需的版本,然后点击更改

节点版本可能需要几分钟才能更改完成。

降级节点池

您可以降级节点池,以缓解节点池升级失败等问题。在降级节点池之前,请查看限制

最佳实践

如果您需要针对影响工作负载的节点池升级来缓解风险,请使用蓝绿节点升级策略。借助此策略,您可以在升级失败时将正在进行的升级回滚到原始节点。

  1. 为集群设置维护排除项,以防止节点池在降级后自动由 GKE 升级。
  2. 要降级节点池,请在按照手动升级节点池的说明操作时指定较早的版本。

更改超额配置升级参数

如需详细了解如何更改超额配置升级参数,请参阅配置超额配置升级

检查节点池升级状态

您可以使用 gcloud container operations 检查升级的状态。

查看集群中正在运行和已完成的所有操作的列表(如果操作少于 5,000 个,则查看过去 12 天内的操作;否则查看最近 5,000 个操作):

gcloud container operations list \
    --location=CONTROL_PLANE_LOCATION

系统会为每个操作分配操作 ID 和操作类型,以及开始和结束时间、目标集群和状态。该列表类似于以下示例:

NAME                              TYPE                ZONE           TARGET              STATUS_MESSAGE  STATUS  START_TIME                      END_TIME
operation-1505407677851-8039e369  CREATE_CLUSTER      us-west1-a     my-cluster                          DONE    20xx-xx-xxT16:47:57.851933021Z  20xx-xx-xxT16:50:52.898305883Z
operation-1505500805136-e7c64af4  UPGRADE_CLUSTER     us-west1-a     my-cluster                          DONE    20xx-xx-xxT18:40:05.136739989Z  20xx-xx-xxT18:41:09.321483832Z
operation-1505500913918-5802c989  DELETE_CLUSTER      us-west1-a     my-cluster                          DONE    20xx-xx-xxT18:41:53.918825764Z  20xx-xx-xxT18:43:48.639506814Z

如需详细了解特定操作,请按如下命令所示指定操作 ID:

gcloud container operations describe OPERATION_ID \
    --location=CONTROL_PLANE_LOCATION

例如:

gcloud container operations describe operation-1507325726639-981f0ed6
endTime: '20xx-xx-xxT21:40:05.324124385Z'
name: operation-1507325726639-981f0ed6
operationType: UPGRADE_CLUSTER
selfLink: https://container.googleapis.com/v1/projects/.../kubernetes-engine/docs/zones/us-central1-a/operations/operation-1507325726639-981f0ed6
startTime: '20xx-xx-xxT21:35:26.639453776Z'
status: DONE
targetLink: https://container.googleapis.com/v1/projects/.../kubernetes-engine/docs/zones/us-central1-a/clusters/...
zone: us-central1-a

如果升级已取消或失败,且仅完成了部分升级,您可以继续回滚升级。

检查节点池升级设置

您可以使用 gcloud container node-pools describe 命令查看有关用于节点池的节点升级策略的详细信息。对于蓝绿升级,该命令还会返回升级的当前阶段

运行以下命令:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

替换以下内容:

  • NODE_POOL_NAME:要描述的节点池的名称。
  • CLUSTER_NAME:要描述的节点池集群的名称。
  • CONTROL_PLANE_LOCATION:控制平面的位置(区域或可用区),例如 us-central1us-central1-a

此命令将输出当前升级设置。以下示例演示了使用蓝绿升级策略时的输出。

upgradeSettings:
  blueGreenSettings:
    nodePoolSoakDuration: 1800s
    standardRolloutPolicy:
      batchNodeCount: 1
      batchSoakDuration: 10s
  strategy: BLUE_GREEN

如果您使用的是蓝绿升级策略,则输出还会包含蓝绿升级设置及其当前中间阶段的详细信息。以下示例演示了这种情况的可能情形:

updateInfo:
  blueGreenInfo:
    blueInstanceGroupUrls:
    - https://www.googleapis.com/compute/v1/projects/{PROJECT_ID}/zones/{LOCATION}/instanceGroupManagers/{BLUE_INSTANCE_GROUP_NAME}
    bluePoolDeletionStartTime: {BLUE_POOL_DELETION_TIME}
    greenInstanceGroupUrls:
    - https://www.googleapis.com/compute/v1/projects/{PROJECT_ID}/zones/{LOCATION}/instanceGroupManagers/{GREEN_INSTANCE_GROUP_NAME} 
    greenPoolVersion: {GREEN_POOL_VERSION}
    phase: DRAINING_BLUE_POOL

取消节点池升级

您可以随时取消升级。如需详细了解取消超额配置升级时发生的情况,请参阅取消超额配置升级。 如需详细了解取消蓝绿升级时发生的情况,请参阅取消蓝绿升级

  1. 获取升级的操作 ID:

    gcloud container operations list \
          --location=CONTROL_PLANE_LOCATION
    
  2. 取消升级:

    gcloud container operations cancel OPERATION_ID \
          --location=CONTROL_PLANE_LOCATION
    

请参阅 gcloud container operations cancel 文档。

恢复升级节点池

您可以通过再次手动启动升级并指定原始升级中的目标版本来恢复升级。

例如,如果升级失败,或者您暂停了正在进行的升级,则可以通过在节点池上再次启动同一升级来恢复已取消的升级,并指定初始升级操作中的目标版本。

如需详细了解恢复升级时发生的情况,请参阅恢复超额配置升级蓝绿升级

要恢复升级,请使用以下命令:

gcloud container clusters upgrade CLUSTER_NAME \
  --node-pool=NODE_POOL_NAME \
  --location=CONTROL_PLANE_LOCATION \
  --cluster-version VERSION

替换以下内容:

  • NODE_POOL_NAME:要恢复节点池升级的节点池的名称。
  • CLUSTER_NAME:要恢复升级的节点池的集群的名称。
  • CONTROL_PLANE_LOCATION:控制平面的位置(区域或可用区),例如 us-central1us-central1-a
  • VERSION:已取消节点池升级的目标版本。

如需了解详情,请参阅 gcloud container clusters upgrade 文档。

回滚节点池升级

您可以回滚节点池,以将升级后的节点降级为节点池升级开始之前的原始状态。

如果正在进行的升级被取消、升级失败或升级由于维护窗口超时而未完成,请使用 rollback 命令。或者,如果您想指定版本,请按照说明降级节点池。

如需详细了解回滚节点池升级时发生的情况,请参阅回滚超额配置升级回滚蓝绿升级

如需回滚升级,请运行以下命令:

gcloud container node-pools rollback NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

替换以下内容:

  • NODE_POOL_NAME:要回滚节点池升级的节点池的名称。
  • CLUSTER_NAME:要回滚升级的节点池的集群名称。
  • CONTROL_PLANE_LOCATION:控制平面的位置(区域或可用区),例如 us-central1us-central1-a

请参阅 gcloud container node-pools rollback 文档。

完成节点池升级

如果您使用的是蓝绿升级策略,则可以在过渡阶段完成节点池升级,并跳过其余过渡时间。

如需了解如何完成节点池升级,请参阅完成节点池升级

如需在使用蓝绿升级策略时完成升级,请运行以下命令:

gcloud container node-pools complete-upgrade NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

替换以下内容:

  • NODE_POOL_NAME:要完成升级的节点池的名称。
  • CLUSTER_NAME:要完成升级的节点池的集群名称。
  • CONTROL_PLANE_LOCATION:控制平面的位置(区域或可用区),例如 us-central1us-central1-a

请参阅 gcloud container node-pools complete-upgrade 文档。

已知问题

如果您配置的 PodDisruptionBudget 对象无法允许任何额外的中断,则节点升级可能会在反复尝试后仍无法升级到控制平面版本。为防止此故障,我们建议您扩容 DeploymentHorizontalPodAutoscaler,以允许节点排空,同时仍遵循 PodDisruptionBudget 配置。

如需查看不允许出现任何中断的所有 PodDisruptionBudget 对象,请运行以下命令:

kubectl get poddisruptionbudget --all-namespaces -o jsonpath='{range .items[?(@.status.disruptionsAllowed==0)]}{.metadata.name}/{.metadata.namespace}{"\n"}{end}'

虽然自动升级可能会遇到问题,但自动升级过程会强制节点升级。但是,对于 istio-system 命名空间中违反 PodDisableionBudget 的每个节点,升级额外需要一个小时。

问题排查

如需了解问题排查,请参阅排查集群升级问题

后续步骤