创建和管理节点池

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

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

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

  • 该集群是在 Google Cloud 控制台中或使用 Google Cloud CLI (gcloud CLI) 创建,这样便会自动配置 Anthos On-Prem API 以管理集群。

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

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

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

  1. 使用您的 Google 账号登录

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    

添加节点池

如果集群由 Anthos 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 Cloud 控制台中,转到 GKE Enterprise 集群页面。

    转到“GKE Enterprise 集群”页面

  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 Cloud 控制台中,转到 GKE Enterprise 集群页面。

    转到“GKE Enterprise 集群”页面

  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 Cloud 控制台中,转到 GKE Enterprise 集群页面。

    转到“GKE Enterprise 集群”页面

  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 Cloud 控制台中,转到 GKE Enterprise 集群页面。

    转到“GKE Enterprise 集群”页面

  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 以获取详细信息。