创建和管理节点池

创建用户集群时,您必须配置至少一个节点池,即一组具有相同配置的节点。创建集群后,您可以添加新的节点池、更新节点池设置和删除节点池。

选择用于管理节点池的工具

如何创建、更新和删除节点池取决于集群是否由 GKE On-Prem API 管理。如果满足以下任一条件,则用户集群由 GKE On-Prem API 管理:

  • 集群是在 Google Cloud 控制台中或使用 Google Cloud CLI (gcloud CLI) 创建的,后者会自动配置 GKE On-Prem API 来管理集群。

  • 该集群是使用 gkectl 创建的,但已配置为由 GKE On-Prem API 管理

如果 GKE On-Prem API 正在管理用户集群,您可以使用控制台或 gcloud CLI 管理节点池。如果用户集群不是由 GKE On-Prem API 管理,请在管理员工作站上使用 gkectl 来管理节点池。

如果您计划使用 gcloud CLI,请在已安装 gcloud CLI 的计算机上执行以下操作:

  1. 使用您的 Google 账号登录

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    

添加节点池

如果集群由 GKE On-Prem API 管理,您可以使用控制台或 gcloud CLI 添加节点池;但是,您需要在管理员工作站上使用 gkectl 来配置以下节点池设置:

在添加其他节点池之前,请验证集群上是否有足够的可用 IP 地址

gkectl

在管理员工作站上执行以下步骤:

  1. 用户集群配置文件中,填写 nodePools 部分。

    您必须指定以下字段:

    • nodePools.[i].name
    • nodePools[i].cpus
    • nodePools.[i].memoryMB
    • nodePools.[i].replicas

    以下字段是可选的。如果您未添加 nodePools[i].bootDiskSizeGBnodePools[i].osImageType,则系统会使用默认值。

    • nodePools[i].labels
    • nodePools[i].taints
    • nodePools[i].bootDiskSizeGB
    • nodePools[i].osImageType
    • nodePools[i].vsphere.datastore
    • nodePools[i].vsphere.tags
  2. 运行以下命令:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    替换以下内容:

    • ADMIN_CLUSTER_KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。

    • USER_CLUSTER_CONFIG 替换为用户集群配置文件的路径。

配置示例

以下示例配置中有四个节点池,每个节点池具有不同的特性:

  • pool-1:仅指定了所需的最少属性
  • pool-2:包括 vsphere.datastorevsphere.tags
  • pool-3:包括 taintslabels
  • pool-4:包括 osImageTypebootDiskSizeGB
nodePools:
- name: pool-1
  cpus: 4
  memoryMB: 8192
  replicas: 5
- name: pool-2
  cpus: 8
  memoryMB: 16384
  replicas: 3
  vsphere:
    datastore: my_datastore
    tags:
    - category: "purpose"
      name: "testing"
- name: pool-3
  cpus: 4
  memoryMB: 8192
  replicas: 5
  taints:
    - key: "example-key"
      effect: NoSchedule
  labels:
    environment: production
    app: nginx
- name: pool-4
  cpus: 4
  memoryMB: 8192
  replicas: 5
  osImageType: cos
  bootDiskSizeGB: 40

控制台

  1. 在控制台中,前往 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  2. 选择用户集群所在的 Google Cloud 项目。

  3. 在集群列表中,点击集群的名称,然后点击详细信息面板中的查看详细信息

  4. 点击添加节点池

  5. 配置节点池:

    1. 输入节点池名称
    2. 输入池中每个节点的 vCPUs 数量(每个用户集群工作器最少 4 个)。
    3. 输入池中每个节点的内存大小(以兆字节 (MiB) 为单位,每个用户集群工作器节点最少 8192 MiB,并且必须是 4 的倍数)。
    4. 节点字段中,输入池中的节点数(最少 3 个)。
    5. 选择操作系统映像类型Ubuntu ContainerdCOS

    6. 输入启动磁盘大小(以吉比字节 (GiB) 为单位,默认值为 40 GiB)。

  6. 节点池元数据(可选)部分中,如果要添加 Kubernetes 标签污点,请执行以下操作:

    1. 点击 + 添加 Kubernetes 标签。输入标签的。根据需要重复上述步骤。
    2. 点击 + 添加污点。输入污点的效果。根据需要重复上述步骤。
  7. 点击创建

  8. Google Cloud 控制台会显示集群状态:正在更改。点击显示详情,以查看资源状态条件状态消息

gcloud CLI

运行以下命令以创建节点池:

gcloud container vmware node-pools create NODE_POOL_NAME \
  --cluster=USER_CLUSTER_NAME  \
  --project=FLEET_HOST_PROJECT_ID \
  --location=LOCATION \
  --image-type=IMAGE_TYPE  \
  --boot-disk-size=BOOT_DISK_SIZE \
  --cpus=vCPUS \
  --memory=MEMORY \
  --replicas=NODES

替换以下内容:

  • NODE_POOL_NAME:您为节点池选择的名称。该名称必须:

    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • USER_CLUSTER_NAME:将在其中创建节点池的用户集群的名称。

  • FLEET_HOST_PROJECT_ID:集群在其中注册的项目的 ID。

    • LOCATION:与用户集群关联的 Google Cloud 位置。

    • IMAGE_TYPE:要在节点池中的虚拟机上运行的操作系统映像类型。设置为以下其中一项:ubuntu_containerdcos

    • BOOT_DISK_SIZE:池中每个节点的启动磁盘的大小(以吉比字节 [GiB] 为单位)。最小值为 40 GiB。

    • vCPUs:节点池中每个节点的 vCPU 数量。最小值为 4。

    • MEMORY:池中每个节点的内存大小(以兆比字节 [MiB] 为单位)。每个用户集群工作器节点至少需要 8192 MiB,并且该值必须是 4 的倍数。

    • NODES:节点池中的节点数。最小值为 3。

    例如:

    gcloud container vmware node-pools create default-pool \
      --cluster=user-cluster-1  \
      --location=us-west1 \
      --image-type=ubuntu_containerd  \
      --boot-disk-size=40 \
      --cpus=8 \
      --memory=8192 \
      --replicas=5
    

    您可以选择性地指定以下内容:

    • --enable-load-balancer:仅与 MetalLB 负载均衡器相关。如果已指定,则允许 MetalLB speaker 在池中的节点上运行。必须至少为 MetalLB 负载均衡器启用一个节点池。

    • --image=IMAGE:vCenter 中的操作系统映像名称。

    • --node-labels=KEY=VALUE,...:应用于池中每个节点的 Kubernetes 标签(键值对)的英文逗号分隔列表。

    • --node-taints=KEY=VALUE:EFFECT,... 应用于池中每个节点的 Kubernetes 污点的逗号分隔列表。污点是与效果相关联的键值对。污点用于 Pod 调度的容忍。为 EFFECT 指定以下其中一项:NoSchedulePreferNoScheduleNoExecute

    例如:

    gcloud container vmware node-pools create default-pool \
        --cluster=user-cluster-1  \
        --location=us-west1 \
        --image-type=ubuntu_containerd  \
        --boot-disk-size=40 \
        --cpus=8 \
        --memory=8192 \
        --replicas=5 \
        --node-taints=key1=val1:NoSchedule,key2=val2:NoExecute
    

    如需了解其他可选标志,请参阅 gcloud 参考文档

更新节点池

当您增加副本数量时,GKE on VMware 会向用户集群添加所需数量的节点;当您减少副本数量时,系统会移除节点。更改节点池的副本数量不会中断工作负载。如果增加副本数量,请确保有可用的 IP 地址。

如果您更新任何其他节点池字段,则会触发集群的滚动更新。在滚动更新中,GKE on VMware 会创建新节点,然后删除旧节点。系统会重复此过程,直到所有旧节点都替换为新节点。此过程不会导致停机,但在更新期间集群必须有一个额外的 IP 地址可供使用。

假设节点池在更新结束时将有 N 个节点。那么,您必须至少有 N+1 个 IP 地址可用于该池中的节点。这意味着,如果要通过向一个或多个池添加节点来调整集群大小,则在结束大小调整时,您所拥有的的 IP 地址数量应该至少比集群的所有节点池中的节点总数多出一个。 如需了解详情,请参阅验证是否有足够的可用 IP 地址

如需更新用户集群上的节点池,请执行以下操作:

gkectl

  1. 在用户集群配置文件的 nodePools 部分中修改要更改的字段的值。

  2. 更新集群:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    替换以下内容:

    • ADMIN_CLUSTER_KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。

    • USER_CLUSTER_CONFIG 替换为用户集群配置文件的路径。

更新节点池使用的 osImageType

如需更新节点池以使用其他 osImageType,您必须使用命令行。如需更改节点池使用的 osImageType,请更新节点池的配置文件(如以下示例所示),然后运行 gkectl update cluster

nodePools:
- name: np-1
  cpus: 4
  memoryMB: 8192
  replicas: 3
  osImageType: ubuntu_containerd

控制台

您只能使用控制台更新以下字段:

  • 副本数量
  • 内存
  • vCPU 的数量

如需更新其他字段,请使用 gcloud CLI 或 gkectl

  1. 在控制台中,前往 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  2. 选择用户集群所在的 Google Cloud 项目。

  3. 在集群列表中,点击集群的名称,然后点击详细信息面板中的查看详细信息

  4. 点击节点标签页。

  5. 点击要修改的节点池的名称。

  6. 点击要修改的字段旁边的 修改,然后点击完成

  7. 点击 以返回到上一页。

  8. Google Cloud 控制台会显示集群状态:正在更改。点击显示详情,以查看资源状态条件状态消息

gcloud CLI

  1. 选择性地列出节点池以获取要更新的节点池的名称:

    gcloud container vmware node-pools list \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    
  2. 运行以下命令以更新节点池:

    gcloud container vmware node-pools update NODE_POOL_NAME \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION \
      --ATTRIBUTE_TO_UPDATE \
      ...
    

    替换以下内容:

    • NODE_POOL_NAME:要更新的节点池的名称。

    • USER_CLUSTER_NAME:包含节点池的用户集群的名称。

    • LOCATION:与用户集群关联的 Google Cloud 位置。

    • ATTRIBUTE_TO_UPDATE:用于更新节点池特性的一个或多个标志。例如,如需更改池中的 vCPU 和节点数量,请运行以下命令。

    gcloud container vmware node-pools update default-pool \
        --cluster=user-cluster-1  \
        --project=example-project-12345
        --location=us-west1 \
        --cpus=10 \
        --replicas=6
    

    如需了解您可以更新的节点池特性,请参阅 gcloud 参考文档

验证您的更改

如需验证节点池是否已创建或更新,请检查集群节点:

gkectl

运行以下命令:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get nodes -o wide

如果需要还原更改,请修改集群配置文件并运行 gkectl update cluster

控制台

  1. 在控制台中,前往 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  2. 选择用户集群所在的 Google Cloud 项目。

  3. 在集群列表中,点击集群的名称,然后点击详细信息面板中的查看详细信息

  4. 点击节点标签页。

  5. 点击要查看的节点池的名称。

gcloud CLI

运行以下命令:

gcloud container vmware node-pools describe NODE_POOL_NAME \
  --cluster=USER_CLUSTER_NAME \
  --project=FLEET_HOST_PROJECT_ID \
  --location=LOCATION

删除节点池

虽然您可以删除节点池,但用户集群必须至少具有一个节点池。删除节点池会导致系统立即移除池中的节点,无论这些节点是否正在运行工作负载。

要从用户集群中删除节点池,请执行以下操作:

gkectl

  1. 确保受影响的节点上没有工作负载运行。

  2. 从用户集群配置文件的 nodePools 部分移除其定义。

  3. 更新集群:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    替换以下内容:

    • [ADMIN_CLUSTER_KUBECONFIG] 替换为管理员集群的 kubeconfig 文件的路径。

    • [USER_CLUSTER_CONFIG] 替换为用户集群配置文件的路径。

控制台

  1. 确保受影响的节点上没有工作负载运行。

  2. 在控制台中,前往 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  3. 选择用户集群所在的 Google Cloud 项目。

  4. 在集群列表中,点击集群的名称,然后点击详细信息面板中的查看详细信息

  5. 点击节点标签页。

  6. 点击要删除的节点池的名称。

  7. 点击 删除

  8. 点击 以返回到上一页。

  9. Google Cloud 控制台会显示集群状态:正在更改。点击显示详情,以查看资源状态条件状态消息

gcloud CLI

  1. 选择性地列出节点池以获取要删除的节点池的名称:

    gcloud container vmware node-pools list \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    
  2. 运行以下命令以删除节点池:

    gcloud container vmware node-pools delete NODE_POOL_NAME \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    

    替换以下内容:

    • NODE_POOL_NAME:要删除的节点池的名称。

    • USER_CLUSTER_NAME:包含节点池的用户集群的名称。

    • LOCATION:与用户集群关联的 Google Cloud 位置。

问题排查

  • 通常,gkectl update cluster 命令会在失败时提供详细信息。如果命令成功并且您没有看到节点,则可以使用诊断集群问题指南进行问题排查。

  • 集群资源可能不足,例如在创建或更新节点池期间缺少可用的 IP 地址。请参阅调整用户集群大小主题,详细了解如何验证是否有可用的 IP 地址。

  • 您还可以查看常规问题排查指南。

  • 卡在 Creating node MachineDeployment(s) in user cluster…

    创建或更新用户集群中的节点池可能需要一些时间。但是,如果等待时间非常长并且您怀疑某些操作可能失败,则可以运行以下命令:

    1. 运行 kubectl get nodes 以获取节点的状态。
    2. 对于任何未准备就绪的节点,运行 kubectl describe node NODE_NAME 以获取详细信息。