本主题介绍如何部署在多个可用区 (AZ) 中运行的新 Tanzu Kubernetes Grid (TKG) 工作负载集群,以及如何更改现有管理和工作负载集群以在多个或不同的可用区中运行。
要使用安装程序界面配置跨多个 AZ 运行的新独立管理集群,请参见《使用安装程序界面部署管理集群》中的配置 vSphere 资源。
注意本主题适用于具有独立管理集群的 TKG。要跨可用区运行具有主管的 TKG,请参见 vSphere 8.0 文档中的为多区域主管部署创建 vSphere 区域。
在 vSphere 上的 TKG 中,可以选择在 Kubernetes 中定义用于托管独立管理集群及其工作负载集群的地理区域和 Az,然后在 vSphere 中标记它们以将其与 vSphere 集群、主机组或数据中心相关联。
通过此设置,TKG 可以在 vSphere 上支持工作负载分布和冗余,类似于它与其他基础架构上的地理区域和 AZ 配合使用的方式。
如果没有这些结构,可以通过直接引用 vSphere 对象将 TKG 集群置于 vSphere 级别,但这样 TKG 和 Kubernetes 就无法管理其放置。
要在 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
选项。
SKIP_MULTI_AZ_VERIFY=true
设置为 env 变量以跳过 vSphere 验证,如运行 tanzu mc create
命令下的验证检查中所述,因为这些额外的 AZ 可能尚未部署所有 vSphere 配置。tanzu mc az set
或 kubectl apply
命令的 -f
选项。tanzu cluster create
的 --az-file
选项。要列出已创建的 AZ 对象,请运行:
kubectl get VSphereFailureDomain,VSphereDeploymentZone -a
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
定义中引用的方式。
通过为 Kubernetes 中的 AZ 定义的 VSphereFailureDomain
和 VSphereDeploymentZone
对象,您可以通过配置文件变量或 Cluster
对象属性配置集群使用这些对象的方式。
配置变量:要使用集群配置变量,请按照《配置文件变量参考》中 vSphere 下的说明,设置 VSPHERE_AZ_0
、VSPHERE_AZ_1
、VSPHERE_AZ_2
、VSPHERE_AZ_CONTROL_PLANE_MATCHING_LABELS
、VSPHERE_REGION
和 VSPHERE_ZONE
。
对象属性:对于 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
标识或创建要用于放置每个 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
FailureDomain
和 DeploymentZone
对象在将集群部署到多个可用区之前,需要为地理区域和区域定义 Kubernetes 对象 FailureDomain
和 DeploymentZone
,如上文定义 AZ 中所述。
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
和 DeploymentZone
对象定义,具体取决于要配置 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
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。
如果不同的 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
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 创建 FailureDomain
和 DeploymentZone
对象定义后,根据要部署的集群类型继续创建:
执行完在 vSphere 中准备地理区域和 AZ 和在 Kubernetes 中创建 FailureDomain
和 DeploymentZone
对象中的步骤后,可以部署其节点分布在多个 AZ 中的工作负载集群。
以下步骤使用 vsphere-zones.yaml
作为包含 FailureDomain
和 DeploymentZone
对象定义的文件。
按照 vSphere 和独立管理集群配置文件进行操作,为要部署的工作负载集群创建集群配置文件。
检查或修改集群配置文件中的 AZ 变量以匹配 AZ 对象定义:
VSPHERE_REGION
和 VSPHERE_ZONE
设置为地理区域和去标记类别:k8s-region
和 k8s-zone
。
VSPHERE_AZ_0
、VSPHERE_AZ_1
、VSPHERE_AZ_2
设置为需要在其中部署计算机的 VsphereDeploymentZone
对象的名称。
VSPHERE_AZ_0
关联的 VsphereDeploymentZone
是其中部署以 md-0
结尾的计算机的 VSphereFailureDomain
,同样,VSPHERE_AZ_1
是其中部署以 md-1
结尾的计算机的 VSphereFailureDomain
,VSPHERE_AZ_2
是其中部署以 md-2
结尾的计算机的 VSphereFailureDomain
VSphereFailureDomain
WORKER_MACHINE_COUNT
用于设置集群的工作线程总数。工作线程总数以循环方式分布在指定数量的 AZ 上VSPHERE_AZ_CONTROL_PLANE_MATCHING_LABELS
为集群控制平面节点可能部署到的 AZ 设置键/值选择器标签。
VSPHERE_REGION
和 VSPHERE_ZONE
,请设置此变量。VSphereDeploymentZone
资源中。"region=us-west-1,environment=staging"
。AZ 的集群配置变量在独立管理集群和工作负载集群中的工作方式相同。有关将工作负载集群部署到 vSphere 时必须指定的选项的完整列表,请参见配置文件变量参考。
运行 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 中。
您可以更新已部署的管理集群或工作负载集群,以在多个可用区 (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
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。
备注:
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
。