添加和管理节点池


本页面介绍了如何添加运行 Google Kubernetes Engine (GKE) Standard 集群的节点池以及如何对该节点池执行操作。如需了解节点池的工作原理,请参阅节点池简介

集群可以在多个节点池上并行执行操作,例如节点自动预配。您可以在创建、更新或删除其他节点池的同时,手动创建、更新或删除节点池。

这些说明不适用于 Autopilot 集群,因为 GKE 会管理这些集群中的节点,并且您无法管理这些集群中的节点池。如需了解详情,请参阅 Autopilot 概览

准备工作

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

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

向标准集群添加节点池

您可以使用 gcloud CLI、Google Cloud 控制台或 Terraform 向 GKE Standard 集群添加新的节点池。GKE 还支持节点自动预配功能,该功能会根据扩缩要求自动管理集群中的节点池。

在上面两种情况下,最佳实践是创建并使用具有最低特权的 Identity and Access Management (IAM) 服务账号,以供节点池使用,而不是使用 Compute Engine 默认服务账号。如需了解如何创建具有最低特权的服务账号,请参阅强化集群的安全性

gcloud

要创建节点池,请运行 gcloud container node-pools create 命令:

gcloud container node-pools create POOL_NAME \
    --cluster CLUSTER_NAME \
    --service-account SERVICE_ACCOUNT

替换以下内容:

  • POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:现有集群的名称。
  • SERVICE_ACCOUNT:您的节点要使用的 IAM 服务账号的名称。如果省略,则节点池会使用 Compute Engine 默认服务账号
  • 如需通过专用 IP 地址预配节点,请添加 --enable-private-nodes 标志。您可以在使用 Private Service Connect 的公共集群中使用此标志。如需检查您的集群是否使用 Private Service Connect,请参阅使用 Private Service Connect 的公共集群

如需查看您可以指定的可选标志的完整列表,请参阅 gcloud container node-pools create 文档。

输出类似于以下内容:

Creating node pool POOL_NAME...done.
Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-central1/clusters/CLUSTER_NAME/nodePools/POOL_NAME].
NAME: POOL_NAME
MACHINE_TYPE: e2-medium
DISK_SIZE_GB: 100
NODE_VERSION: 1.21.5-gke.1302

在此输出中,您将看到有关节点池的详细信息,例如机器类型以及在节点上运行的 GKE 版本。

有时节点池已成功创建,但 gcloud 命令会超时,而不是报告服务器的状态。要检查所有节点池的状态,包括尚未完全预配的节点池,请使用以下命令:

gcloud container node-pools list --cluster CLUSTER_NAME

控制台

要将节点池添加到现有 Standard 集群,请执行以下步骤:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的 Standard 集群的名称。

  3. 点击 添加节点池

  4. 配置节点池。

  5. 在导航菜单中,点击安全

  6. 服务账号下拉菜单中,选择要使用的节点池的 IAM 服务账号。默认情况下,节点池使用 Compute Engine 默认服务账号

  7. 点击创建以添加节点池。

Terraform

如需使用 Terraform 将节点池添加到现有的 Standard 集群,请参阅以下示例:

resource "google_container_node_pool" "default" {
  name    = "gke-standard-regional-node-pool"
  cluster = google_container_cluster.default.name

  node_config {
    service_account = google_service_account.default.email
  }
}

如需详细了解如何使用 Terraform,请参阅针对 GKE 的 Terraform 支持

查看 Standard 集群中的节点池

gcloud

要列出 Standard 集群的所有节点池,请运行 gcloud container node-pools list 命令:

gcloud container node-pools list --cluster CLUSTER_NAME

要查看特定节点池的详细信息,请运行 gcloud container node-pools describe 命令:

gcloud container node-pools describe POOL_NAME \
    --cluster CLUSTER_NAME

替换以下内容:

  • CLUSTER_NAME:集群的名称。
  • POOL_NAME:要查看的节点池的名称。

控制台

如需查看 Standard 集群的节点池,请执行以下步骤:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击 Standard 集群的名称。

  3. 点击节点标签页。

  4. 节点池下,点击要查看的节点池的名称。

缩放节点池

您可以缩放节点池,以优化性能和费用。 借助 GKE Standard 节点池,您可以通过更改节点池中的节点数来横向扩缩节点池,或者通过更改节点的机器属性配置来纵向扩缩节点池

通过更改节点数进行横向扩缩

gcloud

如需调整集群节点池的大小,请运行 gcloud container clusters resize 命令:

gcloud container clusters resize CLUSTER_NAME \
    --node-pool POOL_NAME \
    --num-nodes NUM_NODES

替换以下内容:

  • CLUSTER_NAME:要调整大小的集群的名称。
  • POOL_NAME:要调整大小的节点池的名称。
  • NUM_NODES:可用区级集群中的池中的节点数。如果您使用多区域级或多地区级集群,则 NUM_NODES 是节点池所在的每个区域的节点数。

对每个节点池重复此命令。如果集群只有一个节点池,请省略 --node-pool 标志。

控制台

要调整集群节点池的大小,请执行以下步骤:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的 Standard 集群的名称。

  3. 点击节点标签页。

  4. 节点池部分中,点击要调整大小的节点池的名称。

  5. 点击 调整大小

  6. 节点数字段中,输入节点池中所需的节点数量,然后点击调整大小

  7. 根据需要对每个节点池重复此操作。

通过更改节点机器属性进行纵向扩缩

您可以修改节点池已配置的机器类型、磁盘类型和磁盘大小。

修改一个或多个机器属性时,GKE 会使用为节点池配置的升级策略将节点更新为新配置。如果您配置了蓝绿升级策略,则可以将工作负载从原始节点迁移到新节点,如果迁移失败,同时还能回滚原始节点。检查节点池的升级设置,确保配置的策略采用所需的节点更新方式。

在以下命令中,至少更新一个突出显示的机器属性:

gcloud container node-pools update POOL_NAME \
    --cluster CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --disk-type DISK_TYPE \
    --disk-size DISK_SIZE

忽略您不想更改的机器属性的任何标志。但您必须至少使用一个机器属性标志,否则该命令会失败。

替换以下内容:

  • POOL_NAME:要调整大小的节点池的名称。
  • CLUSTER_NAME:要调整大小的集群的名称。
  • MACHINE_TYPE:用于节点的机器类型。如需了解详情,请参阅 gcloud container node-pools update
  • DISK_TYPE:节点虚拟机启动磁盘的类型,必须是 pd-standardpd-ssdpd-balanced 之一。
  • DISK_SIZE:节点虚拟机启动磁盘的大小(以 GB 为单位)。默认值为 100 GB。

在节点池之间迁移工作负载

如果您想在一个节点池和另一个节点池之间迁移工作负载,请按照说明在节点池之间迁移工作负载。例如,如果您要将现有节点池替换为新节点池,并希望确保将工作负载从旧节点迁移到新节点,则可以使用这些说明。

升级节点池

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

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

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

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

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

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

手动升级节点池

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

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

您可以使用 Google Cloud 控制台或 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 文档。

控制台

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

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

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

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

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

  5. 点击 修改

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

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

将 Pod 部署到特定节点池

您可以使用 Pod 清单中的 nodeSelector 明确地将 Pod 部署到特定节点池。nodeSelector 将 Pod 调度到具有匹配标签的节点上。

所有 GKE 节点池都具有格式如下所示的标签:cloud.google.com/gke-nodepool: POOL_NAME。向 Pod 中的 nodeSelector 字段添加此标签,如以下示例所示:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    cloud.google.com/gke-nodepool: POOL_NAME

如需了解详情,请参阅将 Pod 分配给节点

作为节点选择器的替代方案,您可以使用节点亲和性。如果您需要使用“软”规则,请使用节点亲和性,所谓软规则,就是您希望 Pod 尝试满足限制条件,但即使无法满足限制条件,也仍被调度。如需了解详情,请参阅节点亲和性。您还可以为容器指定资源请求量

使节点池降级

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

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

删除节点池

删除节点池会删除节点和所有正在运行的工作负载,而不会考虑 PodDisruptionBudget 设置。如需详细了解这会如何影响您的工作负载(包括与节点选择器的互动),请参阅删除节点池

gcloud

要删除节点池,请运行 gcloud container node-pools delete 命令:

gcloud container node-pools delete POOL_NAME \
    --cluster CLUSTER_NAME

控制台

要删除节点池,请执行以下步骤:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的 Standard 集群的名称。

  3. 点击节点标签页。

  4. 节点池部分中,点击要删除的节点池旁边的

  5. 当系统提示您确认时,点击删除

问题排查

如需了解问题排查信息,请参阅排查标准节点池问题排查节点注册问题

后续步骤