创建和管理节点池

从 GKE On-Prem 版本 1.3 开始,您可以创建一个节点池,以定义使用相同配置的一组节点,这些节点可以位于用户集群内,也可以跨用户集群。然后,您可以单独管理该节点池,而不会影响每个集群中的任何其他节点。详细了解节点池

您可以在用户集群的配置文件中定义一个或多个节点池。创建节点池会在每个集群中创建其他节点。您通过用户集群的配置文件管理节点池,包括创建、更新和删除节点池。在配置文件中定义节点池后,您可以使用 gkectl update cluster 命令将这些更改部署到集群。部署的更改会立即在每个用户集群中执行。例如,如果您从集群中移除节点池,则无论这些节点是否在运行工作负载,这些节点都会被立即删除。

示例节点池:

nodepools:
  - name: pool-1
    cpus: 4
    memorymb: 8192
    replicas: 5

新安装提示:创建您的第一个用户集群并在该集群中定义节点池。然后使用该集群的配置文件创建具有相同节点池设置的其他用户集群

准备工作

  • 支持:

    • 仅支持 1.3.0 或更高版本的用户集群。

    • 不支持管理员集群中的节点池。

    • gkectl update cluster 命令目前仅支持节点池管理。配置文件中存在的所有其他更改都会被忽略。

    • 虽然节点池中的节点可以与每个用户集群中的其他节点分开进行管理,但无法单独升级任何集群的节点。当您升级集群时,所有节点都会被升级。

  • 资源:

    • 您可以只部署对节点池 replicas 的更改,而不中断节点的工作负载。

      重要提示:如果部署任何其他节点池配置更改,则会重新创建节点池中的节点。您必须确保每个节点池都没有运行不应中断的工作负载。

    • 部署节点池更改时,可能会创建一个临时节点。您必须验证是否有可用于该临时节点的 IP 地址

创建和更新节点池

您可以通过修改和部署用户集群的配置文件来管理节点池。您可以创建一个或多个节点池并将其部署到每个用户集群。

要创建或更新节点池,请执行以下操作:

  1. 在编辑器中,打开要在其中创建或更新节点池的用户集群的配置文件

  2. 在配置文件的 usercluster 下的 nodepools 部分定义一个或多个节点池:

    1. 配置必需的最低节点池特性。您必须为每个节点池指定以下特性:

      • usercluster.nodepools.name:指定节点池的唯一名称。更新此特性会重新创建节点。示例:name: pool-1

      • usercluster.nodepools.cpus:指定将多少 CPU 分配给用户集群的每个工作器节点。更新此特性会重新创建节点。示例:cpus: 4

      • usercluster.nodepools.memorymb:指定为用户集群的每个工作节点分配多少内存(以兆字节为单位)。更新此特性会重新创建节点。示例:memorymb: 8192

      • usercluster.nodepools.replicas:指定用户集群用于运行工作负载的工作器节点总数。您可以在不影响任何节点或运行的工作负载的情况下更新此特性。示例:replicas: 5

      请注意,虽然某些 nodepools 特性与 workernodeDHCP | 静态 IP 地址)相同,但 workernode 部分对于每个用户集群都是必需的。您不能移除 workernode,也不能将其替换为 nodepools

      示例:

      nodepools:
        - name: pool-1
          cpus: 4
          memorymb: 8192
          replicas: 5
      

      如需查看多个节点池的配置示例,请参阅示例

    2. 配置可选的节点池特性。您可以向节点池配置添加标签污点,以控制节点工作负载。您还可以定义节点池使用的 vSphere 数据存储区。

      • usercluster.nodepools.labels:指定一个或多个 key : value 对,以唯一标识您的节点池。keyvalue 必须以字母或数字开头,可以包含字母、数字、连字符、英文句点和下划线,长度不超过 63 个字符。

        如需了解详细的配置信息,请参阅标签

        重要提示:您不能为标签指定以下键,因为它们已保留供 GKE On-Prem 使用:kubernetes.iok8s.iogoogleapis.com

        示例:

        labels:
          key1: value1
          key2: value2
        
      • usercluster.nodepools.taints:指定 keyvalueeffect,以为节点池定义 taints。这些 taints 与您为 pod 配置的 tolerations 对应。

        key 是必需的,value 是可选的。两者都必须以字母或数字开头,可以包含字母、数字、连字符、英文句点和下划线,长度不超过 253 个字符。或者,您可以在 key 前添加一个 DNS 子域(后跟 /)。例如:example.com/my-app

        有效 effect 值为 NoSchedulePreferNoScheduleNoExecute

        如需了解详细的配置信息,请参阅污点

        示例:

        taints:
          - key: key1
            value: value1
            effect: NoSchedule
        
      • usercluster.nodepools.vsphere.datastore:指定节点池使用的 vSphere 数据存储区。这将替换用户集群的默认 vSphere 数据存储区。

        示例:

        vsphere:
          datastore: datastore_name
        

    如需查看多个节点池的配置示例,请参阅示例

  3. 使用 gkectl update cluster 命令将更改部署到用户集群。

    注意gkectl update cluster 仅支持节点池管理。只有 nodepools 部分的更改会被部署。配置文件中的所有其他更改都会被忽略。

    gkectl update cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config config.yaml --dry-run --yes
    
    其中:
    • [ADMIN_CLUSTER_KUBECONFIG]:指定管理员集群的 kubeconfig 文件。
    • config.yaml:指定用户集群的修改后 configuration file。您可能为此文件选择了其他名称。
    • --dry-run:可选标志。如果添加此标志,则仅查看更改。不会将任何更改部署到用户集群。
    • --yes:可选标志。如果添加此标志,则以静默方式运行命令。确认要继续操作的提示会被停用。

    如果您提前中止该命令,可以再次运行同一命令来完成操作并将更改部署到用户集群。

    如果您需要还原更改,则必须还原配置文件中的更改,然后将这些更改重新部署到用户集群。

  4. 通过检查所有节点来验证更改是否成功。运行以下命令以列出用户集群中的所有节点:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get nodes -o wide
    

    其中,[USER_CLUSTER_KUBECONFIG] 是您的用户集群的 kubeconfig 文件。

删除节点池

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

  1. 从用户集群的配置文件中移除所有 nodepools 设置。如果有多个节点池,您必须移除所有设置。

  2. 确保没有正在运行的工作负载。所有受影响的节点都将被删除。

  3. 通过运行 gkectl update cluster 命令部署更改:

    gkectl update cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config config.yaml --dry-run --yes
    
    其中:
    • [ADMIN_CLUSTER_KUBECONFIG]:指定管理员集群的 kubeconfig 文件。
    • config.yaml:指定用户集群的修改后 configuration file。您可能为此文件选择了其他名称。
    • --dry-run:可选标志。如果添加此标志,则仅查看更改。不会将任何更改部署到用户集群。
    • --yes:可选标志。如果添加此标志,则以静默方式运行命令。确认要继续操作的提示会被停用。
  4. 通过检查所有节点来验证更改是否成功。运行以下命令以列出用户集群中的所有节点:

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] get nodes -o wide
    

    其中,[USER_CLUSTER_KUBECONFIG] 是您的用户集群的 kubeconfig 文件。

示例

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

  • pool-1:仅指定了所需的最少属性
  • pool-2:包括 vSphere 数据存储区
  • pool-3:包括污点和标签
  • pool-4:包括所有特性
...
usercluster:
  ...
  workernode:
    cpus: 4
    memorymb: 8192
    replicas: 3
  # (Optional) Node pools with customizable labels, taints, etc.
  nodepools:
    - name: pool-1
      cpus: 4
      memorymb: 8192
      replicas: 5
    - name: pool-2
      cpus: 8
      memorymb: 16384
      replicas: 3
      vsphere:
        datastore: my_datastore
    - name: pool-3
      cpus: 4
      memorymb: 8192
      replicas: 5
      taints:
        - key: "example-key"
          effect: NoSchedule
      labels:
        environment: production
        app: nginx
    - name: pool-4
      cpus: 8
      memorymb: 16384
      replicas: 3
      taints:
        - key: "my_key"
          value: my_value1
          effect: NoExecute
      labels:
        environment: test
      vsphere:
        datastore: my_datastore
...

查看用户集群配置文件的完整示例

问题排查

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

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

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

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

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

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