默认情况下,Google Kubernetes Engine 集群和节点池会由 Google 自动升级。本页面介绍如何为 GKE 集群或其节点手动请求升级或降级。您可以详细了解自动和手动升级集群的工作原理。您还可以通过配置维护期和排除项来控制可以和不能自动升级的时间。
新版本的 GKE 会定期发布。如要了解可用的版本,请参阅版本控制。如需详细了解集群,请参阅集群架构。如需了解如何升级集群,请参阅升级集群的最佳做法。
准备工作
在开始之前,请确保您已执行以下任务:
- 确保您已启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 确保您已安装 Cloud SDK。
使用以下任一方法设定默认的 gcloud
设置:
- 使用
gcloud init
(如果您想要在系统引导下完成默认设置)。 - 使用
gcloud config
(如果您想单独设置项目 ID、区域和地区)。
使用 gcloud init
如果您收到 One of [--zone, --region] must be supplied: Please specify
location
错误,请完成本部分。
-
运行
gcloud init
并按照说明操作:gcloud init
如果您要在远程服务器上使用 SSH,请使用
--console-only
标志来防止命令启动浏览器:gcloud init --console-only
-
按照说明授权
gcloud
使用您的 Google Cloud 帐号。 - 创建新配置或选择现有配置。
- 选择 Google Cloud 项目。
- 选择默认的 Compute Engine 区域。
使用 gcloud config
将数据保存到永久性磁盘
升级节点池之前,请务必将希望保留的所有数据存储在使用永久性磁盘的永久性卷的 Pod 中。 在升级期间,永久性磁盘会被卸载,而不是被清空,并且其数据会在 Pod 之间“移交”。
永久性磁盘存在以下限制:
- 运行 Pod 的节点必须是 Compute Engine 虚拟机
- 这些虚拟机和永久性磁盘必须位于同一 Compute Engine 项目和地区中
如需了解如何将 Persistent Disk 添加到现有节点实例,请参阅 Compute Engine 文档中的添加地区级 Persistent Disk 或调整其大小。
关于升级集群
限制
Alpha 版集群无法升级。
支持的版本
版本说明会通知何时推出新版本以及何时不再提供旧版本。您可以随时使用以下命令列出所有支持的集群和节点版本:
gcloud container get-server-config
已知问题
如果您在集群上安装了 Anthos Service Mesh 或 OSS Istio,用户节点可能会在多次尝试后仍无法升级到控制层面版本,具体取决于 Istio 组件的 PodDisruptionBudget 设置。为避免此故障,我们建议您在升级之前,将 istio-system
命名空间中组件的 Pod 横向自动扩缩的 minReplicas
设置从 1 增加到 2。这样可以确保您始终具有 ASM 控制层面运行实例。
如果您拥有 Anthos Service Mesh 1.5 及更高版本或 OSS Istio 1.5 及更高版本,请运行以下命令:
kubectl patch hpa -n istio-system istio-ingressgateway -p '{"spec":{"minReplicas": 2}}' --type=merge
kubectl patch hpa -n istio-system istiod -p '{"spec":{"minReplicas": 2}}' --type=merge
如果您拥有 Anthos Service Mesh 1.4.x 或 OSS Istio 1.4.x,请运行以下命令:
kubectl patch hpa -n istio-system istio-galley -p '{"spec":{"minReplicas": 2}}' --type=merge
kubectl patch hpa -n istio-system istio-ingressgateway -p '{"spec":{"minReplicas": 2}}' --type=merge
kubectl patch hpa -n istio-system istio-nodeagent -p '{"spec":{"minReplicas": 2}}' --type=merge
kubectl patch hpa -n istio-system istio-pilot -p '{"spec":{"minReplicas": 2}}' --type=merge
kubectl patch hpa -n istio-system istio-sidecar-injector -p '{"spec":{"minReplicas": 2}}' --type=merge
虽然自动升级可能会遇到问题,但自动升级过程会强制节点升级。但是,对于 istio-system
命名空间中违反 PodDisableionBudget 的每个节点,升级额外需要一个小时。
降级限制
不建议对集群进行降级。节点可以降级为早于集群版本的补丁程序版本。您无法将集群从一个次要版本降级到另一个次要版本。例如,如果集群正在运行 GKE 1.11.5,则可以降级到 1.11.4(如果该版仍然可用),但您无法降级到 1.10.9。而是系统会生成如下错误:
ERROR: (gcloud.container.clusters.upgrade) ResponseError: code=400,
message=Master cannot be upgraded to "1.10.9-gke.9": specified version is not
newer than the current version.
升级集群
Google 会自动升级集群和节点。为了更好地控制集群及其节点接收的自动升级,您可以在发布渠道中注册集群。
如需详细了解如何管理集群的 GKE 版本,请参阅升级。
您可以在新版本推出后的任意时间启动手动升级。
手动升级控制层面
启动集群升级时,您有几分钟无法修改集群的配置,直到可再次访问控制平面为止。如果您需要在控制层面升级期间防止停机,请考虑使用地区级集群。
您可以使用 Cloud Console 或 gcloud
命令行工具手动升级集群。升级集群后,您可以升级其节点。默认情况下,使用 Google Cloud Console 创建的节点已启用自动升级,因此该操作会自动执行。
gcloud
要升级集群控制层面的版本,请先运行以下命令查看可用的版本:
gcloud container get-server-config
如需升级到默认的集群版本,请运行以下命令:
gcloud container clusters upgrade CLUSTER_NAME --master
如需升级到非默认的特定版本,请运行以下命令:
gcloud container clusters upgrade CLUSTER_NAME \
--master --cluster-version VERSION
控制台
如需手动更新集群控制层面,请执行以下步骤:
访问 Google Cloud Console 中的 Google Kubernetes Engine 菜单。
点击所需的集群名称。
在集群基本信息下,点击版本旁边的 edit 可用升级。
选择所需的版本,然后点击保存更改。
降级集群
如需将集群降级为先前的补丁程序版本,请使用以下命令更改集群控制层面版本:
gcloud container clusters upgrade CLUSTER_NAME \
--master --cluster-version VERSION
停用集群自动升级
无法停用集群自动升级。您可以停用节点自动升级,但我们不建议您这样做。
升级节点
默认情况下,集群的节点已启用自动升级,我们建议您不要将其停用。
升级节点池后,您可以配置超额配置升级设置,以控制 GKE 同时升级的节点数以及升级对工作负载的干扰程度。默认情况下,GKE 一次升级一个节点。
当某个节点正在升级时,GKE 会停止将新的 Pod 调度到该节点上,并尝试将其正在运行的 Pod 调度到其他节点上。这与重新创建节点的其他事件(例如启用或停用节点池中的功能)类似。
只有在重新创建所有节点且集群处于所需状态后,升级才算完成。当新升级的节点向控制层面注册时,GKE 会将该节点标记为可调度。
新节点实例会运行所需的 Kubernetes 版本以及:
- 节点映像
- Docker 守护进程(如果适用)
kubelet
kube-proxy
手动升级节点
您可以将节点池版本手动升级为与控制层面版本匹配的版本,或仍然可用且与控制层面兼容的先前版本。Kubernetes 版本和版本倾斜支持政策可保证控制层面与最多比控制层面低两个次要版本的节点兼容。例如,Kubernetes 1.13 控制层面与 Kubernetes 1.11 节点兼容。
您可以使用 Google Cloud Console 或 gcloud
命令行工具手动将节点升级到与控制层面兼容的版本。
gcloud
以下命令可将节点升级到控制层面运行的版本:
gcloud container clusters upgrade CLUSTER_NAME \
--node-pool=NODE_POOL_NAME
将 CLUSTER_NAME 替换为要升级的集群的名称。
如需在节点上指定其他版本的 GKE,请使用可选 --cluster-version
标志:
gcloud container clusters upgrade CLUSTER_NAME \
--node-pool=NODE_POOL_NAME \
--cluster-version VERSION
将 VERSION
替换为节点已升级的 Kubernetes 版本。例如 --cluster-version=1.7.2
或 cluster-version=latest
。
如需详细了解如何指定版本,请参阅版本控制。
如需了解详情,请参阅 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