默认情况下,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
并按照说明操作:gcloud init
如果您要在远程服务器上使用 SSH,请使用
--console-only
标志来防止命令启动浏览器:gcloud init --console-only
- 按照说明授权 gcloud CLI 使用您的 Google Cloud 帐号。
- 创建新配置或选择现有配置。
- 选择 Google Cloud 项目。
- 选择默认的 Compute Engine 可用区。
- 选择默认的 Compute Engine 区域。
- 设置默认项目 ID:
gcloud config set project PROJECT_ID
- 设置默认的 Compute Engine 区域(例如
us-central1
):gcloud config set compute/region COMPUTE_REGION
- 设置默认的 Compute Engine 可用区(例如
us-central1-c
):gcloud config set compute/zone COMPUTE_ZONE
- 将
gcloud
更新到最新版本:gcloud components update
gcloud init
gcloud config
通过设置默认位置,您可以避免 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
)。如需了解详情,请参阅指定集群版本。
控制台
如需手动更新集群控制平面,请执行以下步骤:
转到 Cloud Console 中的 Google Kubernetes Engine 页面。
点击所需的集群名称。
在集群基本信息下,点击版本旁边的 edit 可用升级。
选择所需的版本,然后点击保存更改。
降级集群
如需将集群降级为先前的补丁程序版本,请使用以下命令更改集群控制平面版本:
gcloud container clusters upgrade CLUSTER_NAME \
--master --cluster-version VERSION
停用集群自动升级
基础架构安全性对于 GKE 而言具有较高的优先级,因此,控制平面会定期升级,并且无法停用。但是,您可以通过应用维护期和排除项来临时暂停控制平面和节点的升级。
您可以停用节点自动升级,但我们不建议您这样做。
升级节点池
默认情况下,集群的节点已启用自动升级,我们建议您不要将其停用。
升级节点池后,您可以配置超额配置升级设置,以控制 GKE 同时升级的节点数以及升级对工作负载的干扰程度。默认情况下,GKE 一次升级一个节点。
当某个节点正在升级时,GKE 会停止将新的 Pod 调度到该节点上,并尝试将其正在运行的 Pod 调度到其他节点上。这与重新创建节点的其他事件(例如启用或停用节点池中的功能)类似。
只有在重新创建所有节点且集群处于所需状态后,升级才算完成。当新升级的节点向控制平面注册时,GKE 会将该节点标记为可调度。
新节点实例会运行所需的 Kubernetes 版本以及:
- 节点映像
- Docker 守护进程(如果适用)
kubelet
kube-proxy
手动升级节点池
您可以将节点池版本手动升级为与控制平面版本匹配的版本,或仍然可用且与控制平面兼容的先前版本。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.2
或cluster-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 升级节点池,请执行以下步骤:
转到 Cloud Console 中的 Google Kubernetes Engine 页面。
在要修改的集群旁边,点击 more_vert 操作,然后点击 edit 修改。
在集群详情页面上,点击节点标签页。
在节点池部分,点击要升级的节点池的名称。
点击 edit 修改。
点击节点版本下的更改。
从节点版本下拉列表中选择所需的版本,然后点击更改。
降级节点池
检查节点池升级状态
您可以使用 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
取消节点池升级
您可以随时取消升级。取消升级时,情况如下:
- 已经开始升级的节点会完成升级。
- 尚未开始升级的节点不会升级。
- 已成功完成升级的节点不受影响且不会回滚。
使用以下命令获取升级的操作 ID:
gcloud container operations list
运行以下命令可以取消升级:
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-upgrade
和 max-unavailable-upgrade
标志。如需详细了解如何选择正确的参数,请参阅确定最佳超额配置。
您可以在创建或更新集群或节点池时更改这些设置。
以下变量将用于下文提到的命令:
CLUSTER_NAME
:节点池的集群名称。COMPUTE_ZONE
:集群的区域。NODE_POOL_NAME
:节点池的名称。NUMBER_NODES
:每个集群的区域的节点池中的节点数。SURGE_NODES
:每次升级节点池时要创建的额外(超额配置)节点的数量。UNAVAILABLE_NODES
:是每次升级节点池时不可用的节点数。
创建具有特定超额配置参数的集群
如需创建具有特定超额配置升级设置的集群,请使用 max-surge-upgrade
和 max-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-upgrade
和 max-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-upgrade
和 max-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
对象无法允许任何额外的中断,则节点升级可能会在反复尝试后仍无法升级到控制平面版本。为防止此故障,我们建议您扩容 Deployment
或 HorizontalPodAutoscaler
,以允许节点排空,同时仍遵循 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