本主题介绍如何部署在多个可用区 (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 关联: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"} |
工作节点 | 每个计算机部署的 machineDeployments.MD-INDEX.failureDomain |
metadata.name 值列表 |
[rack1,rack2,rack3] |
由于控制平面节点根据标签匹配分配给 AZ,因此您需要创建一个标签,以区分集群控制平面节点可能使用的每个 AZ 组合。
部署或更改 TKG 集群以在多个或不同 AZ 中运行的必备条件包括:
您可以按照以下部分所述,通过三个基本步骤部署工作负载集群以在多个可用区 (AZ) 中运行其控制平面或工作节点:
要准备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
在创建的 VM 组和主机组之间添加关联性规则,以便 VM 组中的虚拟机必须在创建的主机组中的主机上运行:
按如下方式标记 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
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 设置中为 VSPHERE_SERVER
SERVER 输入的vCenter服务器地址(IP 或 FQDN)相匹配。metadata.name
值必须全部为小写。按如下方式创建 FailureDomain
和 Deployment Zone
对象,具体取决于要配置 vSphere 集群 AZ 还是主机组 AZ。
集群 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。
如果不同的 vSphere 集群具有相同名称的资源池,请将 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) 中运行其控制平面或工作节点或更改运行节点的 AZ。
您可以将 AZ 作为一个整体分配给集群的控制平面或工作节点,或者为底层计算机部署设置 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。
备注:
VSphereDeploymentZone
中设置 spec.placementConstraint.resourcePool
。如果集群没有用户创建的资源池,请将该值设置为集群的默认资源池,其路径为 /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'
使用 rolloutAfter
修补 KubeAdmControlPlane
,以触发控制平面节点的更新。
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 意味着按其 metadata.labels
而不是 metadata.name
指定 VSphereDeploymentZone
。这样,您可以配置集群的控制平面节点,例如,在指定区域和环境中的所有 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'
使用 rolloutAfter
修补 KubeAdmControlPlane
,以触发控制平面节点的更新。
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
命令,确认控制平面节点已移至选择器在 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 值修补其节点的底层 MachineDeployment
配置。
例如,如果集群配置文件设置 VSPHERE_AZ_0
为 rack1
并且您希望将其工作节点移至 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
确认工作节点现在已部署在 VSphereFailureDomain
rack2
中。
要配置新的 AZ 以供 TKG 集群使用,然后在现有集群中使用这些 AZ,请执行以下操作:
准备一个配置文件,为每个新 AZ 定义 VSphereFailureDomain
和 VSphereDeploymentZone
对象。使用上面的为控制平面节点添加 AZ 中的 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
是具有三个 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"}]'
确认已为集群更新了新的 AZ。
kubectl get cluster tkg-wc -o=jsonpath='{range .spec.topology.workers.machineDeployments[*]}{"Name: "}{.name}{"\tFailure Domain: "}{.failureDomain}{"\n"}{end}'
确认现在已将其工作节点部署在 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
的工作节点已部署在 rack2
中。
按照上述任何部分所述更改工作负载集群的 AZ 配置后,您需要更新其 CPI 和 CSI 附加模块配置,然后重新创建附加模块以反映所做的更改。以下过程介绍了如何执行此操作。
限制:
VsphereFailureDomain
中不同区域和区中的所有 tagCategory
设置都应匹配。要更新集群的 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
。