手动升级集群或节点池


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

本页面介绍如何为 GKE 集群或其节点手动请求升级或降级。您可以详细了解自动和手动升级集群的工作原理。您还可以通过配置维护期和排除项来控制可以和不能自动升级的时间。

新版本的 GKE 会定期发布。如要了解可用的版本,请参阅版本控制。如需详细了解集群,请参阅集群架构。如需了解如何升级集群,请参阅升级集群的最佳做法

准备工作

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

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Google Cloud CLI
  • 使用以下某种方法为您的项目设置默认 Google Cloud CLI 设置:
    • 使用 gcloud init(如果您想要在系统引导下完成项目默认设置)。
    • 使用 gcloud config(如果您想要单独设置项目 ID、可用区和区域。

    gcloud init

    1. 运行 gcloud init 并按照说明操作:

      gcloud init

      如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

      gcloud init --console-only
    2. 按照说明授权 gcloud CLI 使用您的 Google Cloud 帐号。
    3. 创建新配置或选择现有配置。
    4. 选择 Google Cloud 项目。
    5. 选择默认的 Compute Engine 可用区
    6. 选择默认的 Compute Engine 区域

    gcloud config

    1. 设置默认项目 ID
      gcloud config set project PROJECT_ID
    2. 设置默认的 Compute Engine 区域(例如 us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. 设置默认的 Compute Engine 可用区(例如 us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud 更新到最新版本:
      gcloud components update

    通过设置默认位置,您可以避免 gcloud CLI 中出现以下错误:One of [--zone, --region] must be supplied: Please specify location

将数据保存到永久性磁盘

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

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

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

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

关于升级

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

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

如需主动接收升级通知,请参阅接收集群通知

限制

Alpha 版集群无法升级。

支持的版本

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

gcloud container get-server-config

降级限制

不建议降级集群控制平面。您无法将集群控制平面从一个次要版本降级到另一个次要版本。例如,如果您的控制平面正在运行 GKE 1.17.17 版,则无法降级到 1.16.15 版。如果您尝试执行此操作,则会看到类似于以下内容的错误:

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

不建议降级 Kubernetes 次要版本或补丁程序,您应只将其用作失败升级的缓解措施。

如需缓解集群控制平面升级失败的问题,您可以将集群降级为先前的补丁程序版本(如果该补丁程序版本与您的集群具有相同的次要版本)。例如,如果您的集群正在运行 GKE 1.17.17,则可以降级到 1.17.16(如果该版本仍然可用)。

如需缓解节点池升级失败的问题,您可以将节点池降级为早于集群控制平面版本的补丁程序版本。节点版本不能高于集群控制平面版本后的两个次要版本

升级集群

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

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

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

手动升级控制平面

启动集群升级时,您有几分钟无法修改集群的配置,直到可再次访问控制平面为止。如果您需要在控制平面升级期间防止停机,请考虑使用地区级集群

您可以使用 Cloud Console 或 Google Cloud CLI 手动升级集群。升级集群后,您可以升级其节点。默认情况下,使用 Google Cloud Console 创建的节点已启用自动升级,因此该操作会自动执行。

gcloud

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

gcloud container get-server-config

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

gcloud container clusters upgrade CLUSTER_NAME --master

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

gcloud container clusters upgrade CLUSTER_NAME --master \
    --cluster-version VERSION

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

控制台

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

  1. 转到 Cloud Console 中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击所需的集群名称。

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

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

降级集群

如需将集群降级为先前的补丁程序版本,请使用以下命令更改集群控制平面版本:

gcloud container clusters upgrade CLUSTER_NAME \
  --master --cluster-version VERSION

停用集群自动升级

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

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

升级节点池

默认情况下,集群的节点已启用自动升级,我们建议您不要将其停用

升级节点池后,您可以配置超额配置升级设置,以控制 GKE 同时升级的节点数以及升级对工作负载的干扰程度。默认情况下,GKE 一次升级一个节点。

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

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

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

手动升级节点池

您可以将节点池版本手动升级为与控制平面版本匹配的版本,或仍然可用且与控制平面兼容的先前版本。Kubernetes 版本和版本倾斜支持政策可保证控制平面与最多比控制平面低两个次要版本的节点兼容。例如,Kubernetes 1.13 控制平面与 Kubernetes 1.11 节点兼容。

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

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

gcloud

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

  • CLUSTER_NAME:要升级的节点池的集群的名称。
  • NODE_POOL_NAME:要升级的节点池的名称。
  • VERSION:节点升级到的 Kubernetes 版本。例如 --cluster-version=1.7.2cluster-version=latest

升级节点池:

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

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

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

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

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

控制台

如需使用 Cloud Console 升级节点池,请执行以下步骤:

  1. 转到 Cloud Console 中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在要修改的集群旁边,点击 操作,然后点击 修改

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

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

  5. 点击 修改

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

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

降级节点池

检查节点池升级状态

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

如需查看集群中每个正在运行和已完成的操作的列表,请运行以下命令:

gcloud beta container operations list

系统会为每个操作分配操作 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 beta container operations describe OPERATION_ID

例如:

gcloud beta 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

取消节点池升级

您可以随时取消升级。取消升级时,情况如下:

  • 已经开始升级的节点会完成升级。
  • 尚未开始升级的节点不会升级。
  • 已成功完成升级的节点不受影响且不会回滚。
  1. 使用以下命令获取升级的操作 ID

    gcloud container operations list
    
  2. 运行以下命令可以取消升级:

    gcloud beta container operations cancel OPERATION_ID
    

请参阅 gcloud container operations cancel 文档。

回滚节点池升级

您可以将无法升级或已取消升级的节点池回滚到其先前版本的 Kubernetes。升级成功后,您无法回滚节点池。尚未开始升级的节点不受影响。

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

gcloud container node-pools rollback NODE_POOL_NAME \
  --cluster CLUSTER_NAME

替换以下内容:

  • NODE_POOL_NAME:要回滚的节点池的名称。
  • CLUSTER_NAME:要从中回滚节点池的集群的名称。

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

更改超额配置升级参数

借助超额配置升级,您可以更改 GKE 同时升级的节点数以及升级对工作负载造成的中断时长。

我们为每个节点池定义了 max-surge-upgrademax-unavailable-upgrade 标志。如需详细了解如何选择正确的参数,请参阅确定最佳超额配置

您可以在创建或更新集群或节点池时更改这些设置。

以下变量将用于下文提到的命令:

  • CLUSTER_NAME:节点池的集群名称。
  • COMPUTE_ZONE:集群的区域。
  • NODE_POOL_NAME:节点池的名称。
  • NUMBER_NODES:每个集群的区域的节点池中的节点数。
  • SURGE_NODES:每次升级节点池时要创建的额外(超额配置)节点的数量。
  • UNAVAILABLE_NODES:是每次升级节点池时不可用的节点数。

创建具有特定超额配置参数的集群

如需创建具有特定超额配置升级设置的集群,请使用 max-surge-upgrademax-unavailable-upgrade 标志。

gcloud container clusters create CLUSTER_NAME \
  --max-surge-upgrade=SURGE_NODES --max-unavailable-upgrade=UNAVAILABLE_NODES

创建停用超额配置升级的集群

如需创建停用超额配置升级的集群,请将 max-surge-upgrade 标志的值设置为 0

gcloud container clusters create CLUSTER_NAME \
  --max-surge-upgrade=0 --max-unavailable-upgrade=1

创建具有特定超额配置参数的节点池

如需在现有集群中创建具有特定超额配置升级设置的节点池,请使用 max-surge-upgrademax-unavailable-upgrade 标志。

gcloud container node-pools create NODE_POOL_NAME \
  --num-nodes=NUMBER_NODES --cluster=CLUSTER_NAME \
  --max-surge-upgrade=SURGE_NODES --max-unavailable-upgrade=UNAVAILABLE_NODES

为现有节点池启用或停用超额配置升级

如需更新现有节点池的升级设置,请使用 max-surge-upgrademax-unavailable-upgrade 标志。如果将 max-surge-upgrade 设置为大于 0,则 GKE 会创建超额配置节点。如果将 max-surge-upgrade 设置为 0,则 GKE 不会创建超额配置节点。

gcloud beta container node-pools update NODE_POOL_NAME \
  --cluster=CLUSTER_NAME \
  --max-surge-upgrade=SURGE_NODES --max-unavailable-upgrade=UNAVAILABLE_NODES

检查节点池上是否启用了超额配置升级

如需查看节点池上是否启用了超额配置升级,请使用 gcloud 描述集群的参数:

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

已知问题

如果您配置的 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 的每个节点,升级额外需要一个小时。

问题排查

节点 CPU 使用率高于预期

您可能会遇到一些节点的 CPU 使用率高于正在运行的 Pod 的预期使用率的问题。

如果您的集群或节点未运行受支持的版本,则可能会发生这种情况。查看版本说明,确保您使用的版本可用且受支持。您还可以运行以下命令以列出所有支持的集群和节点版本:

gcloud container get-server-config

后续步骤