添加和管理节点池

本页面介绍了如何添加、管理、扩缩、升级和删除在 Google Kubernetes Engine (GKE) Standard 集群中运行的节点池,以便优化 GKE Standard 集群以获得相应的性能和可伸缩性。Standard 集群中的节点池包括 Standard 节点池和由 Autopilot 管理的节点池。本文档中的内容专门针对 Standard 节点池进行阐述,不过介绍如何升级节点池的部分除外。您还将了解如何将 Pod 部署到特定 Standard 节点池,以及节点池升级对正在运行的工作负载的影响。

本页面适用于需要在 GKE 上创建和配置集群以及部署工作负载的运维人员、云架构师和开发者。如需详细了解我们在 Google Cloud内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

在阅读本页面之前,请确保您熟悉节点池

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

为 GKE 设置 IAM 服务账号

GKE 使用关联到节点的 IAM 服务账号来运行日志记录和监控等系统任务。这些节点服务账号必须至少拥有项目的 Kubernetes Engine Default Node Service Account (roles/container.defaultNodeServiceAccount) 角色。默认情况下,GKE 会将 Compute Engine 默认服务账号(在您的项目中自动创建)用作节点服务账号。

如需向 Compute Engine 默认服务账号授予 roles/container.defaultNodeServiceAccount 角色,请完成以下步骤:

控制台

  1. 前往欢迎页面:

    前往“欢迎”页面

  2. 项目编号字段中,点击 复制到剪贴板
  3. 转到 IAM 页面:

    转到 IAM

  4. 点击 授予访问权限
  5. 新的主账号字段中,指定以下值:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    PROJECT_NUMBER 替换为您复制的项目编号。
  6. 选择角色菜单中,选择 Kubernetes Engine Default Node Service Account 角色。
  7. 点击保存

gcloud

  1. 找到您的 Google Cloud 项目编号:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    PROJECT_ID 替换为您的项目 ID。

    输出内容类似如下:

    12345678901
    
  2. roles/container.defaultNodeServiceAccount 角色授予 Compute Engine 默认服务账号:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    PROJECT_NUMBER 替换为上一步中的项目编号。

向标准集群添加节点池

您可以使用 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 \
    --location=CONTROL_PLANE_LOCATION \
    --service-account SERVICE_ACCOUNT

替换以下内容:

  • POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:现有集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。
  • SERVICE_ACCOUNT:您的节点要使用的 IAM 服务账号的名称。

    我们强烈建议您指定节点可以使用的具有最低权限的 IAM 服务账号,而不是 Compute Engine 默认服务账号。如需了解如何创建具有最低权限的服务账号,请参阅使用最小权限服务账号

    如需在 gcloud CLI 中指定自定义服务账号,请在您的命令中添加以下标志:

    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    SERVICE_ACCOUNT_NAME 替换为具有最低权限的服务账号的名称。

如需查看您可以指定的可选标志的完整列表,请参阅 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 \
    --location=CONTROL_PLANE_LOCATION

控制台

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

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

    转到 Google Kubernetes Engine

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

  3. 点击 添加节点池

  4. 配置节点池。

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

  6. (可选)为节点指定自定义 IAM 服务账号:
    1. 高级设置页面中,展开安全部分。
    2. 服务账号菜单中,选择您想使用的服务账号。

    我们强烈建议您指定节点可以使用的具有最低权限的 IAM 服务账号,而不是 Compute Engine 默认服务账号。如需了解如何创建具有最低权限的服务账号,请参阅使用最小权限服务账号

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

Terraform

使用以下示例之一:

  • 添加使用 Compute Engine 默认 IAM 服务账号的节点池:
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
  }
}
  • 添加使用自定义 IAM 服务账号的节点池:
  1. 创建 IAM 服务账号并向其授予针对项目的 roles/container.defaultNodeServiceAccount 角色:

    resource "google_service_account" "default" {
      account_id   = "service-account-id"
      display_name = "Service Account"
    }
    
    data "google_project" "project" {
    }
    
    resource "google_project_iam_member" "default" {
      project = data.google_project.project.project_id
      role    = "roles/container.defaultNodeServiceAccount"
      member  = "serviceAccount:${google_service_account.default.email}"
    }
  2. 创建一个使用新服务账号的节点池:

    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 \
    --location=CONTROL_PLANE_LOCATION

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

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

替换以下内容:

  • CLUSTER_NAME:集群的名称。
  • POOL_NAME:要查看的节点池的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。

控制台

如需查看 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 \
    --location=CONTROL_PLANE_LOCATION \
    --node-pool POOL_NAME \
    --num-nodes NUM_NODES

替换以下内容:

  • CLUSTER_NAME:要调整大小的集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。
  • 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 \
    --location=CONTROL_PLANE_LOCATION \
    --machine-type MACHINE_TYPE \
    --disk-type DISK_TYPE \
    --disk-size DISK_SIZE

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

替换以下内容:

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

此更改需要重新创建节点,这可能会导致正在运行的工作负载中断。如需详细了解此特定更改,请在使用节点升级策略(而不遵循维护政策)重新创建节点的手动更改表格中找到相应的行。如需详细了解节点更新,请参阅规划节点更新中断

升级节点池

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

最佳实践

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

借助 GKE Standard 节点池升级,您可以选择两种可配置的升级策略,即超额配置升级蓝绿升级。Standard 集群中由 Autopilot 管理的节点池始终使用超额配置升级。

对于 Standard 节点池,选择策略使用参数调整策略可最符合您的集群环境的需求。

节点升级的工作原理

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

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

最佳实践

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

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

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

新节点实例会运行新的 Kubernetes 版本以及以下内容:

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

手动升级节点池

您可以手动升级 Standard 集群中 Standard 节点池或由 Autopilot 管理的节点池的版本。您可以将节点池版本与控制平面版本保持一致,也可以使用仍然可用且与控制平面兼容的先前版本。您可以手动并行升级多个节点池,而 GKE 一次只能自动升级一个节点池。

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

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

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

您可以手动将节点池升级到与控制平面兼容的版本:

  • 对于 Standard 节点池,您可以使用 Google Cloud 控制台或 Google Cloud CLI。
  • 对于由 Autopilot 管理的节点池,您只能使用 Google Cloud CLI。

控制台

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

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

    转到 Google Kubernetes Engine

  2. 点击集群的名称。

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

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

  5. 点击 修改

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

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

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

gcloud

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

  • CLUSTER_NAME:要升级的节点池的集群的名称。
  • NODE_POOL_NAME:要升级的节点池的名称。
  • CONTROL_PLANE_LOCATION:控制平面的位置(区域或可用区),例如 us-central1us-central1-a
  • VERSION:节点升级到的 Kubernetes 版本。例如 --cluster-version=1.34.1-gke.1293000cluster-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 文档。

将 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 设置。如需详细了解这会如何影响您的工作负载(包括与节点选择器的互动),请参阅删除节点池

您只能删除 Standard 节点池。您无法删除在 Standard 集群中运行的由 Autopilot 管理的节点池,GKE 会在不再需要这些节点池时自动清理它们。

gcloud

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

gcloud container node-pools delete POOL_NAME \
    --cluster CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

替换以下内容:

  • POOL_NAME:要删除的节点池的名称。
  • CLUSTER_NAME:您的集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。

控制台

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

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

    转到 Google Kubernetes Engine

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

  3. 点击节点标签页。

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

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

将节点迁移到其他机器类型

如需了解在机器类型之间移动工作负载的不同方法(例如,迁移到较新的机器类型),请参阅将节点迁移到其他机器类型

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

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

问题排查

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

后续步骤