管理不同虚拟机类型的节点池

本主题介绍了如何在工作负载集群中创建、更新和删除节点池。节点池使单个工作负载集群能够包含和管理不同类型的节点,以支持不同应用程序的不同需求。

例如,集群可以使用具有高存储容量的节点来运行数据存储,以及使用瘦节点处理应用程序请求。

注意

要在由 vSphere with Tanzu 创建的工作负载集群中创建和使用节点池,需要运行 vSphere v7.0 U3 或更高版本。

如果使用 vSphere with Tanzu,vSphere with Tanzu 集群必须使用 v1alpha2 API 成功运行 node-pool 命令。有关详细信息,请参见 vSphere with Tanzu 文档

关于节点池

节点池定义工作负载集群使用的工作节点集的属性。

某些节点池属性取决于底层基础架构中可用的虚拟机选项,但所有云基础架构上的所有节点池共享以下属性:

  • name:节点池的唯一标识符,用于更新和删除等操作。
  • replicas:池中的节点数,所有这些节点共享相同的属性。
  • labels:键/值对设置为节点上的元数据,以将工作负载与池中的节点相匹配。有关详细信息和示例标签,请参见 Kubernetes 文档中的标签和选择器

对于 vSphere 上的工作负载集群,独立管理集群默认遵循反关联性规则,将节点池工作节点和控制平面节点部署到不同的 ESXi 主机。要停用节点放置的反关联性规则,请参见 停用反关联性规则

所有工作负载集群都使用第一个原始节点池创建。如下所述,在为集群创建其他节点池时,第一个节点池为未在新节点池定义中设置的属性提供默认值。

列出节点池

要检查集群中当前可用的节点池,请运行:

tanzu cluster node-pool list CLUSTER-NAME

该命令会返回集群中所有节点池的列表以及每个节点池中副本的状态。

创建节点池

要在集群中创建节点池,请执行以下操作:

  1. 为节点池创建配置文件。有关示例配置文件,请参见示例配置

    有关配置属性的完整列表,请参见配置属性 (Configuration Properties)

  2. 创建配置文件定义的节点池:

    tanzu cluster node-pool set CLUSTER-NAME -f /PATH/TO/CONFIG-FILE
    

    选项:

    • --namespace 指定集群的命名空间。默认值为 default
    • 旧版集群--base-machine-deployment 指定要从中创建新节点池的基础 MachineDeployment 对象。
      • 将此值设置为 MachineDeployment 标识符,如 Detailstanzu cluster get 的输出中所列。
      • 默认值是集群的工作线程节点阵列中的第一个 MachineDeployment 对象,在内部表示为 workerMDs[0]

示例配置

下面提供了底层基础架构的示例配置。

vSphere 配置
除了上面所需的 namereplicaslabels 属性之外,vSphere 上节点池的配置文件还可以包含 vsphere 块,以定义特定于在 vSphere 上配置虚拟机的可选属性。

vSphere 集群的节点池定义示例:

    name: tkg-wc-oidc-md-1
    replicas: 4
    labels:
      key1: value1
      key2: value2
    vsphere:
      memoryMiB: 8192
      diskGiB: 64
      numCPUs: 4
      datacenter: dc0
      datastore: iscsi-ds-0
      storagePolicyName: name
      folder: vmFolder
      resourcePool: rp-1
      vcIP: 10.0.0.1
      template: templateName
      cloneMode: clone-mode
      network: network-name

未在 vsphere 块中设置的任何值都将从集群的第一个节点池中的值继承。

对于 vcIP 值,工作负载集群节点池必须与集群的控制平面在同一 vCenter 中运行。

对于由 vSphere with Tanzu 主管部署的集群,请定义 storageClasstkrvmClass。有关这些属性的详细信息,请参见《vSphere with Tanzu》文档中的 TanzuKubernetesCluster v1alpha3 API – 注释

默认情况下,vSphere 上的工作负载集群是按照反关联性规则部署的,这些规则将每个节点池中的控制平面节点和工作节点分散到多个 ESXi 主机。要停用或重新激活反关联性规则,请参见下面的停用反关联性规则 (vSphere)

AWS 配置
除了所需的 namereplicaslabels 属性外,AWS 上的节点池的配置文件还支持以下可选属性:
  • az:可用区
  • nodeMachineType:实例类型

可能会忽略这些设置,在这种情况下,其值会继承自集群的第一个节点池。

AWS 集群的节点池定义示例:

name: tkg-aws-wc-np-1
replicas: 2
az: us-west-2b
nodeMachineType: t3.large
labels:
  key1: value1
  key2: value2
注意

AWS 上的工作负载集群节点池必须与独立管理集群位于同一可用区中。

Azure 配置
除了上面所需的 namereplicaslabels 属性外,Microsoft Azure 上的节点池的配置文件还支持以下可选属性:
  • az:可用区
  • nodeMachineType:实例类型

如果省略这些设置,则其值将从集群的第一个节点池继承。

Azure 集群的节点池定义示例:

name: tkg-azure-wc-np-1
replicas: 2
az: 2
nodeMachineType: Standard_D2s_v3
labels:
  key1: value1
  key2: value2

配置属性

下表列出了您可以在节点池配置文件中为工作负载集群定义的所有属性。

名称 类型 集群对象 提供程序 备注
name string 任意 全部 要创建或更新的节点池的名称。
replicas integer 任意 全部 节点池中的节点数。
az string 任意 TKG on AWS 或 Azure 用于放置节点的 AZ。
nodeMachineType string 任意 TKG on AWS 或 Azure 分别为 AWS 和 Azure 中的节点 instanceTypevmSize
labels map[string]string 任意 全部 要在节点上使用kubeletExtraArgs (‐‐node-labels) 设置的标签。
vmClass string 任意 全部 Kubernetes vmClass 的名称。与 TKC 集群中定义的 vmClass 匹配。此类设置可用于节点的 CPU 和内存。要列出可用的虚拟机类,请运行 kubectl describe virtualmachineclasses
storageClass string 任意 全部 要用于节点池的 Kubernetes StorageClass 的名称。此类适用于存储节点的根文件系统的磁盘。要列出可用的存储类,请运行 kubectl describe storageclasses
volumes
  • name,字符串
  • mountPath,字符串
  • capacity、corev1.ResourceList
  • storageClass,字符串
[]object 任意 全部 要用于节点的卷。
tkr
  • reference,字符串
对象 基于 TKC 全部 要用于节点池的 TKR 的名称。例如,v1.24.10—vmware.2-tkg.2
tkrResolver string 基于类 全部 基于类的集群必需。Cluster 资源中的run.tanzu.vmware.com/resolve-os-image 注释的值。
nodeDrainTimeout metav1.Duration 任意 全部 节点引流超时。
vsphere 对象 任意 全部 请参见配置属性(仅限 vSphere)
workerClass string 基于类 全部 基于类的集群必需。您希望节点池使用的集群 ClusterClass 中的 workerClass

配置属性(仅限 vSphere)

有关 VSPHERE_* 配置变量的信息,请参见配置文件变量参考中的 vSphere

名称 类型 管理集群类型 备注
cloneMode string 独立 VSPHERE_CLONE_MODE 相同。
datacenter string 独立 VSPHERE_DATACENTER 相同。
datastore string 独立 VSPHERE_DATASTORE 相同。
storagePolicyName string 独立 VSPHERE_STORAGE_POLICY_NAME 相同。
taints []corev1.Taint 主管 要应用于节点的污点。
folder string 独立 VSPHERE_FOLDER 相同。
network string 独立 VSPHERE_NETWORK 相同。
nameservers []string 独立 VSPHERE_WORKER_NAMESERVERS 相同。
tkgIPFamily string 独立 TKG_IP_FAMILY 相同。
resourcePool string 独立 VSPHERE_RESOURCE_POOL 相同。
vcIP string 独立 VSPHERE_SERVER 相同。
template string 独立 VSPHERE_TEMPLATE 相同。
memoryMiB integer 独立 VSPHERE_WORKER_MEM_MIB 相同。
diskGiB integer 独立 VSPHERE_WORKER_DISK_GIB 相同。
numCPUs integer 独立 VSPHERE_WORKER_NUM_CPUS 相同。

将工作负载分配给节点池

要将工作负载分配给节点池,请执行以下操作:

  1. 在管理 Pod 的 Kubernetes 工作负载资源或资源中,将 nodeSelector 设置为在节点池配置文件中定义的 labels。有关 Kubernetes 工作负载资源的信息,请参见 Kubernetes 文档中的工作负载
  2. 通过运行 kubectl apply -f 命令应用配置。

要将工作负载重新分配给其他节点池,请执行以下操作:

  1. 在管理 Pod 的 Kubernetes 工作负载资源中,将 nodeSelector 的值更新为新值。
  2. 通过运行 kubectl apply -f 命令应用配置更新。

更新节点池

如果只需要更改节点池中的节点数,请使用仅限扩展节点中的 Tanzu CLI 命令。如果还要添加标签,请按照添加标签和扩展节点中的过程进行操作。

注意

对于这些程序,请勿更改节点池的现有标签、可用区、节点实例类型(AWS 或 Azure 上)或虚拟机属性(vSphere 上)。这可能会对正在运行的工作负载产生严重的负面影响。要更改这些属性,请使用这些属性创建新的节点池,并将工作负载重新分配给新节点池,然后再删除原始节点池。有关说明,请参见上面的将工作负载分配给节点池

仅扩展节点

要更改节点池中的节点数,请运行:

tanzu cluster scale CLUSTER-NAME -p NODE-POOL-NAME -w NODE-COUNT

其中:

  • CLUSTER-NAME 是工作负载集群的名称。
  • NODE-POOL-NAME 是节点池的名称。
  • NODE-COUNT 是属于此节点池的节点数(整数)。

添加标签和扩展节点

您可以将标签添加到节点池,并通过节点池配置文件同时扩展其节点。

  1. 打开要更新的节点池的配置文件。

  2. 如果要增加或减少此节点池中的节点数,请更新 replicas 后的数量。

  3. 如果要添加标签,请将它们缩进 labels 下方。例如:

    labels:
      key1: value1
      key2: value2
    
  4. 保存节点池配置文件。

  5. 在终端中,运行:

    tanzu cluster node-pool set CLUSTER-NAME -f /PATH/TO/CONFIG-FILE
    

    如果命令中的 CLUSTER-NAME和配置文件中的 name 与集群中的节点池匹配,则此命令将更新现有节点池,而不是创建新的节点池。

删除节点池

要删除节点池,请运行:

tanzu cluster node-pool delete CLUSTER-NAME -n NODE-POOL-NAME

其中,CLUSTER-NAME 是工作负载集群的名称,NODE-POOL-NAME 是节电池的名称。

或者,使用 --namespace 指定集群的命名空间。默认值为 default

注意

在执行此操作之前,请将这些节点上的任何工作负载重新分配给其他节点池。tanzu cluster node-pool delete 在删除节点之前不会将工作负载从节点中迁移掉。有关说明,请参见上面的将工作负载分配给节点池

停用反关联性规则 (vSphere)

默认情况下,vSphere 上的工作负载集群是按照反关联性规则部署的,这些规则将每个节点池中的控制平面节点和工作节点分散到多个 ESXi 主机。执行以下操作以在集群创建期间停用或重新激活反关联性规则:

  1. kubectl 上下文设置为管理集群:

    kubectl config use-context MGMT-CLUSTER-NAME-admin@MGMT-CLUSTER-NAME
    

    其中,MGMT-CLUSTER-NAME 是集群的名称。

  2. 在 CAPV 控制器上运行 kubectl get deployment 以收集其 manager 容器的 args 值,例如:

    kubectl get deployment -n capv-system capv-controller-manager -o=json | jq '.spec.template.spec.containers[] | select(.name=="manager") | .args'
    [
      "--leader-elect",
      "--logtostderr",
      "--v=4",
      "--feature-gates=NodeAntiAffinity=true,NodeLabeling=true"
    ]
    
  3. 复制上一步的输出,更改 --feature-gates 值,并将参数列表传递到 kubectl patch 命令以修改对象中的值。例如,要将 NodeAntiAffinityNodeLabeling 功能门设置为 false 以停用节点反关联性规则,请执行以下操作:

    kubectl patch deployment -n capv-system capv-controller-manager --type=json -p '[{"op":"replace", "path":"/spec/template/spec/containers/0/args", "value": [
    "--leader-elect",
    "--logtostderr",
    "--v=4",
    "--feature-gates=NodeAntiAffinity=false,NodeLabeling=false"
    ]}]'
    
check-circle-line exclamation-circle-line close-line
Scroll to top icon