跨多个可用区运行集群

本主题介绍如何部署在多个可用区 (AZ) 中运行的新 Tanzu Kubernetes Grid (TKG) 工作负载集群,以及如何更改现有管理和工作负载集群以在多个或不同的可用区中运行。

要使用安装程序界面配置跨多个 AZ 运行的新独立管理集群,请参见《使用安装程序界面部署管理集群》中的配置 vSphere 资源

注意

本主题适用于具有独立管理集群的 TKG。要跨可用区运行具有主管的 TKG,请参见 vSphere 8.0 文档中的为多区域主管部署创建 vSphere 区域

概览

在 vSphere 上的 TKG 中,可以选择在 Kubernetes 中定义用于托管独立管理集群及其工作负载集群的地理区域和 Az,然后在 vSphere 中标记它们以将其与 vSphere 集群、主机组或数据中心相关联。

通过此设置,TKG 可以在 vSphere 上支持工作负载分布和冗余,类似于它与其他基础架构上的地理区域和 AZ 配合使用的方式。

如果没有这些结构,可以通过直接引用 vSphere 对象将 TKG 集群置于 vSphere 级别,但这样 TKG 和 Kubernetes 就无法管理其放置。

定义 AZ

要在 vSphere 上的 TKG 中定义 AZ,请创建 Kubernetes 对象并根据确定 AZ 范围的方式将其与 vSphere 对象相关联:

Kubernetes 对象:要为 vSphere 上的集群启用多个可用区,集群 API 提供程序 vSphere (CAPV) 使用两个自定义资源定义 (CRD)

  • VSphereFailureDomain CRD 捕获地理区域/区域特定的标记信息和拓扑定义,其中包括 vSphere 数据中心、集群、主机和数据存储信息。
  • VSphereDeploymentZone CRD 捕获 VSphereFailureDomain 与 Kubernetes 节点的放置限制信息之间的关联。

要创建这些对象,请在对象规范(如 vsphere-zones.yaml 文件)中定义这些对象,然后可以使用这些对象在不同时间创建对象,如下所示:

  • 首次创建管理集群时,请将该文件传递到 tanzu mc create--az-file 选项。
    • 要在定义的 ZA 中运行管理集群本身,此时必须以这种方式创建 AZ 对象。
    • 如果预计工作负载集群需要其他 AZ 对象,并且要将所有 AZ 定义保留在一个位置,则可以在此同一文件中定义其他 AZ。如果这样做,请将 SKIP_MULTI_AZ_VERIFY=true 设置为 env 变量以跳过 vSphere 验证,如运行 tanzu mc create 命令下的验证检查中所述,因为这些额外的 AZ 可能尚未部署所有 vSphere 配置。
  • 创建管理集群后,但在创建需要 AZ 对象就位的工作负载群集之前,请将文件传递到 tanzu mc az setkubectl apply 命令的 -f 选项。
  • 创建工作负载集群时,请将文件传递到 tanzu cluster create--az-file 选项。

要列出已创建的 AZ 对象,请运行:

kubectl get VSphereFailureDomain,VSphereDeploymentZone -a

Kubernetes 到 vSphere 关联VSphereFailureDomainVSphereDeploymentZone 对象定义使用以下设置定义地理区域和 AZ:

  • 地理区域:spec.region
  • 区域/AZ:spec.zone

vSphere 标记 k8s-regionk8s-zone 将 Kubernetes 中的地理区域和 AZ 与其在 vSphere 中的底层对象相关联。

AZ 范围:可以通过将 AZ 和地理区域与 vSphere 对象相关联,在 vSphere 中将 AZ 和地理区域的范围限定为不同级别,如下所示:

AZ 范围 区域/AZ 地理区域 多 AZ 使用
集群 AZ vSphere 集群 vSphere 数据中心 将节点分散到数据中心内的多个集群
主机组 AZ vSphere主机组 vSphere 集群 将节点分散到单个集群中的多个主机

本主题中的配置将 TKG 集群控制平面和工作节点分散到 vSphere 对象(即 vSphere 数据中心、集群和主机)中,具体取决于对象在 vSphere 中的标记方式和在 Kubernetes 的 VSphereFailureDomainVSphereDeploymentZone 定义中引用的方式。

配置集群以使用 AZ

通过为 Kubernetes 中的 AZ 定义的 VSphereFailureDomainVSphereDeploymentZone 对象,您可以通过配置文件变量或 Cluster 对象属性配置集群使用这些对象的方式。

配置变量:要使用集群配置变量,请按照《配置文件变量参考》中 vSphere的说明,设置 VSPHERE_AZ_0VSPHERE_AZ_1VSPHERE_AZ_2VSPHERE_AZ_CONTROL_PLANE_MATCHING_LABELSVSPHERE_REGIONVSPHERE_ZONE

对象属性:对于 Cluster 对象属性,对象规范以不同的方式为其控制平面和工作节点配置 AZ,以匹配定义 AZ 的 VSphereDeploymentZone 对象的不同属性:

节点类型 spec.topology 下的属性 要匹配 VSphereDeploymentZone 属性 示例
控制平面节点 variables.controlPlaneZoneMatchingLabels metadata.labels 对列表 {"environment": "staging", "region": "room1"}
工作节点 每个计算机部署的 machineDeployments.MD-INDEX.failureDomain metadata.name 值列表 [rack1,rack2,rack3]

由于控制平面节点根据标签匹配分配给 AZ,因此您需要创建一个标签,以区分集群控制平面节点可能使用的每个 AZ 组合。

必备条件

部署或更改 TKG 集群以在多个或不同 AZ 中运行的必备条件包括:

  • Tanzu Kubernetes Grid 管理集群,其工作负载集群在 vSphere 上运行。
  • 向为 TKG 设置的 vSphere 帐户添加了以下权限,如 vSphere 帐户所需的权限所述:
    • 主机 (Host) > 清单 (Inventory) > 修改集群 (Modify cluster)

跨多个 AZ 部署工作负载集群

您可以按照以下部分所述,通过三个基本步骤部署工作负载集群以在多个可用区 (AZ) 中运行其控制平面或工作节点:

  1. 在 vSphere 中准备地理区域和 AZ
  2. 在 Kubernetes 中创建 FailureDomainDeploymentZone 对象
  3. 部署集群

在 vSphere 中准备地理区域和 AZ

要准备 vSphere 以支持 TKG 中的地理区域和 AZ,请执行以下操作:

  1. 为将托管 TKG 集群节点的地理区域和 AZ 确定或创建 vSphere 对象。

    • 主机组 AZ:如果将 vSphere 主机组用作 AZ,则需要为计划使用的每个 AZ 创建一个主机组和一个相应的虚拟机组:

      1. 使用以下方法之一创建主机组和虚拟机组对象:

        • 在 vCenter 中,从 配置 (Configure) > 虚拟机/主机组 (VM/Host Groups) > 添加 (Add)… 中创建主机组和虚拟机组

          • 要创建主机组,可能必须创建一个伪虚拟机以添加为组成员。
        • 使用 govc CLI 运行类似于以下内容的 govc 命令。例如,要创建主机组 rack1 和虚拟机组rack1-vm-group

          govc cluster.group.create -cluster=RegionA01-MGMT -name=rack1 -host esx-01a.corp.tanzu esx-02a.corp.tanzu
          
          govc cluster.group.create -cluster=RegionA01-MGMT -name=rack1-vm-group -vm
          
      2. 在创建的 VM 组和主机组之间添加关联性规则,以便 VM 组中的虚拟机必须在创建的主机组中的主机上运行:

        • 类型 (Type) 设置为虚拟机到主机 (Virtual Machines to Hosts) 并包含规则必须在组中的主机上运行 (Must run on hosts in group)
  2. 按如下方式标记 vSphere 对象,具体取决于您要配置 vSphere 集群 AZ 还是主机组 AZ。这些示例使用 govc CLI,但您也可以使用 vCenter 中的标记和自定义属性 (Tags & Custom Attributes) 窗格:

    • 集群 AZ

      对于每个 AZ,请使用 govc 创建一个 k8s-region 类别标记并将其附加到数据中心,以及使用 k8s-zone 类别创建一个标记并将其附加到每个 vSphere 集群。例如,要将数据中心 dc0 标记为地理区域 us-west-1 并将其集群 cluster1 等标记为 AZ us-west-1a 等:

      govc tags.category.create -t Datacenter k8s-region
      
      govc tags.category.create -t ClusterComputeResource k8s-zone
      
      govc tags.create -c k8s-region us-west-1
      
      govc tags.create -c k8s-zone us-west-1a
      govc tags.create -c k8s-zone us-west-1b
      govc tags.create -c k8s-zone us-west-1c
      
      govc tags.attach -c k8s-region us-west-1 /dc0
      
      govc tags.attach -c k8s-zone us-west-1a /dc0/host/cluster1
      govc tags.attach -c k8s-zone us-west-1b /dc0/host/cluster2
      govc tags.attach -c k8s-zone us-west-1c /dc0/host/cluster3
      
    • 主机组 AZ

      对于每个 AZ,请使用 govc 创建一个 k8s-region 类别标记并将其附加到 vSphere 集群,以及创建一个 k8s-zone 类别标记并将其附加到每个主机。例如,要将集群 /dc1/host/room1-mgmt 标记为地理区域 room1 并将该组中的主机 /dc1/host/room1-mgmt/esx-01a.corp.tanzu 等标记为 AZ rack1 等:

      govc tags.category.create -t ClusterComputeResource k8s-region
      govc tags.category.create -t HostSystem k8s-zone
      
      govc tags.create -c k8s-region room1
      
      govc tags.create -c k8s-zone rack1
      govc tags.create -c k8s-zone rack2
      govc tags.create -c k8s-zone rack3
      
      govc tags.attach -c k8s-region room1 /dc1/host/room1-mgmt
      
      govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01a.corp.tanzu
      govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01b.corp.tanzu
      govc tags.attach -c k8s-zone rack1 /dc1/host/room1-mgmt/esx-01c.corp.tanzu
      
  3. 标识或创建要用于放置每个 AZ 的虚拟机的 vSphere ResourcePools 和文件夹。这些示例使用 govc CLI,但也可以在 vCenter 的清单 (Inventory) 窗格中执行此操作:

    • 集群 AZ

      对于每个 AZ,使用 govc 在 3 个 AZ 和 3 个 虚拟机文件夹的每个中的每个 vSphere 群集上创建一个匹配的 resource-pool

      govc pool.create /dc0/host/cluster1/pool1
      govc pool.create /dc0/host/cluster2/pool2
      govc pool.create /dc0/host/cluster3/pool3
      govc folder.create /dc0/vm/folder1
      govc folder.create /dc0/vm/folder2
      govc folder.create /dc0/vm/folder3
      
    • 主机组 AZ

      对于每个 AZ,使用 govc 创建 3 个 resource-pool 对象和 3 个虚拟机文件夹

      govc pool.create /dc1/host/cluster1/pool1
      govc pool.create /dc1/host/cluster1/pool2
      govc pool.create /dc1/host/cluster1/pool3
      govc folder.create /dc1/vm/folder1
      govc folder.create /dc1/vm/folder2
      govc folder.create /dc1/vm/folder3
      

在 Kubernetes 中创建 FailureDomainDeploymentZone 对象

在将集群部署到多个可用区之前,需要为地理区域和区域定义 Kubernetes 对象 FailureDomainDeploymentZone,如上文定义 AZ 中所述。

spec.regionspec.zonespec.topology 下的每个设置都必须匹配 vCenter 中配置的对象路径和标记:

  • 对于 VSphereDeploymentZone 对象,spec.failuredomain 值必须匹配 VSphereFailureDomain 定义的 metadata.name 值之一。
  • VSphereDeploymentZone 对象中的 spec.server 值必须与在安装程序界面 IaaS 提供程序 (IaaS Provider) 窗格或管理集群配置文件中的 VSPHERE_SERVER 设置中为 VSPHERE_SERVER SERVER 输入的vCenter服务器地址(IP 或 FQDN)相匹配。
  • metadata.name 值必须全部为小写。

按如下方式创建 FailureDomainDeploymentZone 对象定义,具体取决于要配置 vSphere 集群 AZ 还是主机组 AZ。

  • 集群 AZ

    作为如何将工作负载集群分布到数据中心内的多个 vSphere 集群节点的示例,以下代码定义了名为 us-west-1aus-west-1bus-west-1c 三个部署区域所需的对象,每个区域都是具有自己的网络和存储参数的 vSphere 集群:

      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
        name: us-west-1a
      spec:
        region:
          name: us-west-1
          type: Datacenter
          tagCategory: k8s-region
        zone:
          name: us-west-1a
          type: ComputeCluster
          tagCategory: k8s-zone
        topology:
          datacenter: dc0
          computeCluster: cluster1
          datastore: ds-c1
          networks:
          - net1
          - net2
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
        name: us-west-1b
      spec:
        region:
          name: us-west-1
          type: Datacenter
          tagCategory: k8s-region
        zone:
          name: us-west-1b
          type: ComputeCluster
          tagCategory: k8s-zone
        topology:
          datacenter: dc0
          computeCluster: cluster2
          datastore: ds-c2
          networks:
          - net3
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
        name: us-west-1c
      spec:
        region:
          name: us-west-1
          type: Datacenter
          tagCategory: k8s-region
        zone:
          name: us-west-1c
          type: ComputeCluster
          tagCategory: k8s-zone
        topology:
          datacenter: dc0
          computeCluster: cluster3
          datastore: ds-c3
          networks:
          - net4
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
        name: us-west-1a
        labels:
          environment: "staging"
          region: "us-west-1"
      spec:
        server: VSPHERE_SERVER
        failureDomain: us-west-1a
        placementConstraint:
          resourcePool: pool1
          folder: folder1
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
        name: us-west-1b
        labels:
          environment: "staging"
          region: "us-west-1"
      spec:
        server: VSPHERE_SERVER
        failureDomain: us-west-1b
        placementConstraint:
          resourcePool: pool2
          folder: folder2
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
        name: us-west-1c
        labels:
          environment: "staging"
          region: "us-west-1"
      spec:
        server: VSPHERE_SERVER
        failureDomain: us-west-1c
        placementConstraint:
          resourcePool: pool3
          folder: folder3
    

    其中,VSPHERE_SERVER 是 vCenter Server 的 IP 地址或 FQDN。

    如果不同的 vSphere 集群具有相同名称的资源池,请将 VSphereDeploymentZone 对象的 spec.placementConstraint.resourcePool 设置为完整资源路径,而不仅仅是名称。

  • 主机组 AZ

    有关如何将工作负载集群节点分布到单个 vSphere 集群中的三个主机组的示例,以下代码定义了三个 AZ(rack1rack2rack3)所需的对象,每个 AZ 都表示同一 vSphere 集群中的一排主机,定义为地理区域 room1

      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
        name: rack1
      spec:
        region:
          name: room1
          type: ComputeCluster
          tagCategory: k8s-region
        zone:
          name: rack1
          type: HostGroup
          tagCategory: k8s-zone
        topology:
          datacenter: dc0
          computeCluster: cluster1
          hosts:
            vmGroupName: rack1-vm-group
            hostGroupName: rack1
          datastore: ds-r1
          networks:
          - net1
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
        name: rack2
      spec:
        region:
          name: room1
          type: ComputeCluster
          tagCategory: k8s-region
        zone:
          name: rack2
          type: HostGroup
          tagCategory: k8s-zone
        topology:
          datacenter: dc0
          computeCluster: cluster1
          hosts:
            vmGroupName: rack2-vm-group
            hostGroupName: rack2
          datastore: ds-r2
          networks:
          - net2
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereFailureDomain
      metadata:
        name: rack3
      spec:
        region:
          name: room1
          type: ComputeCluster
          tagCategory: k8s-region
        zone:
          name: rack3
          type: HostGroup
          tagCategory: k8s-zone
        topology:
          datacenter: dc0
          computeCluster: cluster1
          hosts:
            vmGroupName: rack3-vm-group
            hostGroupName: rack3
          datastore: ds-c3
          networks:
          - net3
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
        name: rack1
        labels:
          region: room1
      spec:
        server: VSPHERE_SERVER
        failureDomain: rack1
        placementConstraint:
          resourcePool: pool1
          folder: folder1
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
        name: rack2
        labels:
          region: room1
      spec:
        server: VSPHERE_SERVER
        failureDomain: rack2
        placementConstraint:
          resourcePool: pool2
          folder: folder2
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
        name: rack3
        labels:
          region: room1
      spec:
        server: VSPHERE_SERVER
        failureDomain: rack3
        placementConstraint:
          resourcePool: pool3
          folder: folder3
    

    其中,VSPHERE_SERVER 是 vCenter Server 的 IP 地址或 FQDN。

为 AZ 创建 FailureDomainDeploymentZone 对象定义后,根据要部署的集群类型继续创建:

部署集群

执行完在 vSphere 中准备地理区域和 AZ在 Kubernetes 中创建 FailureDomainDeploymentZone 对象中的步骤后,可以部署其节点分布在多个 AZ 中的工作负载集群。

以下步骤使用 vsphere-zones.yaml 作为包含 FailureDomainDeploymentZone 对象定义的文件。

  1. 按照 vSphere 和独立管理集群配置文件进行操作,为要部署的工作负载集群创建集群配置文件。

  2. 检查或修改集群配置文件中的 AZ 变量以匹配 AZ 对象定义:

    • VSPHERE_REGIONVSPHERE_ZONE 设置为地理区域和去标记类别:k8s-regionk8s-zone
    • VSPHERE_AZ_0VSPHERE_AZ_1VSPHERE_AZ_2 设置为需要在其中部署计算机的 VsphereDeploymentZone 对象的名称。
      • VSPHERE_AZ_0 关联的 VsphereDeploymentZone 是其中部署以 md-0 结尾的计算机的 VSphereFailureDomain,同样,VSPHERE_AZ_1 是其中部署以 md-1 结尾的计算机的 VSphereFailureDomainVSPHERE_AZ_2 是其中部署以 md-2 结尾的计算机的 VSphereFailureDomain
      • 如果未定义任何 AZ 配置,则会部署该计算机,而不会有任何 VSphereFailureDomain
    • WORKER_MACHINE_COUNT 用于设置集群的工作线程总数。工作线程总数以循环方式分布在指定数量的 AZ 上
    • VSPHERE_AZ_CONTROL_PLANE_MATCHING_LABELS 为集群控制平面节点可能部署到的 AZ 设置键/值选择器标签。
      • 如果设置了 VSPHERE_REGIONVSPHERE_ZONE,请设置此变量。
      • 标签必须存在于您创建的 VSphereDeploymentZone 资源中。
      • 通过这些标签,您可以指定地理区域和环境中的所有 AZ,而无需单独列出它们,例如:"region=us-west-1,environment=staging"

    AZ 的集群配置变量在独立管理集群和工作负载集群中的工作方式相同。有关将工作负载集群部署到 vSphere 时必须指定的选项的完整列表,请参见配置文件变量参考

  3. 运行 tanzu cluster create 以创建工作负载集群。有关详细信息,请参见创建工作负载集群

    • 要独立于创建集群来创建 AZ 对象,请使用 tanzu login 并在运行 tanzu cluster create 之前运行以下命令来登录管理集群:

      tanzu mc az set -f vsphere-zones.yaml
      

      或者,您可以运行 kubectl apply -f vsphere-zones.yaml

    • 要将 AZ 对象定义与平面集群配置文件结合使用,同时创建 AZ 和集群对象,请将 vsphere-zones.yaml 文件传递到 tanzu cluster create--az-file 选项:

      tanzu cluster create --file cluster-config-file.yaml --az-file vsphere-zones.yaml
      
    • 要将 AZ 对象定义合并到集群清单中,请按照创建基于类的集群中所述的两个步骤中的步骤 1 创建集群清单,将 vsphere-zones.yaml 的内容附加到清单中,然后按照步骤 2 中所述运行 tanzu cluster create

    • 在集群创建过程中,您可以看到其虚拟机和其他资源显示在 vCenter 中。

    • 如果在 vCenter 中创建伪虚拟机以创建虚拟机组,则可以在集群运行后从虚拟机组中删除或移除该虚拟机。

更新现有集群以使用多个或不同的可用区

您可以更新已部署的管理集群或工作负载集群,以在多个可用区 (AZ) 中运行其控制平面或工作节点或更改运行节点的 AZ。

您可以将 AZ 作为一个整体分配给集群的控制平面或工作节点,或者为底层计算机部署设置 AZ,以便为计算机部署集自定义 vSphere 计算机设置以及 AZ。

更新现有工作负载集群的 AZ 后,需要更新其容器存储接口 (CSI) 和云提供程序接口 (CPI) 以反映更改,如更新 AZ 更改的 CPI 和 CSI 中所述。

以下几节介绍了如何更新不同场景的现有集群 AZ 配置。

为控制平面节点添加 AZ

要扩展控制平面节点在单个 AZ 中运行的现有集群,使其控制平面在多个 AZ 中运行,请执行以下操作:

  1. 准备一个配置文件,为每个新 AZ 定义 VSphereFailureDomainVSphereDeploymentZone 对象。以下示例 (vsphere-3-zones.yaml) 定义了区域 rack1rack2rack3 以及区域 room1

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind:VSphereFailureDomain
    metadata:
      name:rack
    spec:
     region:
       name: room1
       type: ComputeCluster
       tagCategory: k8s-region
     zone:
       name:rack
       type: HostGroup
       tagCategory: k8s-zone
     topology:
       datacenter: dc0
       computeCluster: cluster0
     hosts:
       vmGroupName:rack-vm-group
       hostGroupName:rack
       datastore: ds1
       networks:
       - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind:VSphereFailureDomain
    metadata:
      name:rack
    spec:
      region:
        name: room1
        type: ComputeCluster
        tagCategory: k8s-region
      zone:
        name: rack2
        type: HostGroup
        tagCategory: k8s-zone
      topology:
        datacenter: dc0
        computeCluster: cluster0
      hosts:
        vmGroupName: rack2-vm-group
        hostGroupName: rack2
        datastore: ds2
        networks:
        - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereFailureDomain
    metadata:
      name: rack3
    spec:
      region:
        name: room1
        type: ComputeCluster
        tagCategory: k8s-region
      zone:
        name: rack3:
        type: HostGroup
        tagCategory: k8s-zone
      topology:
        datacenter: dc0
        computeCluster: cluster0
      hosts:
        vmGroupName: rack3-vm-group
        hostGroupName: rack3
        datastore: ds3
        networks:
        - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
      name: rack1
      labels:
        environment: "staging"
        region: "room1"
    spec:
      server: VSPHERE_SERVER
      failureDomain: rack1
      placementConstraint:
        resourcePool: rp0
        folder: folder0
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
      name: rack2
      labels:
        environment: "staging"
        region: "room1"
    spec:
      server: VSPHERE_SERVER
      failureDomain: rack2
      placementConstraint:
        resourcePool: rp0
        folder: folder0
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
      name: rack3
      labels:
        environment: "staging"
        region: "room1"
    spec:
      server: VSPHERE_SERVER
      failureDomain: rack3
      placementConstraint:
        resourcePool: rp0
        folder: folder0
    

    其中,VSPHERE_SERVER 是 vCenter Server 的 IP 地址或 FQDN。

    备注:

    • 确保已创建标记,并已按照 vSphere 产品文档中的 vSphere 标记中所述正确标记 vCenter Server 清单中的资源
    • 必须在 VSphereDeploymentZone 中设置 spec.placementConstraint.resourcePool。如果集群没有用户创建的资源池,请将该值设置为集群的默认资源池,其路径为 /dc0/host/cluster1/Resources
    • 对于 VSphereFailureDomain 对象,不再支持 spec.region.autoConfigurespec.zone.autoConfigure
  2. 创建 vSphereFailureDomainVSphereDeploymentZone 对象,例如:

    tanzu mc az set -f vsphere-3-zones.yaml
    
  3. 获取目标集群的 KubeAdmControlPlane。在我们的示例中,目标是管理集群 tkg-mgmt-vc,但也可以是工作负载集群:

    kubectl get kcp --selector cluster.x-k8s.io/cluster-name=tkg-mgmt-vc -n tkg-system -o=name
    
    kubeadmcontrolplane.controlplane.cluster.x-k8s.io/tkg-mgmt-vc-cpkxj
    
  4. 更新集群 AZ 选择器,例如,controlPlaneZoneMatchingLabels: {"environment": "staging", "region": "room1"}

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq '.spec.topology.variables |= map(if .name == "controlPlaneZoneMatchingLabels" then .value = {"environment": "staging", "region": "room1"} else . end)'| kubectl apply -f -
    
    cluster.cluster.x-k8s.io/tkg-mgmt-vc replaced
    
  5. 检查集群的故障域是否已按预期更新:

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
    
  6. 使用 rolloutAfter 修补 KubeAdmControlPlane,以触发控制平面节点的更新。

    kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
    
  7. 通过在 vCenter 中检查节点的主机和数据存储,或者运行如下的 kubectl get nodegovc vm.info命令,确认控制平面节点已移至新的 AZ:

    • kubectl get node NODE-NAME -o=jsonpath='{.metadata.labels.node.cluster.x-k8s.io/esxi-host}' --context tkg-mgmt-vc-admin@tkg-mgmt-vc
    • govc vm.info -json NODE-NAME | jq -r '.VirtualMachines[].Config.Hardware.Device[] | select(.DeviceInfo.Label == "Hard disk 1") | .Backing.FileName'

使用选择器标签指定新的控制平面 AZ

选择带选择器标签的 AZ 意味着按其 metadata.labels 而不是 metadata.name 指定 VSphereDeploymentZone。这样,您可以配置集群的控制平面节点,例如,在指定地理区域和环境中的所有 AZ 中运行,而无需单独列出 AZ:"region=us-west-1,environment=staging"。这也意味着,您可以更新集群控制平面的 AZ,而无需更改控制平面节点的 AZ 名称。

要使用选择器标签为现有集群的控制平面节点指定新的 AZ,请执行以下操作:

  1. 准备一个配置文件,为每个新 AZ 定义 VSphereFailureDomainVSphereDeploymentZone 对象。以下示例 (vsphere-labeled-zones.yaml) 定义了具有选择器标签元数据的 AZ rack4

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereFailureDomain
    metadata:
      name: rack4
    spec:
      region:
        name: room1
        type: ComputeCluster
        tagCategory: k8s-region
      zone:
        name: rack4
        type: HostGroup
        tagCategory: k8s-zone
      topology:
        datacenter: dc0
        computeCluster: cluster0
      hosts:
        vmGroupName: rack4-vm-group
        hostGroupName: rack4
        datastore: vsanDatastore
        networks:
        - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
      name: rack4
      labels:
        environment: staging
        region: room1
    spec:
      server: VSPHERE_SERVER
      failureDomain: rack4
      placementConstraint:
        resourcePool: rp0
        folder: folder0
    
  2. 创建 VSphereFailureDomainVSphereDeploymentZone 对象,例如:

    tanzu mc az set -f vsphere-labeled-zones.yaml
    
  3. 使用 AZ 选择器标签更新集群。此处的示例将 AZ 选择器 controlPlaneZoneMatchingLabels: {"environment": "staging", "region": "room1"} 用于管理集群 tkg-mgmt-vc,但其也可以是工作负载集群:

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | \
    jq '.spec.topology.variables |= \
    map(if .name == "controlPlaneZoneMatchingLabels" \
    then .value = {"environment": "staging", "region": "room1"} \
    else . end)'| kubectl apply -f -
    
    cluster.cluster.x-k8s.io/tkg-mgmt-vc replaced
    
  4. 检查集群状态以确保故障域已按预期更新:

    kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
    
  5. 使用 rolloutAfter 修补 KubeAdmControlPlane,以触发控制平面节点的更新。

    kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
    
  6. 通过在 vCenter 中检查节点的主机和数据存储,或者运行如下的 kubectl get nodegovc vm.info 命令,确认控制平面节点已移至选择器在 controlPlaneZoneMatchingLabels 中选择的新 AZ。在我们的示例中,新 AZ 为 rack4

    • kubectl get node NODE-NAME -o=jsonpath='{.metadata.labels.node.cluster.x-k8s.io/esxi-host}' --context tkg-mgmt-vc-admin@tkg-mgmt-vc
    • govc vm.info -json NODE-NAME | jq -r '.VirtualMachines[].Config.Hardware.Device[] | select(.DeviceInfo.Label == "Hard disk 1") | .Backing.FileName'

更改计算机部署 AZ

要更改现有集群中的 AZ 配置,请使用新的 AZ 值修补其节点的底层 MachineDeployment 配置。

例如,如果集群配置文件设置 VSPHERE_AZ_0rack1 并且您希望将其工作节点移至 rack2

  1. 查询用于集群的当前 AZ。此示例使用工作负载集群 tkg-wc,但也可以使用管理集群:

    kubectl get cluster tkg-wc -o json \| jq -r '.spec.topology.workers.machineDeployments\[0\].failureDomain'
    
  2. 列出所有可用的 AZ。

    kubectl get vspheredeploymentzones -o=jsonpath='{range .items[?(@.status.ready == true)]}{.metadata.name}{"\n"}{end}'
    
    rack1
    rack2
    
  3. 修补 tkg-wc 集群的 spec.toplogy.workers.machineDeployments 配置以将其区域 VSphereFailureDomain 设置为 rack2。此示例假设 tkg-wc 是一个单节点,dev 计划集群。对于 prod 计划集群,您需要修补集群中的所有三个 MachineDeployment 对象配置。

    kubectl patch cluster tkg-wc --type=json -p='[{"op": "replace", "path": "/spec/topology/workers/machineDeployments/0/failureDomain", "value": "rack2"}]'
    
    cluster.cluster.x-k8s.io/tkg-wc patched
    
  4. 确认已为集群更新了 VSphereFailureDomain rack2

    kubectl get cluster tkg-wc -o=jsonpath='{.spec.topology.workers.machineDeployments[?(@.name=="md-0")].failureDomain}'
    
    rack2
    
  5. 确认工作节点现在已部署在 VSphereFailureDomain rack2 中。

为计算机部署添加 AZ

要配置新的 AZ 以供 TKG 集群使用,然后在现有集群中使用这些 AZ,请执行以下操作:

  1. 准备一个配置文件,为每个新 AZ 定义 VSphereFailureDomainVSphereDeploymentZone 对象。使用上面的为控制平面节点添加 AZ 中的 vsphere-3-zones.yaml 示例,该示例定义了 AZ rack1rack2rack3 以及区域 room1

  2. 创建 VSphereFailureDomainVSphereDeploymentZone 对象。

    tanzu mc az set -f vsphere-3-zones.yaml
    

    或者,您可以运行 kubectl apply -f vsphere-3-zones.yaml

  3. 使用 tkg-wc VSphereFailureDomainrack1rack2 修补集群 rack3。在此示例中,tkg-wc 是具有三个 MachineDeployment 配置的 prod 计划集群计划。使用 dev 计划集群,您只需更新集群的 spec.toplogy.workers.machineDeployments 中的一个 MachineDeployment

    kubectl patch cluster tkg-wc --type=json -p='[  \
    {"op": "replace", "path": "/spec/topology/workers/machineDeployments/0/failureDomain", "value": "rack1"}, \
    {"op": "replace", "path": "/spec/topology/workers/machineDeployments/1/failureDomain", "value": "rack2"}, \
    {"op": "replace", "path": "/spec/topology/workers/machineDeployments/2/failureDomain", "value": "rack3"}]'
    
  4. 确认已为集群更新了新的 AZ。

    kubectl get cluster tkg-wc -o=jsonpath='{range .spec.topology.workers.machineDeployments[*]}{"Name: "}{.name}{"\tFailure Domain: "}{.failureDomain}{"\n"}{end}'
    
  5. 确认现在已将其工作节点部署在 VSphereFailureDomain rack1rack2rack3 中。

添加 AZ 和新计算机部署

要配置新的 AZ 和新的 MachineDeployment 对象以供 TKG 集群使用,然后在现有集群中使用这些对象,请执行以下操作:

  1. 准备一个配置文件,为每个新 AZ 定义 VSphereFailureDomainVSphereDeploymentZone 对象。以下示例 (vsphere-1-zone.yaml) 定义了新的 AZ rack2 以及地理区域 room1

    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereFailureDomain
    metadata:
     name: rack2
    spec:
     region:
       name: room1
       type: ComputeCluster
       tagCategory: k8s-region
     zone:
       name: rack2
       type: HostGroup
       tagCategory: k8s-zone
     topology:
       datacenter: dc0
       computeCluster: cluster0
       hosts:
         vmGroupName: rack2-vm-grou
         hostGroupName: rack2
         datastore: ds-r2
       networks:
       - "VM Network"
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
      name: rack2
    spec:
      server: VSPHERE_SERVER
      failureDomain: rack2
      placementConstraint:
        resourcePool: rp0
        folder: folder0
    
  2. 创建 VSphereFailureDomainVSphereDeploymentZone 对象。

    tanzu mc az set -f vsphere-zones.yaml
    

    或者,您可以运行 kubectl apply -f vsphere-1-zone.yaml

  3. 准备配置文件以进行新的计算机部署。以下示例 (md-1.yaml) 定义了新计算机部署md-1,且其 az 属性设置为 rack2

    name: md-1
    replicas: 1
    az: rack2
    nodeMachineType: t3.large
    workerClass: tkg-worker
    tkrResolver: os-name=ubuntu,os-arch=amd64
    
  4. 使用 Tanzu CLI 创建新节点池。此示例使用工作负载集群 tkg-wc,但也可以使用管理集群:

    tanzu cluster node-pool set wl-antrea -f md-1.yaml
    
    Cluster update for node pool 'md-1' completed successfully
    
  5. 获取新创建的节点池中的计算机部署名称:

    kubectl get machinedeployments -l
    topology.cluster.x-k8s.io/deployment-name=md-1
    -o=jsonpath='{.items[*].metadata.name}'
    
    wl-antrea-md-1-pd9vj
    
  6. 确认计算机部署是否已使用 VSphereFailureDomain rack2 进行更新:

    kubectl get machinedeployments wl-antrea-md-1-pd9vj -o json | \
    jq -r '.spec.template.spec.failureDomain'
    
    rack2
    
  7. 确认 md-1 的工作节点已部署在 rack2 中。

更新 CPI 和 CSI 以反映 AZ 更改

按照上述任何部分所述更改工作负载集群的 AZ 配置后,您需要更新其 CPI 和 CSI 附加模块配置,然后重新创建附加模块以反映所做的更改。以下过程介绍了如何执行此操作。

限制:

  • 在为现有集群启用多个 AZ 或将其工作节点或控制平面节点移至现有集群的不同 AZ 之前,必须确保任何新集群节点均可访问集群的原始持久卷 (PV)。
  • VsphereFailureDomain 中不同地理区域和区域中的所有 tagCategory 设置都应匹配。
  • 为 vSphere CSI 启用多个 AZ 之前,必须启用多 az kcp/工作线程。

进行 AZ 更改后更新 CPI

要更新集群的 CPI 附加模块配置以反映 AZ 更改,然后删除相应的软件包安装程序以重新创建包含更改的附加模块,请执行以下操作:

  1. 使用 cb 引用检索集群 vsphereCPIConfig 的名称。例如,对于名为 wl 的工作负载集群:

    kubectl -n default get cb wl -o json \| jq -r '.spec.cpi.valuesFrom.providerRef.name'
    
  2. 编辑集群的 vsphereCPIConfig 规范,以将其regionzone 设置为您在 vSphere 和 tagCategory 规范中为 AZ 的地理区域和区域设置的 vsphereFailuredomain 字段。例如:

    apiVersion: cpi.tanzu.vmware.com/v1alpha1
    kind: VSphereCPIConfig
    metadata:
      name: wl
      namespace: default
    spec:
      vsphereCPI:
        mode: vsphereCPI
        region: k8s-zone
        tlsCipherSuites: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
      vmNetwork:
        excludeExternalSubnetCidr: 10.215.10.79/32
        excludeInternalSubnetCidr: 10.215.10.79/32
      zone: k8s-zone
    
  3. 应用更改并等待 Reconcile succeeded

  4. 确认 CPI 软件包安装程序 (pkgi) 已重新安装:

    kubectl -n tkg-system get wl-vsphere-cpi pkgi --context wl-admin@wl
    

更改 AZ 后更新 CSI

要更新集群的 CSI 附加模块配置以反映 AZ 更改,然后删除 csinodetopology 和相应的软件包安装程序以重新创建包含更改的附加模块,请执行以下操作:

  1. 使用 cb 引用检索集群 vsphereCPIConfig 的名称。例如,对于名为 wl 的工作负载集群:

    kubectl -n default get cb wl  -o json  |jq  -r '.spec.csi.valuesFrom.providerRef.name')
    
  2. 编辑集群的 vsphereCSIConfig 规范,以将其regionzone 设置为您在 vSphere 和 tagCategory 规范中为 AZ 的地理区域和区域设置的 vsphereFailuredomain 字段。例如:

    apiVersion: csi.tanzu.vmware.com/v1alpha1
    kind: VSphereCSIConfig
    metadata:
      name: wl
      namespace: default
    spec:
      vsphereCSI:
        config:
          datacenter: /dc0
          httpProxy: ""
          httpsProxy: ""
        insecureFlag: true
        noProxy: ""
      region: k8s-region
      tlsThumbprint: ""
      useTopologyCategories: true
      zone: k8s-zone
    mode: vsphereCSI
    
  3. 应用更改。

  4. 删除 csinodecsiNodeTopology 对象,以便重新创建。csinodetopology 不会自动更新:

    kubectl -n delete csinode --all --context wl-admin@wl
    kubectl -n delete csinodetopology --all --context wl-admin@wl
    
  5. 删除集群的 vsphere-csi 软件包安装程序,然后等待 Reconcile succeeded

    kubectl delete pkgi -n tkg-system wl-vsphere-csi --context wl-admin@wl
    
  6. 确认所有 csinodes 对象都包含 topologyKeys 参数,例如:

    kubectl get csinodes -o jsonpath='{range .items[*]}{.metadata.name} {.spec}{"\n"}{end}'
    
    k8s-control-1 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-1","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-control-2 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-2","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-control-3 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-control-3","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-1 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-1","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-2 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-2","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-3 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-3","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-4 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-4","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-5 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-5","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    k8s-node-6 {"drivers":[{"name":"csi.vsphere.vmware.com","nodeID":"k8s-node-6","topologyKeys":["topology.csi.vmware.com/k8s-region","topology.csi.vmware.com/k8s-zone"]}]}
    
  7. 确认所有节点的拓扑标签都反映正确的 AZ 地理区域和区域,例如:

    kubectl get nodes --show-labels
    NAME            STATUS   ROLES                  AGE  VERSION   LABELS
    k8s-control-1   Ready    control-plane          1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-A
    k8s-control-2   Ready    control-plane          1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
    k8s-control-3   Ready    control-plane          1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-C
    k8s-node-1      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-A
    k8s-node-2      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
    k8s-node-3      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-B
    k8s-node-4      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-1,topology.csi.vmware.com/k8s-zone=zone-C
    k8s-node-5      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-2,topology.csi.vmware.com/k8s-zone=zone-D
    k8s-node-6      Ready    <none>                 1d   v1.21.1   topology.csi.vmware.com/k8s-region=region-2,topology.csi.vmware.com/k8s-zone=zone-D
    

列出可用区

使用 tanzu mc az list 命令列出在独立管理集群中定义或工作负载集群使用的 AZ:

  • 要列出管理集群及其工作负载集群当前正在使用的可用区,请执行以下操作:

    tanzu management-cluster available-zone list
    
  • 要列出在管理集群中定义并因此可用于工作负载集群节点的所有可用区,请执行以下操作:

    tanzu management-cluster available-zone list -a
    
  • 对于工作负载集群 CLUSTER-NAME 当前使用的可用区:

    tanzu management-cluster available-zone list -c CLUSTER-NAME:
    

tanzu mc az 命令别名来自 tanzu management-cluster available-zone

示例输出:

AZNAME   ZONENAME  ZONETYPE    REGIONNAME REGIONTYPE DATASTORE   NETWORK   OWNERCLUSTER STATUS
us-west-1a us-west-1a ComputeCluster us-west-1  Datacenter sharedVmfs-0 VM Network az-1     ready
us-west-1b us-west-1b ComputeCluster us-west-1  Datacenter sharedVmfs-0 VM Network az-1     ready
us-west-1c us-west-1c ComputeCluster us-west-1  Datacenter sharedVmfs-0 VM Network az-1     ready

输出将列出:

  • AZNAMEZONENAME:AZ 的名称
  • ZONETYPE:范围限定于 AZ ComputeClusterHostGroup 的 vSphere 对象类型
  • REGIONNAME:包含 AZ 的地理区域的名称
  • REGIONTYPE:范围限定于区域 DatacenterComputeCluster 的vSphere 对象类型
  • DATASTORE:托管地理区域中虚拟机的数据存储
  • NETWORK:为地理区域中的虚拟机提供服务的网络
  • OWNERCLUSTER:一个或多个在 AZ 中运行的 TKG 集群
  • STATUS:当前 AZ 状态

tanzu mc az 命令组的别名来自 tanzu management-cluster available-zone

删除可用区

使用 tanzu mc az delete 命令删除未使用的 AZ,例如:

tanzu mc az delete AZNAME

其中,AZNAMEtanzu mc az list 列出的 AZ 的名称。

仅当 AZ 当前未托管 TKG 集群节点时,才能删除该 AZ,如 tanzu mc az list 所示,未列出 AZ 的 OWNERCLUSTER

check-circle-line exclamation-circle-line close-line
Scroll to top icon