VMware vSphere 基础设施准备

本文档将帮助你准备基础设施,并收集创建 VMware vSphere 业务集群所需的值。在应用 Create a Cluster on VMware vSphere 中的清单之前,请先完成此检查清单。

场景

在以下场景中使用此检查清单:

  • 你正在准备新的 VMware vSphere 集群部署。
  • 你希望在开始部署之前验证外部依赖项。
  • 你计划启用可选的创建时拓扑变体,例如多个数据中心、多个 NIC 或额外的工作节点。

先决条件

开始之前,请确保满足以下条件:

  • 你可以使用 global 访问 kubectl 集群。
  • 业务集群对象必须存储在 cpaas-system 命名空间中。
  • 你可以访问目标 vCenter 清单、网络、数据存储和模板。

如何使用此检查清单

请按以下顺序使用此检查清单:

  1. 收集本文档中列出的部署参数。
  2. 将清单模板中的每个占位符替换为此处收集的实际值。
  3. 如果某个值在多个清单中以占位符形式出现,请始终使用相同的值。
  4. 如果未启用某项可选功能,请按照 Creation-Time Topology Variants 中的说明,准确省略相应的 YAML 块。
  5. 如果不需要某个可选字段(例如 deviceName),请从 YAML 清单中删除整行。

参数来源与安全收集

将参数收集分为以下三个来源。可以从 vCenter 发现某个值,并不意味着该值就是产品支持的版本;同样,产品提供的值也不能替代网络或容量方面的决策。

来源示例收集规则
可自动发现数据中心、计算集群、资源池、网络、数据存储、VM 模板和 vCenter 证书指纹使用只读工具查询 vCenter,然后让 vSphere 管理员确认所选对象。
产品确定Kubernetes、Alauda OS 镜像、Kube-OVN chart、CoreDNS、etcd、provider chart 和 CPI 版本选择针对目标 ACP release 发布的确切版本组合。使用 OS Support Matrix 确认组件版本,并通过 OS 下载页面获取 OS 镜像,同时参考 provider release notes 和交付的软件包元数据;不要独立选择最新的 Registry 标签。
operator 决定集群和资源名称、端点、CIDR、DNS、节点数量、CPU、内存、磁盘容量和凭证记录明确的设计决策及验证负责人。仅凭清单信息无法安全推断这些值。
WARNING

本节中的命令仅用于发现和检查对象是否存在。请勿根据其输出自动生成最终清单,也不要将 vCenter 密码、Kubernetes Secret 数据或其他凭证重定向到检查清单中。

使用 govc 可选地发现 vCenter 信息

如果 govc 已通过受保护的本地环境完成身份验证,请使用如下只读清单命令:

govc find / -type d
govc find / -type c
govc find / -type p
govc find / -type n
govc find / -type s
govc find / -type m

请将结果视为候选项,而非自动选择的对象:

  • d:数据中心
  • c:计算集群
  • p:资源池
  • n:网络或分布式端口组
  • s:数据存储
  • m:VM 和模板;请确认所选对象是模板

使用 Thumbprint 中的 openssl 命令检索证书指纹,而不显示 vCenter 凭证。

术语

以下术语在 VMware vSphere 集群创建文档中保持一致。

机器配置池

机器配置池是 VSphereMachineConfigPool 自定义资源。它预定义节点槽位。每个槽位可以包含:

  • 节点主机名
  • 目标数据中心
  • 每个 NIC 的静态 IP 配置
  • 持久磁盘定义
WARNING

每个 VSphereMachineConfigPool 只能由单个 KubeadmControlPlane 或单个 MachineDeployment 引用。不要在多个控制平面组或 worker 组之间共享同一个 VSphereMachineConfigPool。如果某个池已绑定到其他使用者,VSphereMachine 将报告一个原因是 PoolBoundToOtherConsumer 的 MachineConfigPoolReady=False 条件。

节点槽位

节点槽位是 VSphereMachineConfigPool.spec.configs[] 下的一项。单个槽位通常映射到一个节点,例如 cp-01 或 worker-01。槽位 hostname 会驱动 Kubernetes 节点名称、kubelet 服务证书 DNS SAN,以及(与解析后的主 NIC 地址结合)kubelet 的 node-ip;它必须是有效的 DNS-1123 子域名。

槽位网络布局

每个槽位都在 network.primary 和 network.additional 下声明其 NIC 布局:

  • network.primary 为必需项。必须设置其 networkName,该值用作 kubelet 的 node-ip 来源。
  • network.additional 是可选的额外 NIC 列表,会按照列出的顺序合并到主 NIC 之后。

VSphereMachineConfigPool.spec.configs[].network 中的 dns 值描述每个槽位的静态网络元数据。在受影响的 VMware 部署中,这些值可能无法可靠地更新来宾操作系统的 /etc/resolv.conf。因此,部署清单还会通过 KubeadmControlPlane.spec.kubeadmConfigSpec.files 和 KubeadmConfigTemplate.spec.template.spec.files 同时写入 /etc/resolv.conf。

deviceName

deviceName 是 VSphereMachineConfigPool 网络配置中的可选字段。它用于控制来宾操作系统内部看到的 NIC 名称,例如 eth0 或 eth1。

填充值时请使用以下区分:

  • networkName 是 vCenter 网络或端口组名称。
  • deviceName 是来宾操作系统内部的 NIC 名称。
  • 如果省略 deviceName,CAPV 通常会根据 NIC 顺序分配类似 eth0、eth1 和 eth2 的名称。

vCenter 资源池

vCenter 资源池是 vCenter 原生清单对象,例如:

/Datacenter1/host/cluster1/Resources

启用故障域创建变体时,VSphereDeploymentZone.spec.placementConstraint.resourcePool 会使用此路径。

计算集群

计算集群是目标 vCenter 计算集群名称。在本文档中,当 VSphereFailureDomain 映射到特定部署目标时,主要使用此名称。

数据存储

数据存储是用于存储 VM 磁盘的 vSphere 存储位置。系统磁盘和数据磁盘都必须置于具体的数据存储上。

VM 模板

VM 模板是用于创建节点虚拟机的源模板。启用多个数据中心时,同一模板必须已存在于每个目标数据中心中,并且必须能够通过相同的模板名称解析。

指纹

指纹是 vCenter 服务器证书的 SHA-1 指纹。CAPV 使用它来验证目标 vCenter 服务器。

使用以下命令检索该指纹:

openssl s_client -connect <vsphere_server>:443 -servername <vsphere_server> </dev/null 2>/dev/null | openssl x509 -noout -fingerprint -sha1

管理集群先决条件

使用下表记录所需值和验证结果。

参数占位符必需验证或备注示例实际值
global 集群 kubeconfig 路径-是使用此 kubeconfig 执行 kubectl get ns 成功。/path/to/kubeconfig-
业务对象命名空间<namespace>是存储业务集群对象的命名空间。必须为 cpaas-system。cpaas-system-
已安装 cluster-api-provider-vsphere-是kubectl get minfo -l cpaas.io/module-name=cluster-api-provider-vsphere 返回结果。Yes-
已安装 cluster-api-provider-kubeadm-是kubectl get minfo -l cpaas.io/module-name=cluster-api-provider-kubeadm 返回结果。Yes-
已启用 ClusterResourceSet=true-是capi-controller-manager 参数中包含 ClusterResourceSet=true。Yes-

vCenter 和模板先决条件

vCenter 连接信息

参数占位符必需验证或备注示例实际值
vCenter 服务器<vsphere_server>是使用 vCenter IP 地址或 FQDN。vc.example.local-
vCenter 用户名<vsphere_username>是CAPV 使用此用户名向 vCenter 进行身份验证。svc-capv@example.local-
vCenter 密码<vsphere_password>是CAPV 使用此密码向 vCenter 进行身份验证。******-
指纹<thumbprint>是使用前文所示的 openssl 命令检索。AA:BB:CC:...-

注意:这些文档假设使用默认的 vCenter HTTPS 端口 443。

VM 模板要求

参数占位符必需验证或备注示例实际值
VM 模板名称<template_name>是用于克隆控制平面节点和工作节点。alaudaos-k8s-template-
vCenter 凭证 Secret 名称<credentials_secret_name>是使用稳定的名称,例如 <cluster_name>-vsphere-credentials。demo-cluster-vsphere-credentials-
克隆模式<clone_mode>是允许的值:linkedClone、fullClone。默认值为 linkedClone。linkedClone 要求 VM 模板至少有一个快照;如果不存在快照,CAPV 将回退到 fullClone。使用 linkedClone 时,diskGiB 将被忽略;系统磁盘保持模板的大小。如果需要使 diskGiB 生效,请选择 fullClone。linkedClone-
关机模式<power_off_mode>是允许的值:hard、soft、trySoft。默认值为 hard。soft 和 trySoft 要求模板中存在 VMware Tools / open-vm-tools,以执行优雅关机;在 guest-soft-power-off 超时后,trySoft 将回退到 hard。trySoft-
SSH 公钥<ssh_public_key>是注入控制平面节点和工作节点。ssh-rsa AAAA...-

模板还应满足以下要求:

  • 使用平台镜像策略支持的操作系统。
  • 包含 cloud-init。
  • 包含 VMware Tools 或 open-vm-tools。
  • 包含 containerd。
  • 包含 kubeadm 引导所需的基线组件。
  • 在 /root/images/ 下包含预先导出的容器镜像 tar 文件。这些文件会在运行 kubeadm 之前由 capv-load-local-images.sh 导入 containerd,因此节点引导不依赖于从远程 Registry 拉取镜像。
  • tar 文件包含随 OS 模板提供的 kubeadm 控制平面镜像,包括 etcd 和 kube-apiserver,并且这些镜像使用根据 clusterConfiguration.imageRepository、Kubernetes 版本和组件镜像标签生成的确切镜像引用。尽管 etcd 和 kube-apiserver 作为静态 Pod 运行,但仍需要容器镜像。缺失或不匹配的本地引用会导致运行时改为尝试从配置的 Registry 获取镜像。
  • /root/images/*.tar 文件必须包含 sandbox(pause)镜像,并且其引用必须与 /etc/containerd/config.toml 中配置的 sandbox_image 值(containerd v1)或 sandbox 值(containerd v2)完全匹配。例如,如果 containerd 配置为 sandbox_image = "registry.example.com/tkestack/pause:3.10",则其中一个 tar 文件必须包含该确切的镜像引用。不匹配会导致 containerd 从网络拉取 sandbox 镜像,从而违背本地预加载的目的,并在 air-gapped 环境中失败。

负载均衡器前提条件

本节介绍基线集群使用的外部负载均衡器端点。请在创建集群之前完成配置,并遵循规划控制平面端点。也可以使用 provider 管理的 Self-built VIP 创建集群,此方式无需外部负载均衡器,并且要求 ACP v4.4 或更高版本;请参阅控制平面端点模式。

参数占位符必需验证或备注示例实际值
控制平面 VIP<vip>是前端地址已分配、稳定,并且始终为 IP 地址——外部负载均衡器 VIP,或 Self-built VIP 使用的 IPv4 地址。不支持将域名用作集群端点。10.10.10.10-
API 服务器端口<api_server_port>是默认端口为 6443。6443-
监听器模式-是使用 TLS 透传的 Layer 4 TCP 转发。TCP-
后端-是每个计划中的控制平面节点 IP 都注册在后端端口 6443 上;不包含工作节点 IP。3 control-plane IPs-
健康检查-是优先使用 HTTPS /healthz,并结合 HTTP 200。如果设备只能执行 TCP 连接检查,请记录下来。HTTPS /healthz-
端点连通性-是global 集群和每个控制平面节点都可以访问 <vip>:6443。Yes-
后端维护责任-是明确在控制平面扩容、替换或删除后负责更新后端的人员。Platform team-
虚拟路由器 ID<vrid>集群使用 Self-built VIP 时必需Keepalived virtual_router_id、1–255,在控制平面的 Layer-2 域中必须唯一。51-
VIP 接口<vip_interface>集群使用 Self-built VIP 时必需承载 VIP 的主机接口,最多 15 个字符。留空可让 provider 匹配承载节点主 IP 的接口;对于多 NIC 节点,请显式设置,因为之后无法更改。ens192-

集群基线参数

参数占位符必需验证或备注示例实际值
集群名称<cluster_name>是在所有 manifest 中使用相同的值。demo-cluster-
Kubernetes 版本<k8s_version>是使用目标平台版本所需的版本。对于 Kubernetes 1.34 或更早版本,基线 manifest 会省略 imagePullCredentialsVerificationPolicy。对于 Kubernetes 1.35 或更高版本,请在控制平面和工作节点 manifest 中,将 imagePullCredentialsVerificationPolicy: NeverVerify 添加到 kubelet patch 中。v1.35.6-acp.1(需要 Kubernetes 1.35 kubelet patch)-
控制平面副本数<cp_replicas>是必须为 3 或更多。provider 的 admission webhook 会拒绝副本数较少的、由 pool 支持的 KubeadmControlPlane,并且之后无法升级 replicas: 1 控制平面。请参阅Provider Requirements。3-
工作节点副本数<worker_replicas>是基线拓扑使用 1。1-
Pod CIDR<pod_cidr>是不得与现有网络重叠。10.244.0.0/16-
Service CIDR<service_cidr>是不得与现有网络重叠。10.96.0.0/12-
镜像 Registry<image_registry>是kubeadm imageRepository 使用的 Registry 地址,不包含 URL scheme 或 /v2/。该值会成为 <image_registry>/tkestack。registry.example.local:11443-
集群 Registry 地址<registry_address>是可从业务节点访问的永久 Registry 地址。仅对 cpaas.io/registry-address 使用 <host>:<port>;不要使用已退役的 bootstrap Registry,也不要追加 /v2/。registry.example.local:11443-
kube-ovn 版本<kube_ovn_version>是必须符合平台网络插件的要求。v4.4.1-
kube-ovn-join-cidr<kube_ovn_join_cidr>是不得与其他网络重叠。100.64.0.0/16-
CoreDNS 镜像 tag<dns_image_tag>是使用为目标 ACP 版本发布的 tag,并连同其 -v<acp> 后缀逐字复制:在 ACP v4.4 及更高版本中,使用暂存于 acp/coredns 下的 tag;在低于 v4.4 的版本中,使用 tkestack/coredns 下的 tag。provider 会读取后缀来选择该仓库,因此不带后缀的 tag 会解析为 tkestack/coredns,并且在 ACP v4.4 或更高版本上拉取失败。不要设置 dns.imageRepository;请参阅manifest 中由 Provider 管理的字段。1.14.3-v4.4.6-
etcd 镜像 tag<etcd_image_tag>是使用 Kubernetes 版本批准的 tag。从同一OS Support Matrix 行中获取它以及其他版本值。v3.6.13-acp.0-
加密 provider Secret<encryption_provider_secret>是用于静态加密 Secret 的 Base64 编码 AES 密钥。使用 head -c 32 /dev/urandom | base64 生成。不要重复使用示例值。(生成)-

Registry tag 验证

首先从 global 集群读取永久 Registry 地址,或向平台管理员确认等效地址:

kubectl -n cpaas-system get cluster global \
  -o jsonpath='{.metadata.annotations.cpaas\.io/registry-address}{"\n"}'
kubectl -n cpaas-system get secret public-registry-credential -o name

Secret 命令仅验证是否存在,不会打印凭证数据。导出已确认的集群 Registry 地址,以及 CPI 和 kubeadm manifest 使用的镜像 Registry。如果两个占位符指向同一个 Registry,则对两个变量使用相同的值。

export CLUSTER_REGISTRY_ADDRESS="<registry_address>"
export IMAGE_REGISTRY_ADDRESS="<image_registry>"
# Repository names depend on the target version. The values below are the
# ACP v4.4 and later ones; for an earlier target, change them to:
#   Kube-OVN chart -> acp/chart-cpaas-kube-ovn
#   CoreDNS        -> tkestack/coredns
export KUBE_OVN_CHART_REPO="acp/chart-kube-ovn"
export COREDNS_REPO="acp/coredns"

curl -sk "https://${CLUSTER_REGISTRY_ADDRESS}/v2/${KUBE_OVN_CHART_REPO}/tags/list"
curl -sk "https://${IMAGE_REGISTRY_ADDRESS}/v2/${COREDNS_REPO}/tags/list"
curl -sk "https://${IMAGE_REGISTRY_ADDRESS}/v2/acp/cloud-provider-vsphere/tags/list"

NAME_UNKNOWN 响应表示仓库名称与目标版本不匹配;请根据上面的映射修正 KUBE_OVN_CHART_REPO 或 COREDNS_REPO 并重试,而不要将其解读为缺少 tag。

权威的 chart-name 边界位于控制平面之前升级 Kube-OVN。

/v2/ 片段仅属于这些 Registry HTTP API URL。镜像引用使用 <registry>/<repository>:<tag>,而 Cluster annotation 使用 <host>:<port>。

确认响应包含计划使用的以下值:

  • <kube_ovn_version>
  • <dns_image_tag>
  • <cpi_image_tag>

当 VM template 包含 etcd 或 kube-apiserver 镜像的精确镜像引用,并且 capv-load-local-images.sh 在 kubeadm 运行前导入这些镜像时,Registry 无需提供这些镜像。仅部署 Static Pod 并不足够:每当 OS template、Kubernetes 版本、imageRepository 或组件 tag 发生变化时,都要验证本地镜像。

验证本地预加载的镜像

使用确切的候选 template 创建并启动一个临时 VM。在该 VM 中运行以下命令,以执行 kubeadm 之前使用的相同导入路径,并列出 containerd 实际可用的镜像引用:

sudo bash -euo pipefail <<'EOF'
shopt -s nullglob
image_files=(/root/images/*.tar)
if (( ${#image_files[@]} == 0 )); then
  echo "ERROR: no tar files found in /root/images" >&2
  exit 1
fi

systemctl restart containerd
for image_file in "${image_files[@]}"; do
  ctr -n k8s.io images import "${image_file}"
done
ctr -n k8s.io images list -q | sort -u
EOF

sudo grep -nE '^[[:space:]]*(sandbox_image|sandbox)[[:space:]]*=' \
  /etc/containerd/config.toml

将第一条命令的输出与所选 Kubernetes 版本和 manifest 值所需的完整引用进行比较。确认每个必需的 kubeadm 镜像都已存在,包括根据 <image_registry>/tkestack、<k8s_version> 和组件 tag 生成的精确 etcd 与 kube-apiserver 引用。将第二条命令的 sandbox 引用与导入的 pause 镜像引用进行比较;两者必须完全一致。

每当 template、Kubernetes 版本、imageRepository、etcd tag 或 containerd sandbox 设置发生变化时,都要重新执行此验证。之后销毁验证 VM;不要将其转换回源 template。

在业务 Cluster annotation 中将 cpaas.io/registry-address 设置为 <registry_address>。

最低单数据中心参数

数据中心和资源放置

参数占位符必需验证或说明示例实际值
默认数据中心<default_datacenter>是由基线拓扑使用。dc-a-
VM 文件夹<vm_folder>是从 VSphereMachineTemplate 创建的 VM 的文件夹路径。使用 /<datacenter>/vm/<cluster_name>,以便操作员可以在 vCenter 中识别 VM 所属的集群。对于 global DR 部署,在 <cluster_name> 下添加一个子文件夹,以区分主集群和备用集群。/dc-a/vm/demo-cluster-

主 NIC 参数

参数占位符必需验证或说明示例实际值
vCenter 网络名称<nic1_network_name>是vCenter 中第一个网络或端口组的名称。pg-business-
Guest NIC 名称<nic1_device_name>否仅当需要强制指定 Guest NIC 名称时设置。如果不需要,请从 YAML manifest 中删除 deviceName 行。eth0-
网关<nic1_gateway>是主 NIC 的默认网关。10.10.10.1-
前缀长度<nic1_prefix>是与每个节点 IP 地址一起使用。24-
DNS 服务器 1<nic1_dns_1>是主 NIC 的 DNS 服务器。10.10.0.10-

控制平面 machine config pool

参数占位符必需验证或说明示例实际值
控制平面 pool 名称<cluster_name>-cp-pool是控制平面节点的 machine config pool 名称。在 Machine 替换期间保持使用相同的现有 pool 引用。不同的 pool 对象拥有独立的 slot 和 VMDK。demo-cluster-cp-pool-
控制平面节点 1 主机名<cp_node_name_1>是第一个控制平面节点的节点名称和 kubelet serving cert SAN。必须是有效的 DNS-1123 子域名。cp-01-
控制平面节点 1 数据中心<master_01_datacenter>是通常与默认数据中心相同。dc-a-
控制平面节点 1 IP 地址<master_01_nic1_ip>是仅限 IPv4 地址,不包含前缀长度。10.10.10.11-
控制平面节点 2 主机名<cp_node_name_2>是第二个控制平面节点的节点名称和 kubelet serving cert SAN。必须是有效的 DNS-1123 子域名。cp-02-
控制平面节点 2 数据中心<master_02_datacenter>是通常与默认数据中心相同。dc-a-
控制平面节点 2 IP 地址<master_02_nic1_ip>是仅限 IPv4 地址,不包含前缀长度。10.10.10.12-
控制平面节点 3 主机名<cp_node_name_3>是第三个控制平面节点的节点名称和 kubelet serving cert SAN。必须是有效的 DNS-1123 子域名。cp-03-
控制平面节点 3 数据中心<master_03_datacenter>是通常与默认数据中心相同。dc-a-
控制平面节点 3 IP 地址<master_03_nic1_ip>是仅限 IPv4 地址,不包含前缀长度。10.10.10.13-

Worker machine config pool

参数占位符必需验证或说明示例实际值
Worker pool 名称<cluster_name>-worker-pool是Worker 节点的 machine config pool 名称。在 Machine 替换期间保持使用相同的现有 pool 引用。不同的 pool 对象拥有独立的 slot 和 VMDK。demo-cluster-worker-pool-
Worker 节点 1 主机名<worker_node_name_1>是第一个 Worker 节点的节点名称和 kubelet serving cert SAN。必须是有效的 DNS-1123 子域名。worker-01-
Worker 节点 1 数据中心<worker_01_datacenter>是通常与默认数据中心相同。dc-a-
Worker 节点 1 IP 地址<worker_01_nic1_ip>是仅限 IPv4 地址,不包含前缀长度。10.10.10.21-
Worker 节点 2 主机名<worker_node_name_2>否扩展 Worker pool 时使用。worker-02-
Worker 节点 2 数据中心<worker_02_datacenter>否扩展 Worker pool 时使用。dc-b-
Worker 节点 2 IP 地址<worker_02_nic1_ip>否扩展 Worker pool 时使用。10.10.10.22-
releaseDelayHours<release_delay_hours>是provider 从未使用的 Released slot 回收持久 VMDK 前的延迟时间。默认值为 24。引用同一现有 pool 的替换 Machine 可以立即重新使用 Released slot;无需等待此延迟结束。24-

计算资源规格

参数占位符必需验证或说明示例实际值
控制平面 CPU<cp_num_cpus>是每个控制平面节点的 CPU 数量。4-
控制平面内存 MiB<cp_memory_mib>是每个控制平面节点的内存。8192-
控制平面系统 datastore<cp_system_datastore>是控制平面系统磁盘使用的 datastore。datastore-cp-
控制平面系统磁盘大小 GiB<cp_system_disk_gib>是基线示例值为 300。当 <clone_mode> 为 linkedClone 时忽略;此时系统磁盘保持模板中的大小。300-
Worker CPU<worker_num_cpus>是每个 Worker 节点的 CPU 数量。2-
Worker 内存 MiB<worker_memory_mib>是每个 Worker 节点的内存。4096-
Worker 系统 datastore<worker_system_datastore>是Worker 系统磁盘使用的 datastore。datastore-worker-
Worker 系统磁盘大小 GiB<worker_system_disk_gib>是基线示例值为 300。当 <clone_mode> 为 linkedClone 时忽略;此时系统磁盘保持模板中的大小。300-

磁盘大小模型

VSphereMachineTemplate.spec.template.spec.diskGiB 和 VSphereMachineConfigPool.spec.configs[] 下的两个磁盘列表定义不同的磁盘。

字段磁盘类型含义
VSphereMachineTemplate.spec.template.spec.diskGiB系统磁盘在由 fullClone 创建 VM 时设置 VM 根磁盘或系统磁盘的大小。该值必须大于或等于 OS 镜像模板中的系统磁盘大小。它不是所有磁盘大小的总和。
VSphereMachineConfigPool.spec.configs[].persistentDisks[]持久数据磁盘绑定到节点 slot 并重新连接到替换 VM 的额外 VMDK,例如 /var/cpaas。与系统磁盘分开。
VSphereMachineConfigPool.spec.configs[].ephemeralDisks[]临时数据磁盘随 VM 一起创建为空并随 VM 一起删除的额外 VMDK,例如 /var/lib/kubelet、/var/lib/containerd 和 /var/lib/etcd。与系统磁盘分开。

不要将数据磁盘大小加到 diskGiB 中。例如,如果 OS 镜像具有 100 GiB 系统磁盘,并且节点还需要一个 100 GiB 持久磁盘和三个临时磁盘,请使用至少为 100 GiB 的系统磁盘值,并在 persistentDisks 和 ephemeralDisks 中声明数据磁盘。将 diskGiB 设置为合并大小,会在数据磁盘之外创建一个过大的系统磁盘。

标准数据磁盘

每个节点角色都需要一组专用数据磁盘。下面列出的磁盘是所需的最少磁盘数。如果工作负载需要,您可以向任一列表追加其他磁盘。在第一个 Machine 占用 slot 之前,规划好磁盘、磁盘大小和挂载路径:处于 InUse 或 Released 状态的 slot 会拒绝移除持久磁盘,或更改其 sizeGiB 或 mountPath。

这种划分遵循 Huawei Cloud Stack 和 Huawei DCS provider 使用的相同模型:只有必须在 VM 替换后保留的平台状态(/var/cpaas)才使用持久磁盘,而可重建的运行时目录(/var/lib/kubelet、/var/lib/containerd、/var/lib/etcd)会随每个 VM 重新创建。

WARNING

此划分仅适用于新集群

ephemeralDisks[] 在 provider v1.0.17 中新增,因此此布局是在创建时确定的选项。在较早 provider 上创建的集群会将 /var/cpaas、/var/lib/containerd 和 /var/lib/etcd 声明为持久磁盘,并将 wipeFilesystem: true 放在 etcd 磁盘上,同时保留该布局。provider 升级不会迁移任何磁盘。请参阅升级 Provider。

持久磁盘字段

字段必填默认值描述
name是—slot 内唯一的磁盘名称。
sizeGiB是—磁盘大小,单位为 GiB。
mountPath否(空)guest OS 内的挂载路径。如果为空,则磁盘会作为原始设备附加,并在 /dev/disk/by-capv/<name> 处创建符号链接,但不会进行格式化或挂载。当外部进程在运行时管理磁盘时,此设置很有用。
mountOptions否(空)在设置 mountPath 时应用的挂载选项。
fsFormat否ext4(设置 mountPath 时)文件系统格式。当 mountPath 为空时忽略。
wipeFilesystem否false当 true 时,磁盘内容会在新 VM 首次启动时被擦除。重启和手动重启服务不受影响。标准磁盘集不使用此设置:唯一的持久磁盘 /var/cpaas 用于在替换过程中保留其内容,而所有必须以空磁盘启动的磁盘都在 ephemeralDisks[] 中声明。
unitNumber否(由 controller 分配)用于在 VM 重新创建过程中保持 guest 设备顺序稳定的 SCSI 单元。取值范围为 0 到 15,不能为 7(该值保留给 SCSI controller),并且在 slot 内必须唯一。
datastore否(pool 默认值)覆盖此磁盘使用的 datastore。
storagePolicy否(pool 默认值)覆盖此磁盘使用的 vSphere 存储策略。

临时磁盘字段

ephemeralDisks[] 镜像持久磁盘面向 guest 的字段——name、sizeGiB、mountPath、mountOptions、fsFormat、datastore 和 storagePolicy——并省略持久性字段。不存在 wipeFilesystem,因为后端 VMDK 始终会新建,并从头开始格式化;也不存在 unitNumber,因为 controller 会在克隆时分配 SCSI 单元,并在 status.ephemeralDiskStatuses[] 中报告该单元。

在一个 slot 内,两个列表中的磁盘名称和挂载路径共享同一命名空间。有关逐字段比较以及应使用哪个列表的指导,请参阅选择持久磁盘或临时磁盘。

持久磁盘生命周期

持久磁盘归属于特定 VSphereMachineConfigPool 中的 slot,而不属于生命周期短暂的 VM。即使另一个 pool 声明了相同的主机名、IP 地址或磁盘名称,其中的 slot 仍属于不同的分配。预期的替换生命周期如下:

  1. 当 Machine 使用该 slot 时,status.configStatuses[].state 为 InUse,VMDK 会附加到其 VM。
  2. 当 Machine 和 VM 被删除时,slot 变为 Released。VMDK 仍可供替换使用,不会成为永久孤立的磁盘。
  3. 引用同一现有 pool 的替换 Machine 可以立即重新使用 Released slot。provider 会优先选择已释放的 slot,而不是未使用的 slot,并将声明的持久 VMDK 重新附加到替换 VM。releaseDelayHours 不是重新使用前的等待时间。
  4. 如果 slot 在 releaseDelayHours 到期前一直未使用,controller 可以使其重新可用,并且只有在确认 VMDK 不再附加后才回收持久 VMDK。异步进度会显示在 status.persistentDiskStatuses[].phase 中。

wipeFilesystem 控制持久磁盘附加到新 VM 后的数据处理;它不控制 slot 选择或 datastore 回收。false 保留现有文件系统内容。true 会在新 VM 首次启动期间删除已挂载的内容;它不会加快 VMDK 回收速度,也不得将其视为 datastore 容量设置。

重新部署和拆除容量

使用不同的 metadata.name 创建新的 VSphereMachineConfigPool 会创建一组独立的 slot。这些 slot 不会重新使用早期 pool 所拥有的 VMDK。因此,使用不同 pool 名称反复拆除和重新部署,可能会暂时消耗多组完整的持久磁盘,直到所有早期 pool 完成 provider 管理的回收。

重试或拆除部署时,请遵循以下规则:

  • 对于同一集群内的 Machine 替换或滚动更新,请让每个 VSphereMachineTemplate.spec.template.spec.machineConfigPoolRef.name 始终指向同一现有 pool。更改 KubeadmControlPlane.spec.machineNamingStrategy 不会在 pool 之间转移磁盘,也不是 datastore 清理控制项。
  • 如果新部署有意使用新的 pool 名称,请将新 pool 的完整持久磁盘分配纳入 datastore 容量规划。不要假设相匹配的主机名或磁盘名称可以支持跨 pool 重用。
  • 在容量受限的 datastore 上开始另一次部署之前,请确认早期 pool 对象已完成删除,并且其 VMDK 已被回收。pool 删除是异步的,因为 finalizer 会等待 Machine 被移除并等待持久磁盘回收完成。
  • 不要移除 pool finalizer,也不要手动删除后端 VMDK 来加速拆除。如果回收没有进展,请先收集 pool 状态、Events、provider-controller 日志和 vCenter 附加状态,再将该情况视为 provider 缺陷。
  • 为两个列表都规划 datastore 容量。临时 VMDK 会在其 VM 存在期间占用 datastore 空间,但会随 VM 一起删除,因此不会跨 pool 累积,也不会阻止 slot 释放。只有持久 VMDK 会在拆除后保留,并等待 provider 管理的回收。

调查已释放的 slot 或 datastore 容量告警时,请使用以下字段:

状态字段含义
stateSlot 分配状态:Available、InUse 或 Released。
lastReleasedTimeslot 进入 Released 的时间。将其与 releaseDelayHours 进行比较。
reclaimStatus.*已弃用。provider 升级时会将其合并到 status.persistentDiskStatuses[],然后清除该字段。

从 status.persistentDiskStatuses[] 读取每个磁盘的状态。其 phase 字段包含 Creating、Attached、Available、Reclaiming、Reclaimed 或 Error,并且每个条目还会报告 lastError、retryAfter、taskRef 以及所属 machine。status.configStatuses[].reclaimStatus 子树以及 spec.configs[].persistentDisks[].volumePath 和 .diskUUID 字段已弃用、冻结,并计划移除。现有 pool 会由 provider 自身迁移到 persistentDiskStatuses[];请参阅升级 Provider。

检查 pool 和相关 Events,而无需读取凭证:

kubectl -n <namespace> get vspheremachineconfigpool <pool_name> -o yaml
kubectl -n <namespace> describe vspheremachineconfigpool <pool_name>
kubectl -n <namespace> get events \
  --field-selector involvedObject.kind=VSphereMachineConfigPool,involvedObject.name=<pool_name>
WARNING

当 slot 处于 Released 状态时,或其 persistentDiskStatuses[].phase 为 Reclaiming 或 Error 时,不要手动删除 VMDK。替换 Machine 可能仍会重新使用该 VMDK,或者 provider 可能正在重试已验证的回收操作。在执行任何手动 datastore 清理之前,请确认 pool 状态、保留窗口、附加状态和 controller 状态。

控制平面节点(每个节点 4 个磁盘)

磁盘名称挂载路径磁盘列表用途建议最小大小占位符
var-cpaas/var/cpaaspersistentDisks[]存储日志、审计数据和其他平台数据100 GiB<cp_var_cpaas_size_gib>
var-lib-kubelet/var/lib/kubeletephemeralDisks[]存储 kubelet 工作数据,包括 pod 卷和插件套接字100 GiB<cp_var_lib_kubelet_size_gib>
var-lib-containerd/var/lib/containerdephemeralDisks[]存储 containerd 运行时数据(镜像、层、快照)100 GiB<cp_var_lib_containerd_size_gib>
var-lib-etcd/var/lib/etcdephemeralDisks[]存储 etcd 数据。每个新 VM 都会创建一个空磁盘,因此替换后的控制平面节点不会将过时的成员数据带入 kubeadm join。20 GiB<cp_var_lib_etcd_size_gib>

Worker 节点(每个节点 3 个磁盘)

磁盘名称挂载路径磁盘列表用途建议最小大小占位符
var-cpaas/var/cpaaspersistentDisks[]存储日志、审计数据和其他平台数据100 GiB<worker_var_cpaas_size_gib>
var-lib-kubelet/var/lib/kubeletephemeralDisks[]存储 kubelet 工作数据,包括 pod 卷和插件套接字100 GiB<worker_var_lib_kubelet_size_gib>
var-lib-containerd/var/lib/containerdephemeralDisks[]存储 containerd 运行时数据(镜像、层、快照)100 GiB<worker_var_lib_containerd_size_gib>

大小参数

参数占位符必填验证或备注示例实际值
CP /var/cpaas 大小(GiB)<cp_var_cpaas_size_gib>是建议最小值为 100 GiB。100-
CP /var/lib/kubelet 大小(GiB)<cp_var_lib_kubelet_size_gib>是建议最小值为 100 GiB。100-
CP /var/lib/containerd 大小(GiB)<cp_var_lib_containerd_size_gib>是建议最小值为 100 GiB。100-
CP /var/lib/etcd 大小(GiB)<cp_var_lib_etcd_size_gib>是建议最小值为 20 GiB。20-
Worker /var/cpaas 大小(GiB)<worker_var_cpaas_size_gib>是建议最小值为 100 GiB。100-
Worker /var/lib/kubelet 大小(GiB)<worker_var_lib_kubelet_size_gib>是建议最小值为 100 GiB。100-
Worker /var/lib/containerd 大小(GiB)<worker_var_lib_containerd_size_gib>是建议最小值为 100 GiB。100-

vSphere CPI 参数

参数占位符必填验证或备注示例实际值
CPI 数据中心列表<cpi_datacenters>是启用多个数据中心时,包含每个目标数据中心。dc-a,dc-b-
CPI 镜像标签<cpi_image_tag>是vSphere CPI 组件的标签。完整引用为 <image_registry>/acp/cloud-provider-vsphere:<cpi_image_tag>。v1.33.1-alauda.1-

创建时可选的拓扑参数

多个数据中心和多个故障域

参数占位符必填验证或备注示例实际值
数据中心 1 故障域名称<fd_name_1>否仅在启用故障域时必填。fd-a-
数据中心 1 部署区域名称<dz_name_1>否仅在启用故障域时必填。dz-a-
计算集群名称<compute_cluster_1>否仅在启用故障域时必填。compute-a-
默认数据存储<default_datastore_1>否仅在启用故障域时必填。datastore-a-
vCenter 资源池路径<resource_pool_path_1>否仅在启用故障域时必填。必须存在于 vCenter 清单中。/dc-a/host/compute-a/Resources-
数据中心 2 名称<dc_name_2>否仅用于多个数据中心或故障域。dc-b-
数据中心 2 故障域名称<fd_name_2>否仅用于多个数据中心或故障域。fd-b-
数据中心 2 部署区域名称<dz_name_2>否仅用于多个数据中心或故障域。dz-b-
数据中心 2 计算集群<compute_cluster_2>否仅用于多个数据中心或故障域。compute-b-
数据中心 2 默认数据存储<default_datastore_2>否仅用于多个数据中心或故障域。datastore-b-
数据中心 2 vCenter 资源池路径<resource_pool_path_2>否仅用于多个数据中心或故障域。/dc-b/host/compute-b/Resources-
Worker 部署区域<worker_failure_domain>否使用 VSphereDeploymentZone 名称,而不是 VSphereFailureDomain 名称。dz-a-
数据中心 3 名称<dc_name_3>否仅用于其他数据中心或故障域场景。dc-c-
数据中心 3 故障域名称<fd_name_3>否仅用于其他数据中心或故障域场景。fd-c-
数据中心 3 部署区域名称<dz_name_3>否仅用于其他数据中心或故障域场景。dz-c-
数据中心 3 计算集群<compute_cluster_3>否仅用于其他数据中心或故障域场景。compute-c-
数据中心 3 默认数据存储<default_datastore_3>否仅用于其他数据中心或故障域场景。datastore-c-
数据中心 3 vCenter 资源池路径<resource_pool_path_3>否仅用于其他数据中心或故障域场景。/dc-c/host/compute-c/Resources-

第二个 NIC 参数

参数占位符必填验证或备注示例实际值
次要网络名称<nic2_network_name>否仅在节点需要第二个 NIC 时使用。pg-management-
次要 guest NIC 名称<nic2_device_name>否仅在需要强制指定 guest NIC 名称时设置。eth1-
次要网关<nic2_gateway>否仅在节点需要第二个 NIC 时使用。10.20.10.1-
次要前缀长度<nic2_prefix>否与每个次要 NIC IP 地址配合使用。24-
次要 DNS 服务器 1<nic2_dns_1>否仅在节点需要第二个 NIC 时使用。10.20.0.10-
控制平面节点 1 次要 IP<master_01_nic2_ip>否仅在节点需要第二个 NIC 时使用。10.20.10.11-
控制平面节点 2 次要 IP<master_02_nic2_ip>否仅在节点需要第二个 NIC 时使用。10.20.10.12-
控制平面节点 3 次要 IP<master_03_nic2_ip>否仅在节点需要第二个 NIC 时使用。10.20.10.13-
Worker 节点 1 次要 IP<worker_01_nic2_ip>否仅在节点需要第二个 NIC 时使用。10.20.10.21-
Worker 节点 2 次要 IP<worker_02_nic2_ip>否在扩展 Worker 且需要第二个 NIC 时使用。10.20.10.22-

最终就绪检查

开始部署前,请确认以下所有项目:

  1. global 集群可访问。
  2. 两个集群插件均已安装:Alauda Container Platform Cluster Bootstrap Provider 和适用于 Virtualization Platform 的 Alauda Container Platform Infrastructure Provider。
  3. ClusterResourceSet=true 已启用。
  4. 已收集 vCenter 服务器、用户名、密码和 thumbprint。
  5. 外部 LoadBalancer 满足 Layer 4 监听器、后端、运行状况检查、所有权和可访问性要求。如果集群改用 Self-built VIP,则已满足 Self-built VIP 前提条件,并已确定 <vrid> 和 <vip_interface>。
  6. Pod CIDR、Service CIDR 和 kube-ovn-join-cidr 不与现有网络重叠。
  7. VM 模板在每个所需的数据中心中均可用。
  8. 所需的数据存储和 vCenter 资源池路径已确认。
  9. 永久平台 Registry 包含所需的 Kube-OVN、CoreDNS 和 vSphere CPI 标签。
  10. VM 模板包含所选 Kubernetes 和组件版本所需的、预加载到本地的 etcd 和 kube-apiserver 镜像的准确引用。
  11. cpaas.io/registry-address 的值规划为不带 scheme 的 <registry_address>,或规划为 /v2/ 路径。
  12. 控制平面和 Worker 的 bootstrap manifest 均通过 kubeadm files 写入 /etc/resolv.conf。
  13. 最小单数据中心拓扑的 machine config pool 值均已填写完整。
  14. 基准系统磁盘和数据磁盘大小已确认,每个所需磁盘均已声明在正确的列表中(/var/cpaas 为持久磁盘;/var/lib/kubelet、/var/lib/containerd 和 /var/lib/etcd 为临时磁盘),且数据磁盘大小未计入 diskGiB。
  15. 在分配数据存储容量前,已了解 releaseDelayHours、同池持久磁盘复用、新池容量分配以及由 provider 管理的拆除回收。
  16. 每个所需参数均具有实际值。

后续步骤

完成此检查清单后,继续阅读在 VMware vSphere 上创建集群。