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

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

如要使用安裝程式介面將新的獨立管理叢集設為跨多個可用區域執行,請參閱《使用安裝程式介面來部署管理叢集》設定 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"}
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 中建立 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. 在建立的虛擬機器群組與主機群組之間新增相似性規則,以便讓虛擬機器群組中的虛擬機器必須在所建立的主機群組中的主機上執行:

        • 類型 (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
      

在 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 設定中,針對 VCENTER SERVER 所輸入的 vCenter Server 位址 (IP 或 FQDN) 相符。
  • metadata.name 值必須全為小寫。

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

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

    如果不同的運算叢集具有同名的資源集區,請將 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) 中執行其控制平面或 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
    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 詳細目錄中的資源
    • 必須在 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