可以通过更改节点数横向扩展 TKG Service 集群,也可以通过更改托管节点的虚拟机类纵向扩展该集群。还可以扩展附加到集群节点的卷。

支持的手动扩展操作

下表列出了 TKG 集群支持的扩展操作。
表 1. 支持的 TKGS 集群扩展操作
节点 横向扩展 横向缩减 纵向扩展 卷扩展
控制平面 是*
工作节点
请记住以下注意事项:
  • 控制平面节点数必须为奇数(1 或 3)。支持横向扩展控制平面,但不支持横向缩减控制平面。请参见横向扩展控制平面
  • 纵向扩展集群节点时,由于缺少可用资源,工作负载可能无法继续在节点上运行。因此,横向扩展通常是首选方法。请参见横向扩展工作节点
  • 虚拟机类不可改变。如果在编辑某个 TKG 集群使用的虚拟机类后横向扩展该集群,新集群节点将使用更新的类定义,但现有集群节点仍会使用初始类定义,从而导致不匹配。请参见关于虚拟机类
  • 可以在置备后更改工作节点卷;如果使用的是 vSphere 8 U3 或更高版本以及兼容的 TKr,则同样可以更改控制平面节点。请参见扩展集群节点卷

扩展必备条件:配置 Kubectl 编辑

要扩展 TKG 集群,请使用命令 kubectl edit CLUSTER-KIND/CLUSTER-NAME 更新集群清单。保存清单更改时,将使用所做更改更新集群。请参见为 Kubectl 配置文本编辑器

例如:
kubectl edit tanzukubernetescluster/tkg-cluster-1
tanzukubernetescluster.run.tanzu.vmware.com/tkg-cluster-1 edited
要取消更改,请在不保存的情况下关闭编辑器。
kubectl edit tanzukubernetescluster/tkg-cluster-1
Edit cancelled, no changes made.

横向扩展控制平面

可以通过将控制平面节点数从 1 增加到 3 横向扩展 TKG 集群。
注: 生产集群需要 3 个控制平面节点。
  1. 登录到 主管
    kubectl vsphere login --server=SUPERVISOR-IP-ADDRESS --vsphere-username USERNAME
  2. 将上下文切换到运行 TKG 集群的 vSphere 命名空间
    kubectl config use-context tkg-cluster-ns
  3. 列出在 vSphere 命名空间 中运行的 Kubernetes 集群。

    使用以下语法:

    kubectl get CLUSTER-KIND -n tkg-cluster-ns
    例如,对于 v1alpha3 API 集群:
    kubectl get tanzukubernetescluster -n tkg-cluster-ns
    例如,对于 v1beta1 API 集群:
    kubectl get cluster -n tkg-cluster-ns
  4. 获取在目标集群中运行的节点数。

    对于 v1alpha3 API 集群:

    kubectl get tanzukubernetescluster tkg-cluster-1
    TKG 集群有 1 个控制平面节点和 3 个工作节点。
    NAMESPACE             NAME             CONTROL PLANE   WORKER   TKR NAME                   AGE     READY
    tkg-cluster-ns        tkg-cluster-1    1               3        v1.24.9---vmware.1-tkg.4   5d12h   True
    

    对于 v1beta1 API 集群:

    kubectl get cluster tkg-cluster-1
  5. 使用 kubectl edit 命令加载集群清单进行编辑。
    对于 v1alpha3 API 集群:
    kubectl edit tanzukubernetescluster/tkg-cluster-1
    对于 v1beta1 API 集群:
    kubectl edit cluster/tkg-cluster-1

    在您的 KUBE_EDITOR 或 EDITOR 环境变量定义的文本编辑器中打开集群清单。

  6. 在清单的 spec.topology.controlPlane.replicas 部分将控制平面节点数从 1 增加到 3。
    对于 v1alpha3 API 集群:
    ...
    spec:
      topology:
        controlPlane:
          replicas: 1
    ...
    
    ...
    spec:
      topology:
        controlPlane:
          replicas: 3
    ...
    
    对于 v1beta1 API 集群:
    ...
    spec:
      ...
      topology:
        class: tanzukubernetescluster
        controlPlane:
          metadata: {}
          replicas: 1
        variables:
    ...
    
    ...
    spec:
      ...
      topology:
        class: tanzukubernetescluster
        controlPlane:
          metadata: {}
          replicas: 3
        variables:
    ...
    
  7. 在文本编辑器中保存文件以应用更改。(要取消更改,请在不保存的情况下关闭编辑器。)

    保存清单更改时,kubectl 会将所做更改应用到集群。在后台,主管 上的 虚拟机服务 将置备新的控制平面节点。

  8. 验证新节点是否已添加。

    对于 v1alpha3 API 集群:

    kubectl get tanzukubernetescluster tkg-cluster-1
    横向扩展后的控制平面现在具有 3 个节点。
    NAMESPACE             NAME             CONTROL PLANE   WORKER   TKR NAME                   AGE     READY
    tkg-cluster-ns        tkg-cluster-1    3               3        v1.24.9---vmware.1-tkg.4   5d12h   True
    

    对于 v1beta1 API 集群:

    kubectl get cluster tkg-cluster-1

横向扩展工作节点

可以通过增加工作节点数来横向扩展 TKG 集群。

  1. 登录到 主管
    kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username USERNAME
  2. 切换到正在运行 TKG 集群的 vSphere 命名空间 环境。
    kubectl config use-context tkg-cluster-ns
  3. 列出在 vSphere 命名空间 中运行的 Kubernetes 集群。

    使用以下语法:

    kubectl get CLUSTER-KIND -n tkg-cluster-ns
    例如,对于 v1alph3 API 集群:
    kubectl get tanzukubernetescluster -n tkg-cluster-ns
    例如,对于 v1beta1 API 集群:
    kubectl get cluster -n tkg-cluster-ns
  4. 获取在目标集群中运行的节点数。

    对于 v1alpha3 API 集群:

    kubectl get tanzukubernetescluster tkg-cluster-1
    例如,以下集群有 3 个控制平面节点和 3 个工作节点。
    NAMESPACE             NAME             CONTROL PLANE   WORKER   TKR NAME                   AGE     READY
    tkg-cluster-ns        tkg-cluster-1    3               3        v1.24.9---vmware.1-tkg.4   5d12h   True
    
    对于 v1beta1 API 集群:
    kubectl get cluster tkg-cluster-1
  5. 使用 kubectl edit 命令加载集群清单进行编辑。

    对于 v1alpha3 API 集群:

    kubectl edit tanzukubernetescluster/tkg-cluster-1
    对于 v1beta1 API 集群:
    kubectl edit cluster/tkg-cluster-1

    在您的 KUBE_EDITOR 或 EDITOR 环境变量定义的文本编辑器中打开集群清单。

  6. 可以通过编辑目标工作节点池的 spec.topology.nodePools.NAME.replicas 值来增加工作节点数。
    对于 v1alpha3 API 集群:
    ...
    spec:
      topology:
        ...
        nodePools:
        - name: worker-1
          replicas: 3
    ...
    ...
    spec:
      topology:
        ...
        nodePools:
        - name: worker-1
          replicas: 4
    ...
    对于 v1beta1 API 集群:
    ...
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      ...
    spec:
      ...
      topology:
        ...
        class: tanzukubernetescluster
        controlPlane:
        ...
        workers:
          machineDeployments:
          - class: node-pool
            metadata: {}
            name: node-pool-1
            replicas: 3
    ...
    ...
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      ...
    spec:
      ...
      topology:
        ...
        class: tanzukubernetescluster
        controlPlane:
        ...
        workers:
          machineDeployments:
          - class: node-pool
            metadata: {}
            name: node-pool-1
            replicas: 4
    ...
  7. 要应用更改,请在文本编辑器中保存该文件。要取消更改,请在不保存的情况下关闭编辑器。

    保存文件时,kubectl 会将所做更改应用到集群。在后台,主管 上的 虚拟机服务 将置备新的工作节点。

  8. 验证新节点是否已添加。

    对于 v1alpha3 API 集群:

    kubectl get tanzukubernetescluster tkg-cluster-1
    横向扩展后,集群有 4 个工作节点。
    NAMESPACE             NAME             CONTROL PLANE   WORKER   TKR NAME                   AGE     READY
    tkg-cluster-ns        tkg-cluster      3               4        v1.24.9---vmware.1-tkg.4   5d12h   True
    

    对于 v1beta1 API 集群:

    kubectl get cluster tkg-cluster-1

横向缩减工作节点

可以通过减少工作节点数来横向缩减 TKG 集群。

  1. 登录到 主管
    kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username USERNAME
  2. 切换到正在运行 TKG 集群的 vSphere 命名空间 环境。
    kubectl config use-context tkg-cluster-ns
  3. 列出在 vSphere 命名空间 中运行的 Kubernetes 集群。

    使用以下语法:

    kubectl get CLUSTER-KIND -n tkg-cluster-ns
    例如,对于 v1alph3 API 集群:
    kubectl get tanzukubernetescluster -n tkg-cluster-ns
    例如,对于 v1beta1 API 集群:
    kubectl get cluster -n tkg-cluster-ns
  4. 获取在目标集群中运行的节点数。
    kubectl get tanzukubernetescluster tkg-cluster-1
  5. 获取在目标集群中运行的节点数。

    对于 v1alpha3 API 集群:

    kubectl get tanzukubernetescluster tkg-cluster-1
    例如,以下集群有 3 个控制平面节点和 4 个工作节点。
    NAMESPACE             NAME             CONTROL PLANE   WORKER   TKR NAME                   AGE     READY
    tkg-cluster-ns        tkg-cluster      3               4        v1.24.9---vmware.1-tkg.4   5d12h   True
    
    对于 v1beta1 API 集群:
    kubectl get cluster tkg-cluster-1
  6. 使用 kubectl edit 命令加载集群清单进行编辑。

    对于 v1alpha3 API 集群:

    kubectl edit tanzukubernetescluster/tkg-cluster-1
    对于 v1beta1 API 集群:
    kubectl edit cluster/tkg-cluster-1

    在您的 KUBE_EDITOR 或 EDITOR 环境变量定义的文本编辑器中打开集群清单。

  7. 可以通过编辑目标工作节点池的 spec.topology.nodePools.NAME.replicas 值来减少工作节点数。
    对于 v1alpha3 API 集群:
    ...
    spec:
      topology:
        ...
        nodePools:
        - name: worker-1
          replicas: 4
    ...
    ...
    spec:
      topology:
        ...
        nodePools:
        - name: worker-1
          replicas: 3
    ...
    对于 v1beta1 API 集群:
    ...
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      ...
    spec:
      ...
      topology:
        ...
        class: tanzukubernetescluster
        controlPlane:
        ...
        workers:
          machineDeployments:
          - class: node-pool
            metadata: {}
            name: node-pool-1
            replicas: 4
    ...
    ...
    apiVersion: cluster.x-k8s.io/v1beta1
    kind: Cluster
    metadata:
      ...
    spec:
      ...
      topology:
        ...
        class: tanzukubernetescluster
        controlPlane:
        ...
        workers:
          machineDeployments:
          - class: node-pool
            metadata: {}
            name: node-pool-1
            replicas: 3
    ...
  8. 要应用更改,请在文本编辑器中保存该文件。要取消更改,请在不保存的情况下关闭编辑器。

    保存文件时,kubectl 会将所做更改应用到集群。在后台,主管 上的 虚拟机服务 将置备新的工作节点。

  9. 验证工作节点是否已移除。

    对于 v1alpha3 API 集群:

    kubectl get tanzukubernetescluster tkg-cluster-1
    横向缩减后,集群有 3 个工作节点。
    NAMESPACE             NAME             CONTROL PLANE   WORKER   TKR NAME                   AGE     READY
    tkg-cluster-ns        tkg-cluster-1    3               3        v1.24.9---vmware.1-tkg.4   5d12h   True
    

    对于 v1beta1 API 集群:

    kubectl get cluster tkg-cluster-1

垂直扩展集群

主管 上的 TKG 支持集群控制平面和工作节点的纵向扩展。可以通过更改用于集群节点的虚拟机类纵向扩展 TKG 集群。您使用的虚拟机类必须绑定到置备了 TKG 集群的 vSphere 命名空间

主管 上的 TKG 支持通过系统内置的滚动更新机制进行纵向扩展。更改 VirtualMachineClass 定义时,系统将推出具有该新类的新节点,并停止旧节点。请参见更新 TKG Service 集群

  1. 登录到 主管
    kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username USERNAME
  2. 切换到正在运行 TKG 集群的 vSphere 命名空间 环境。
    kubectl config use-context tkg-cluster-ns
  3. 列出在 vSphere 命名空间 中运行的 Kubernetes 集群。

    使用以下语法:

    kubectl get CLUSTER-KIND -n tkg-cluster-ns
    例如,对于 v1alph3 API 集群:
    kubectl get tanzukubernetescluster -n tkg-cluster-ns
    例如,对于 v1beta1 API 集群:
    kubectl get cluster -n tkg-cluster-ns
  4. 描述目标 TKG 集群并检查虚拟机类。

    对于 v1alpha3 API 集群:

    kubectl describe tanzukubernetescluster tkg-cluster-1

    例如,以下集群使用的是 best-effort-medium 虚拟机类。

    spec:
      topology:
        controlPlane:
          replicas: 3
          vmClass: best-effort-medium
          ...
        nodePools:
        - name: worker-nodepool-a1
          replicas: 3
          vmClass: best-effort-medium
          ...
    

    对于 v1beta1 API 集群:

    kubectl describe cluster tkg-cluster-1

    例如,以下集群使用的是 best-effort-medium 虚拟机类。

    ...
    Topology:
          ...
        Variables:
          ...
          Name:   vmClass
          Value:  best-effort-medium
        ...
    注: 对于 v1beta1 API 集群,默认情况下将 vmClass 全局设置为单个变量。您可以替代此设置,为控制平面和工作节点使用不同的虚拟机类。请参见 API 参考中的 vmClass
  5. 列出并描述可用的虚拟机类。
    kubectl get virtualmachineclass
    kubectl describe virtualmachineclass
    注: 虚拟机类必须绑定到 vSphere 命名空间。请参见 对 TKG 服务 集群使用虚拟机类
  6. 打开以编辑目标集群清单。

    对于 v1alpha3 API 集群:

    kubectl edit tanzukubernetescluster/tkg-cluster-1
    对于 v1beta1 API 集群:
    kubectl edit cluster/tkg-cluster-1

    在您的 KUBE_EDITOR 或 EDITOR 环境变量定义的文本编辑器中打开集群清单。

  7. 编辑清单,更改虚拟机类。
    对于 v1alpha3 API 集群,将控制平面的虚拟机类更改为 guaranteed-medium,并将工作节点的虚拟机类更改为 guaranteed-large
    spec:
      topology:
        controlPlane:
          replicas: 3
          vmClass: guaranteed-medium
          ...
        nodePools:
        - name: worker-nodepool-a1
          replicas: 3
          vmClass: guaranteed-large
          ...
    
    对于 v1beta API 集群,将虚拟机类更改为 guaranteed-large
    ...
    Topology:
          ...
        Variables:
          ...
          Name:   vmClass
          Value:  guaranteed-large
        ...
  8. 要应用更改,请在文本编辑器中保存该文件。要取消更改,请在不保存的情况下关闭编辑器。

    保存文件时,kubectl 会将所做更改应用到集群。在后台,主管 上的 TKG 将对 TKG 集群执行滚动更新。

  9. 确认 TKG 集群已使用新的虚拟机类进行了更新。

    对于 v1alpha3 API 集群:

    kubectl describe tanzukubernetescluster tkg-cluster-1

    对于 v1beta1 API 集群:

    kubectl describe cluster tkg-cluster-1

扩展集群节点卷

在节点的 TKG 集群规范中,可以选择为节点声明一个或多个持久卷。声明节点卷对于频繁更改的组件非常有用,例如工作节点上的容器运行时和 kubelet。

如果要在创建集群后添加或更改一个或多个节点卷,请记住以下注意事项:
卷节点 描述

允许更改工作节点卷

置备 TKG 集群后,您可以添加或更新工作节点卷。启动滚动更新时,集群将使用新卷或更改的卷进行更新。

警告: 如果使用新卷或更改的卷扩展工作节点,则在滚动更新期间将删除当前卷中的数据。请参阅下面的说明。

为 TKG 集群节点声明的卷视为临时卷。TKG 集群会在 vSphere 命名空间中使用持久卷声明 (PVC),以便根据 TKG 集群的存储配额计算卷容量。如果增加 TKC 卷的容量,Kubernetes 集群 API (CAPI) 将推出具有新 PVC 的新工作节点。在这种情况下,TKG 不会执行任何数据迁移,但 Kubernetes 将相应地(重新)调度工作负载 Pod。

如果使用的是 vSphere 8 U3 或更高版本,则允许更改控制平面节点卷

如果使用的是 vSphere 8 U3 或更高版本以及兼容的 Tanzu Kubernetes 版本,则可以在置备 TKG Service 集群后添加或更新控制平面节点卷。

如果使用的不是 vSphere 8 U3 或更高版本,则 Kubernetes 集群 API (CAPI) 禁止在创建后更改为 spec.toplogy.controlPlane.volumes

如果在创建集群后尝试添加或更改控制平面卷,请求将被拒绝,并显示错误消息“不允许更新不可变字段 (updates to immutable fields are not allowed)”。

以下是基于包含所声明节点卷的 v1alpha3 API 的集群规范摘录。请根据需要参考包含此摘录的完整 TKG 集群示例:v1alpha3 示例:具有默认存储和节点卷的 TKC。有关 v1beta1 API 集群示例,请参见 v1beta1 示例:基于默认 ClusterClass 的自定义集群

apiVersion: run.tanzu.vmware.com/v1alpha3
kind: TanzuKubernetesCluster
...
spec:
   topology:
     controlPlane:
       replicas: 3
       storageClass: tkg-storage-policy
       vmClass: guaranteed-medium
       tkr:
         reference:
           name: v1.24.9---vmware.1-tkg.4
     nodePools:
     - name: worker-nodepool-a1
       replicas: 3
       storageClass: tkg-storage-policy
       vmClass: guaranteed-large
       tkr:
         reference:
           name: v1.24.9---vmware.1-tkg.4
       volumes:
       - name: containerd
         mountPath: /var/lib/containerd
         capacity:
           storage: 50Gi
       - name: kubelet
         mountPath: /var/lib/kubelet
         capacity:
           storage: 50Gi
     - name: worker-nodepool-a2
       ...
   settings:
     ...