本主題說明如何部署在多個可用區域 (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 關聯:VSphereFailureDomain
和 VSphereDeploymentZone
物件定義使用以下設定定義區域和 AZ:
spec.region
spec.zone
vSphere 標記 k8s-region
和 k8s-zone
將 Kubernetes 中的區域和 AZ 與其在 vSphere 中的基層物件相關聯。
AZ 範圍:您可以透過將 AZ 與vSphere物件相關聯,在vSphere中的不同層級上設定 AZ 和區域的範圍,如下所示:
AZ 範圍 | 區域/AZ | 區域 | 多 AZ 使用 |
---|---|---|---|
叢集 AZ | vSphere 叢集 | vSphere 資料中心 | 將節點分散到資料中心內的多個叢集 |
主機群組 AZ | vSphere主機群組 | vSphere 叢集 | 將節點分散在單一叢集中的多個主機上 |
本主題中的組態將 TKG 叢集控制平面和工作節點分散到 vSphere 物件 (即 vSphere 資料中心、叢集和主機) 中,取決於物件在 vSphere 中的標記方式和在 Kubernetes 的 VSphereFailureDomain
和 VSphereDeploymentZone
定義中參照的方式。
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 中執行的必備條件包括:
您可以透過三個步驟部署工作負載叢集,以便在多個可用區域 (AZ) 中執行其控制平面或 worker 節點,如以下幾節中所述:
若要準備vSphere以支援 TKG 中的區域和 AZ:
針對將主控 TKG 叢集節點的區域和 AZ 識別或建立vSphere物件。
主機群組 AZ:如果將 vSphere 主機群組當成 AZ,則需要為計劃使用的每個 AZ 建立一個主機群組和一個相應的虛擬機器群組:
使用以下一種方法建立主機群組和虛擬機器群組物件:
在 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
在建立的虛擬機器群組與主機群組之間新增相似性規則,以便讓虛擬機器群組中的虛擬機器必須在所建立的主機群組中的主機上執行:
根據 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
FailureDomain
和 Deployment Zone
物件在將叢集部署到多個可用區域之前,需要建立 Kubernetes 物件 FailureDomain
和Deployment Zone
以定義區域和區。spec.region
、spec.zone
和 spec.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 而定,依以下所述建立 FailureDomain
和 Deployment Zone
物件。
叢集 AZ:
例如,針對如何將工作負載叢集分散到資料中心內的多個 vSphere 叢集節點,以下程式碼定義名稱為 us-west-1a
、us-west-1b
和 us-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 (rack1
、rack2
和 rack3
) 所需的物件,每個 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 中建立 FailureDomain
和 Deployment Zone
物件中的步驟後,可以部署其節點分散在多個 AZ 中的工作負載叢集。
以下步驟使用 vsphere-zones.yaml
作為包含 FailureDomain
和 Deployment Zone
物件定義的檔案。
按照 vSphere 和獨立管理叢集組態檔進行操作,為要部署的工作負載叢集建立叢集組態檔。
按照設定多個可用區域檢查或修改叢集組態檔以設定VSPHERE_REGION
、VSPHERE_ZONE
、VSPHERE_AZ_0
和其他組態變數以符合 AZ 物件定義。
(選用) 如要防止叢集建立程序驗證組態中指定的 vSphere 區域和區域是否全部存在、是否一致,以及是否在同一層級定義,請在本機環境中將 SKIP_MULTI_AZ_VERIFY
設為 "true"
:
export SKIP_MULTI_AZ_VERIFY="true"
您無法在叢集設定檔中設定此變數。
執行 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 中。
您可以更新已部署的管理叢集或工作負載叢集,以在多個可用區域 (AZ) 中執行其控制平面或 worker 節點或變更執行節點的 AZ。
您可以將 AZ 作為一個整體指派給叢集的控制平面或 worker 節點,或者為底層機器部署設定 AZ,以便為機器部署集自訂 vSphere 機器設定以及 AZ。
更新現有工作負載叢集的 AZ 後,需要更新其容器儲存區介面 (CSI) 和雲端提供者 (CPI) 以反映變更,例如更新 AZ 變更的 CPI 和 CSI 中所述。
以下幾節說明如何更新不同案例的現有叢集 AZ 組態。
要展開控制平面節點在單個 AZ 中執行的現有叢集,使其控制平面在多個 AZ 中執行,請執行以下操作:
準備一個組態檔,為每個新 AZ 定義 VSphereFailureDomain
和 VSphereDeploymentZone
物件。以下範例 (vsphere-3-zones.yaml
) 定義了區域 rack1
、rack2
和 rack3
以及區域 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。
附註:
spec.placementConstraint.resourcePool
中設定 VSphereDeploymentZone
。如果叢集沒有使用者建立的資源集區,請將該值設為叢集的預設資源集區,其路徑為 /dc0/host/cluster1/Resources
。VSphereFailureDomain
物件,已不再支援 spec.region.autoConfigure
和 spec.zone.autoConfigure
。建立 vSphereFailureDomain
和 VSphereDeploymentZone
物件,例如:
tanzu mc az set -f vsphere-3-zones.yaml
取得目標叢集的 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
更新叢集 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
檢查叢集的故障網域是否已按預期更新:
kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
使用 KubeAdmControlPlane
修補 rolloutAfter
,以觸發控制平面節點的更新。
kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
透過在 vCenter 中檢查節點的主機和資料存放區,或者執行如下的 kubectl get node
或 govc 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 意味著按其 VSphereDeploymentZone
而不是 metadata.labels
指定 metadata.name
。這樣,您可以設定叢集的控制平面節點,例如,在指定區域和環境中的所有 AZ 中執行,而無需單獨列出 AZ:"region=us-west-1,environment=staging"
。這也意味著,您可以更新叢集控制平面的 AZ,而無需變更控制平面節點的 AZ 名稱。
如要使用選擇器標籤為現有叢集的控制平面節點指定新的 AZ,請執行以下操作:
準備一個組態檔,為每個新 AZ 定義 VSphereFailureDomain
和 VSphereDeploymentZone
物件。以下範例 (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
建立 VSphereFailureDomain
和 VSphereDeploymentZone
物件,例如:
tanzu mc az set -f vsphere-labeled-zones.yaml
使用 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
檢查叢集狀態以確保故障網域已按預期更新:
kubectl get cluster tkg-mgmt-vc -n tkg-system -o json | jq -r '.status.failureDomains | to_entries[].key'
使用 KubeAdmControlPlane
修補 rolloutAfter
,以觸發控制平面節點的更新。
kubectl patch kcp tkg-mgmt-vc-cpkxj -n tkg-system --type merge -p "{\"spec\":{\"rolloutAfter\":\"$(date +'%Y-%m-%dT%TZ')\"}}"
透過在 vCenter 中檢查節點的主機和資料存放區,或者執行如下的 controlPlaneZoneMatchingLabels
或 kubectl 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 值修補其節點的底層 MachineDeployment
組態。
例如,如果叢集組態檔將 VSPHERE_AZ_0
設為 rack1
並且您希望將其 worker 節點移至 rack2
:
查詢用於叢集的目前 AZ。此範例使用工作負載叢集 tkg-wc
,但也可以使用管理叢集:
kubectl get cluster tkg-wc -o json \| jq -r '.spec.topology.workers.machineDeployments\[0\].failureDomain'
列出所有可用的 AZ。
kubectl get vspheredeploymentzones -o=jsonpath='{range .items[?(@.status.ready == true)]}{.metadata.name}{"\n"}{end}'
rack1
rack2
修補 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
確認叢集已使用 VSphereFailureDomain
rack2
進行更新。
kubectl get cluster tkg-wc -o=jsonpath='{.spec.topology.workers.machineDeployments[?(@.name=="md-0")].failureDomain}'
rack2
確認 worker 節點現在已部署在 VSphereFailureDomain
rack2
中。
要設定新的 AZ 以供 TKG 叢集使用,然後在現有叢集中使用這些 AZ,請執行以下操作:
準備一個組態檔,為每個新 AZ 定義 VSphereFailureDomain
和 VSphereDeploymentZone
物件。使用上面的vsphere-3-zones.yaml
中的 vsphere-3-zones.yaml 範例,該範例定義了 AZ rack1
、rack2
和 rack3
以及區域 room1
。
建立 VSphereFailureDomain
和 VSphereDeploymentZone
物件。
tanzu mc az set -f vsphere-3-zones.yaml
或者,您可以執行 kubectl apply -f vsphere-3-zones.yaml
使用 tkg-wc
VSphereFailureDomain
、rack1
和 rack2
修補叢集 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"}]'
確認叢集已使用新的 AZ 進行了更新。
kubectl get cluster tkg-wc -o=jsonpath='{range .spec.topology.workers.machineDeployments[*]}{"Name: "}{.name}{"\tFailure Domain: "}{.failureDomain}{"\n"}{end}'
確認現在已將其 worker 節點部署在 VSphereFailureDomain
rack1
、rack2
和 rack3
中。
要設定新的 AZ 和新的 MachineDeployment
物件以供 TKG 叢集使用,然後在現有叢集中使用這些物件,請執行以下操作:
準備一個組態檔,為每個新 AZ 定義 VSphereFailureDomain
和 VSphereDeploymentZone
物件。以下範例 (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
建立 VSphereFailureDomain
和 VSphereDeploymentZone
物件。
tanzu mc az set -f vsphere-zones.yaml
或者,您可以執行 kubectl apply -f vsphere-1-zone.yaml
準備組態檔以進行新的機器部署。以下範例 (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
使用 Tanzu CLI 建立新節點集區。此範例使用工作負載叢集 tkg-wc
,但也可以使用管理叢集:
tanzu cluster node-pool set wl-antrea -f md-1.yaml
Cluster update for node pool 'md-1' completed successfully
取得新建立的節點集區中的機器部署名稱:
kubectl get machinedeployments -l
topology.cluster.x-k8s.io/deployment-name=md-1
-o=jsonpath='{.items[*].metadata.name}'
wl-antrea-md-1-pd9vj
確認機器部署是否已使用 VSphereFailureDomain
rack2
進行更新:
kubectl get machinedeployments wl-antrea-md-1-pd9vj -o json | \
jq -r '.spec.template.spec.failureDomain'
rack2
確認 md-1
的 worker 節點已部署在 rack2
中。
按照上述任何部分所述更改工作負載叢集的 AZ 組態後,您需要更新其 CPI 和 CSI 附加元件組態,然後重新建立附加元件以反映所做的變更。以下程序說明如何執行此操作。
限制:
tagCategory
中不同地區和區域中的所有 VsphereFailureDomain
設定都應相符。要更新叢集的 CPI 附加元件組態以反映 AZ 變更,然後刪除相應的套件安裝程式以使用變更重新建立附加元件,請執行以下操作:
使用 cb
參考擷取叢集的 vsphereCPIConfig
名稱。例如,對於名稱是 wl
的工作負載叢集:
kubectl -n default get cb wl -o json \| jq -r '.spec.cpi.valuesFrom.providerRef.name'
編輯叢集的 vsphereCPIConfig
規格,以將其region
和 zone
設為您在 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
套用變更並等待 Reconcile succeeded
。
確認 CPI 套件安裝程式 (pkgi
) 已重新安裝:
kubectl -n tkg-system get wl-vsphere-cpi pkgi --context wl-admin@wl
要更新叢集的 CSI 附加元件組態以反映 AZ 變更,然後刪除 csinodetopology
和相應的套件安裝程式以使用變更重新建立附加元件,請執行以下操作:
使用 cb
參考擷取叢集的 vsphereCPIConfig
名稱。例如,對於名稱是 wl
的工作負載叢集:
kubectl -n default get cb wl -o json |jq -r '.spec.csi.valuesFrom.providerRef.name')
編輯叢集的 vsphereCSIConfig
規格,以將其region
和 zone
設為您在 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
套用所做的變更。
刪除 csinode
和 csiNodeTopology
物件,以便重新建立。csinodetopology
不會自動更新:
kubectl -n delete csinode --all --context wl-admin@wl
kubectl -n delete csinodetopology --all --context wl-admin@wl
刪除叢集的 vsphere-csi
套件安裝程序,然後等待 Reconcile succeeded
。
kubectl delete pkgi -n tkg-system wl-vsphere-csi --context wl-admin@wl
確認所有 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"]}]}
確認所有節點的拓撲標籤均反映正確的 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
輸出將列出:
AZNAME
、ZONENAME
:AZ 的名稱ZONETYPE
:範圍限定於 AZ ComputeCluster
或 HostGroup
的 vSphere 物件類型REGIONNAME
:包含 AZ 的區域的名稱REGIONTYPE
:範圍限定於區域 Datacenter
或 ComputeCluster
的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
其中,AZNAME
是 tanzu mc az list
列出的 AZ 的名稱。
僅當 AZ 目前未託管 TKG 叢集節點時,才能刪除該 AZ,如 tanzu mc az list
所示,未列出 AZ 的 OWNERCLUSTER
。