跨多个可用区运行集群

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

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

注意

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

概览

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

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

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 定义中引用的方式。

Cluster 对象配置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 中创建 FailureDomainDeployment Zone 对象
  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
      

在 Kubernetes 中创建 FailureDomainDeployment Zone 对象

在将集群部署到多个可用区之前,需要创建 Kubernetes 对象 FailureDomainDeployment Zone 以定义区域和区。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 值必须全部为小写。

按如下方式创建 FailureDomainDeployment Zone 对象,具体取决于要配置 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
      spec:
       server: VSPHERE_SERVER
       failureDomain: us-west-1a
       placementConstraint:
         resourcePool: pool1
         folder: foo
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: us-west-1b
      spec:
       server: VSPHERE_SERVER
       failureDomain: us-west-1b
       placementConstraint:
         resourcePool: pool2
         folder: bar
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: us-west-1c
      spec:
       server: VSPHERE_SERVER
       failureDomain: us-west-1c
       placementConstraint:
         resourcePool: pool3
         folder: baz
    

    其中,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
      spec:
       server: VSPHERE_SERVER
       failureDomain: rack1
       placementConstraint:
         resourcePool: pool1
         folder: foo
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: rack2
      spec:
       server: VSPHERE_SERVER
       failureDomain: rack2
       placementConstraint:
         resourcePool: pool2
         folder: bar
      ---
      apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
      kind: VSphereDeploymentZone
      metadata:
       name: rack3
      spec:
       server: VSPHERE_SERVER
       failureDomain: rack3
       placementConstraint:
         resourcePool: pool3
       folder: baz
    

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

有关部署集群的后续步骤,请参见部署节点分布在多个可用区的工作负载集群

部署集群

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

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

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

  2. 按照配置多个可用区检查或修改集群配置文件以设置VSPHERE_REGIONVSPHERE_ZONEVSPHERE_AZ_0 和其他配置变量以匹配 AZ 对象定义。

    • AZ 的集群配置变量在独立管理集群和工作负载集群中的工作方式相同。
    • 有关将工作负载集群部署到 vSphere 时必须指定的选项的完整列表,请参见配置文件变量参考
  3. (可选)要防止集群创建过程验证配置中指定的 vSphere 区域和区是否全部存在、是否一致,以及是否在同一级别定义,请在本地环境中将 SKIP_MULTI_AZ_VERIFY 设置为 "true"

    export SKIP_MULTI_AZ_VERIFY="true"
    

    您无法在集群配置文件中设置此变量。

  4. 运行 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 mc 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
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack1
     placementConstraint:
     resourcePool: rp0
     folder: folder0
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack2
    spec:
     server: VSPHERE_SERVER
     failureDomain: rack2
     placementConstraint:
     resourcePool: rp0
     folder: folder0
    ---
    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
    kind: VSphereDeploymentZone
    metadata:
     name: rack3
    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