管理集群中的节点池

节点池是集群中全都具有相同配置的一组节点。集群中的所有节点都必须属于一个节点池。GKE on Bare Metal 集群中有三种节点池:控制平面、负载均衡器和工作器节点池。

本页面介绍如何检查工作器节点池的状态,以及如何添加、更新和移除工作器节点池。

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

如何管理节点池取决于集群类型和用户集群,即集群是否由 GKE On-Prem API 管理。如果满足以下任一条件,则用户集群由 GKE On-Prem API 管理:

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

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

如果 GKE On-Prem API 正在管理用户集群,您可以使用控制台或 gcloud CLI 管理节点池。如果用户集群不是由 GKE On-Prem API 管理,请在管理员工作站上使用 kubectl 来管理节点池。您还可以使用 kubectl 管理可以包含工作器节点池的所有集群类型(混合集群、独立集群和用户集群)的节点池。

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

  1. 请使用您的 Google 账号登录

    gcloud auth login
    
  2. 更新组件:

    gcloud components update
    

检查节点状态

在添加或移除节点池之前,请检查节点及其各自的节点池的状态。

kubectl

您可以使用 kubectl 获取特定命名空间或整个集群中的节点状态。以下示例显示了集群命名空间 cluster-abm-cluster 中的节点池的状态:

kubectl get nodepools.baremetal.cluster.gke.io -n cluster-abm-cluster

系统会返回类似于以下内容的结果:

NAME                    READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
abm-cluster             3       0             0         0                  0
default-pool            2       0             0         0                  0
backup-pool             3       0             0         0                  0

表中的每一列表示节点可能处于的不同状态。表中的每一行是每种节点状态中每个节点池的节点数。

添加节点时,最初在预配节点时其状态为 Reconciling。节点成为集群的一部分后,节点状态会更改为 Ready

您还可以通过运行以下命令来检查集群中的节点状态:

kubectl get nodes --kubeconfig=PATH_TO_KUBECONFIG

控制台

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

    转到 GKE 集群

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

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

  4. 点击节点标签页。

    此时将显示节点池列表。

屏幕截图节点列表

gcloud CLI

  1. 列出集群上的节点池:

    gcloud container bare-metal node-pools list \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    

    替换以下内容:

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

    • FLEET_HOST_PROJECT_ID:在其中创建集群的项目的 ID。

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

  2. 描述节点池:

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

    NODE_POOL_NAME 替换为节点池的名称。

如需详细了解如何诊断集群,请参阅创建快照以诊断集群

添加新节点池

kubectl

将节点池添加到集群时,请注意以下规则:

  • 一个管理员集群可以包含一个负载均衡器节点池和一个控制平面节点池,但不能包含一个工作器节点池:尝试将一个工作器节点池添加到一个管理员集群会产生错误。

  • 一个集群只能包含一个控制平面节点池和一个负载均衡器节点池。您无法向一个集群添加其他控制平面或负载均衡节点池。

您可以通过在集群中创建新的 nodepools.baremetal.cluster.gke.io 资源来向集群添加新的节点池。在下面的示例中,将名为“machine-learning-pool”的新节点池添加到清单中。新节点池由两个 IP 地址为 10.200.0.710.200.0.8 的节点组成:

apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: machine-learning-pool
  namespace: cluster-abm-cluster
spec:
  clusterName: abm-cluster
  nodes:
  - address: 10.200.0.7
  - address: 10.200.0.8
  taints:
  - key: TAINT_KEY
    value: TAINT_VALUE
    effect: NoSchedule
  labels:
    key1: LABEL_1
    key2: LABEL_2

将配置存储在名为 machine-learning-pool.yaml 的文件中,并使用以下命令将配置应用于集群:

kubectl apply -f machine-learning-pool.yaml

将节点池添加到集群时,应考虑以下事项:

  • NodePool.spec.taintsNodePool.spec.labels 配置会与节点协调。直接添加到节点的所有污点和标签都会被移除。控制层面不会移除您在同步过程中直接添加的污点和标签。如需绕过此协调步骤,您可以使用 baremetal.cluster.gke.io/label-taint-no-sync 为该节点添加注释。

  • 必须在关联的集群所在的命名空间中创建节点池资源,并且节点池资源需要引用 spec.clusterName 字段中的集群名称。

控制台

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

    转到 GKE 集群

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

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

  4. 点击 添加节点池

  5. 输入节点池的名称。

  6. 节点地址 1 字段中,输入工作器节点机器的 IP 地址。

    如果您要添加多个工作器节点机器,请点击 添加地址

  7. (可选)添加 Kubernetes 标签和/或 Kubernetes 污点

  8. 点击创建

节点池的状态会显示在节点标签页上。您可能需要刷新页面才能看到更新后的状态。

gcloud CLI

gcloud container bare-metal node-pools create NODE_POOL_NAME \
  --cluster=USER_CLUSTER_NAME \
  --project=FLEET_HOST_PROJECT_ID \
  --location=LOCATION \
  --node-configs-from-file=NODE_POOL_CONFIG

替换以下内容:

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

    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • USER_CLUSTER_NAME:用户集群的名称。

  • FLEET_HOST_PROJECT_ID:在其中创建集群的项目的 ID。

  • LOCATION:您在创建集群时指定的 Google Cloud 位置。

  • NODE_POOL_CONFIG:描述节点池的配置文件的路径。例如:

    nodeConfigs:
    - nodeIP: 10.200.0.10
      labels:
        key1: value1
        key2: value2
    - nodeIP: 10.200.0.11
      labels:
        key3: value3
        key4: value4
    

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

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

  • --node-taints=KEY=VALUE:EFFECT,... 以英文逗号分隔的 Kubernetes 污点列表

应用于池中的每个节点。污点是与效果相关联的键值对。污点用于 Pod 调度的容忍。为 EFFECT 指定以下其中一项:NoSchedulePreferNoScheduleNoExecute

  • --validate-only:如果要验证更新但不进行任何更改,请指定此标志。

更新节点池

kubectl

您可以通过修改集群中的 nodepools.baremetal.cluster.gke.io 资源来更新节点池。您可以使用 kubectl edit 直接更新资源,也可以更新 YAML 文件并使用 kubectl apply

控制台

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

    转到 GKE 集群

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

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

  4. 点击节点标签页。

  5. 在列表中,点击要更新的节点池。

  6. 节点池详情页面中,点击 修改

  7. 根据需要更改设置,然后点击保存

gcloud CLI

  1. (可选)列出集群上的节点池以获取要更新的节点池名称。

    gcloud container bare-metal node-pools list \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION
    

    替换以下内容:

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

    • FLEET_HOST_PROJECT_ID:在其中创建集群的项目的 ID。

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

  2. 运行以下命令:

    gcloud container bare-metal node-pools update NODE_POOL_NAME  \
      --cluster=USER_CLUSTER_NAME \
      --project=FLEET_HOST_PROJECT_ID \
      --location=LOCATION \
      --node-configs-from-file=NODE_CONFIG_FILE
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的名称。

    • NODE_CONFIG_FILE:描述节点池的配置文件的路径。例如:

    nodeConfigs:
      - nodeIP: 10.200.0.10
        labels:
          key1: value1
      - nodeIP: 10.200.0.11
    

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

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

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

  • --validate-only:如果要验证更新但不进行任何更改,请指定此标志。

例如:

gcloud container bare-metal node-pools create default-pool \
    --cluster=user-cluster-1  \
    --location=us-west1 \
    --node-configs-from-file=node-pool-config.yaml \
    --node-taints=key1=val1:NoSchedule,key2=val2:NoExecute

移除节点池

kubectl

可通过 kubectl delete 移除节点池。例如,如需移除上一部分添加的节点池 machine-learning-pool,请使用以下命令:

kubectl delete nodepool machine-learning-pool -n cluster-abm-cluster

请注意,控制平面节点池和负载均衡器节点池对于集群功能至关重要,因此无法从集群中移除。

控制台

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

    转到 GKE 集群

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

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

  4. 点击节点标签页,然后点击要删除的节点池。

  5. 点击 删除

  6. 在确认对话框中,输入节点池的名称,然后点击确认

gcloud CLI

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

替换以下内容:

  • NODE_POOL_NAME:节点池的名称。

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

  • FLEET_HOST_PROJECT_ID:在其中创建集群的项目的 ID。

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

移除集群中的工作器节点池会导致 Pod 中断。如果存在 PodDisruptionBudget (PDB),则系统可能会阻止移除节点池。如需详细了解 Pod 中断政策,请参阅移除 Pod 中断预算阻止的节点

后续步骤

如果创建节点池后工作负载要求发生变化,您可以更新工作器节点池以添加或移除节点。如需在工作器节点池中添加或移除节点,请参阅在集群中添加或移除节点