在多個可用區域之間執行叢集

本主題說明如何部署在多個可用區域 (AZ) 中執行的新 Tanzu Kubernetes Grid (TKG) 工作負載叢集,以及如何變更現有管理和工作負載叢集以在多個或不同的可用區域中執行。

如要使用安裝程式介面將新的獨立管理叢集設為跨多個可用區域執行,請參閱《使用安裝程式介面來部署管理叢集》設定 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_1, VSPHERE_AZ_2VSPHERE_AZ_CONTROL_PLANE_MATCHING_LABELSVSPHERE_REGIONVSPHERE_ZONE

物件內容:對於 Cluster 物件內容,物件規格以不同的方式為其控制平面和工作節點設定 AZ,以符合定義 AZ 的 VSphereDeploymentZone 物件的不同內容:

節點類型 spec.topology 下的內容 如要符合 VSphereDeploymentZone 內容 範例
控制平面節點 variables.controlPlaneZoneMatchingLabels metadata.labels 對清單 {"environment": "staging", "region": "room1"}
Worker 節點 每個機器部署的 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) 中執行其控制平面或 worker 節點,如以下幾節中所述:

  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. 在建立的虛擬機器群組與主機群組之間新增相似性規則,以便讓虛擬機器群組中的虛擬機器必須在所建立的主機群組中的主機上執行:

        • 類型 (Type) 設定為虛擬機器到主機 (Virtual Machines to Hosts),並包含必須在群組中的主機上執行 (Must run on hosts in group) 規則。
  2. 根據 vSphere 叢集 AZ 還是主機群組 AZ,以如下方式標記 vSphere 物件。這些範例使用 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 設定中,針對 VCENTER SERVER 所輸入的 vCenter Server 位址 (IP 或 FQDN) 相符。
  • metadata.name 值必須全為小寫。

視要設定 vSphere 叢集 AZ 或主機群組 AZ 而定,依以下所述建立 FailureDomainDeploymentZone 物件。

  • 叢集 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。

    如果不同的運算叢集具有同名的資源集區,請將 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 物件的名稱。
      • VsphereDeploymentZone 關聯的 VSPHERE_AZ_0 是其中部署以 VSphereFailureDomain 結尾的機器的 md-0,同樣,VSPHERE_AZ_1 是其中部署以 VSphereFailureDomain 結尾的機器的 md-1VSPHERE_AZ_2 是其中部署以 VSphereFailureDomain 結尾的機器的 md-2
      • 如果未定義任何 AZ 組態,則會部署該機器部署,而不會有任何 VSphereFailureDomain
    • WORKER_MACHINE_COUNT 用來設定叢集的 worker 節點總數。Worker 節點總數會以循環形式散佈在指定數量的 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) 中執行其控制平面或 worker 節點或變更執行節點的 AZ。

您可以將 AZ 作為一個整體指派給叢集的控制平面或 worker 節點,或者為底層機器部署設定 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 詳細目錄中的資源
    • 必須在 spec.placementConstraint.resourcePool 中設定 VSphereDeploymentZone。如果叢集沒有使用者建立的資源集區,請將該值設為叢集的預設資源集區,其路徑為 /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. 使用 KubeAdmControlPlane 修補 rolloutAfter,以觸發控制平面節點的更新。

    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 意味著按其 VSphereDeploymentZone 而不是 metadata.labels 指定 metadata.name。這樣,您可以設定叢集的控制平面節點,例如,在指定區域和環境中的所有 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. 使用 KubeAdmControlPlane 修補 rolloutAfter,以觸發控制平面節點的更新。

    kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
    
  6. 透過在 vCenter 中檢查節點的主機和資料存放區,或者執行如下的 controlPlaneZoneMatchingLabelskubectl get node 命令,確認控制平面節點已移至選擇器在 govc vm.info 中選擇的新 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_0 設為 rack1 並且您希望將其 worker 節點移至 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. 確認 worker 節點現在已部署在 VSphereFailureDomain rack2 中。

為機器部署新增 AZ

要設定新的 AZ 以供 TKG 叢集使用,然後在現有叢集中使用這些 AZ,請執行以下操作:

  1. 準備一個組態檔,為每個新 AZ 定義 VSphereFailureDomainVSphereDeploymentZone 物件。使用上面的vsphere-3-zones.yaml 中的 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 是具有三個 prod 組態的 MachineDeployment 計劃叢集計劃。使用 dev 計劃叢集,您只需更新叢集的 MachineDeployment 中的一個 spec.toplogy.workers.machineDeployments

    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. 確認現在已將其 worker 節點部署在 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 的 worker 節點已部署在 rack2 中。

更新 AZ 變更的 CPI 和 CSI

按照上述任何部分所述更改工作負載叢集的 AZ 組態後,您需要更新其 CPI 和 CSI 附加元件組態,然後重新建立附加元件以反映所做的變更。以下程序說明如何執行此操作。

限制:

  • 在為現有叢集啟用多個 AZ 或將其工作節點或控制平面節點移至現有叢集的不同 AZ 之前,必須確保任何新叢集節點均可存取叢集的原始持續性磁碟區 (PV)。
  • tagCategory 中不同地區和區域中的所有 VsphereFailureDomain 設定都應相符。
  • 為 vSphere CSI 啟用多個 AZ 之前,必須啟用多 az kcp/worker。

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