VMware vSphere 基础设施准备

本文帮助您准备创建 VMware vSphere 业务集群所需的基础设施并收集必要值。在应用在 VMware vSphere 上创建集群中的清单之前,请完成此检查清单。本页中的 provider 行为和字段已根据 VMware vSphere Provider v1.0.17 进行验证。

场景

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

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

前提条件

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

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

如何使用此检查清单

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

  1. 收集本文档中列出的部署参数。
  2. 将清单模板中的每个占位符替换为此处收集的实际值。
  3. 如果某个占位符出现在多个清单中,请在所有位置重复使用相同的值。
  4. 如果未启用某项可选功能,请按照创建时拓扑变体中的说明,准确省略相应的 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 tag。
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 将报告一个条件为 MachineConfigPoolReady=False、原因是 PoolBoundToOtherConsumer 的状态。

节点插槽

节点插槽是 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,以实现优雅关机;trySoft 在 guest 软关机超时后回退到 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 环境中失败。

负载均衡器前提条件

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

参数占位符必需验证或备注示例实际值
控制平面 VIP<vip>是前端地址已分配且稳定,并且始终为 IP 地址——外部负载均衡器 VIP,或 Self-built VIP 使用的 IPv4 地址。集群端点不支持域名。10.10.10.10-
API server 端口<api_server_port>是默认端口为 6443。6443-
监听器模式-是第 4 层 TCP 转发,并采用 TLS 透传。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,在控制平面第 2 层域内唯一。51-
VIP 接口<vip_interface>集群使用 Self-built VIP 时必需承载 VIP 的主机接口,最多 15 个字符。留空时,provider 会匹配持有节点主 IP 的接口;对于多 NIC 节点,请显式设置,因为之后无法更改。ens192-

集群基线参数

参数占位符必需验证或备注示例实际值
集群名称<cluster_name>是在所有 manifest 中使用相同的值。demo-cluster-
Kubernetes 版本<k8s_version>是使用目标平台 release 所需的版本。对于 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 release 发布的 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/ait/cloud-provider-vsphere/tags/list"

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

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

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

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

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

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

验证本地预加载的镜像

使用准确的候选模板创建并启动一个临时 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 镜像引用进行比较;两者必须完全一致。

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

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

最小单数据中心参数

数据中心和资源放置

参数占位符必填验证或备注示例实际值
默认数据中心<default_datacenter>是基线拓扑使用的值。dc-a-
VM 文件夹<vm_folder>是从 VSphereMachineTemplate 创建的 VM 所在的文件夹路径。使用 /<datacenter>/vm/<cluster_name>,以便 operator 在 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

参数占位符必填验证或备注示例实际值
控制平面池名称<cluster_name>-cp-pool是控制平面节点的 machine config pool 名称。在 Machine 替换期间保持使用相同的现有 pool 引用。不同的 pool 对象拥有各自独立的槽位和 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 池名称<cluster_name>-worker-pool是Worker 节点的 machine config pool 名称。在 Machine 替换期间保持使用相同的现有 pool 引用。不同的 pool 对象拥有各自独立的槽位和 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 池时使用。worker-02-
Worker 节点 2 数据中心<worker_02_datacenter>否扩展 Worker 池时使用。dc-b-
Worker 节点 2 IP 地址<worker_02_nic1_ip>否扩展 Worker 池时使用。10.10.10.22-
releaseDelayHours<release_delay_hours>是provider 回收未使用的 Released 槽位中的持久 VMDK 前的延迟时间。默认值为 24。引用同一现有池的替换 Machine 可以立即重用 Released 槽位;无需等待此延迟结束。24-

计算资源规格

参数占位符必填验证或备注示例实际值
控制平面 CPU<cp_num_cpus>是每个控制平面节点的 CPU 数量。4-
控制平面内存 MiB<cp_memory_mib>是每个控制平面节点的内存。8192-
控制平面系统数据存储<cp_system_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 系统数据存储<worker_system_datastore>是Worker 系统磁盘的数据存储。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[]持久数据磁盘绑定到节点槽位并重新连接到替换 VM 的额外 VMDK,例如 /var/cpaas。与系统磁盘分开。
VSphereMachineConfigPool.spec.configs[].ephemeralDisks[]临时数据磁盘随 VM 创建的空白额外 VMDK,并在 VM 删除时一并删除,例如 /var/lib/kubelet、/var/lib/containerd 和 /var/lib/etcd。与系统磁盘分开。

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

标准数据磁盘

每个节点角色都需要一组专用数据磁盘。以下列出的磁盘是最低要求的磁盘。如果工作负载需要,您可以向任一列表追加其他磁盘。已分配的槽位仍可接受两个列表中的新条目——这些条目会在下次重新创建 VM 时生效——但绝不接受移除或调整磁盘,因此请在第一个 Machine 使用该槽位之前规划好大小和挂载路径。

拆分方式遵循 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 声明为持久磁盘,并在 etcd 磁盘上设置 wipeFilesystem: true,同时保留该布局。升级 provider 不会迁移任何磁盘,而已处于 InUse 或 Released 状态的槽位会拒绝移除或调整任一列表中的磁盘,因此已声明的磁盘不能从一个列表移动到另一个列表。请参阅升级 Provider。

持久磁盘字段

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

临时磁盘字段

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

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

持久磁盘生命周期

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

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

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

重新部署和拆除容量

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

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

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

调查已释放的槽位或数据存储容量告警时,请使用以下字段:

状态字段含义
state槽位分配状态:Available、InUse 或 Released。
lastReleasedTime槽位进入 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

当槽位处于 Released 状态,或其 persistentDiskStatuses[].phase 为 Reclaiming 或 Error 时,不要手动删除 VMDK。替换 Machine 可能仍会重用该 VMDK,或者 provider 可能正在重试已验证的回收操作。在执行任何手动数据存储清理之前,请确认 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>/ait/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 Kubeadm Provider 和 Alauda Container Platform VMware vSphere Infrastructure Provider。
  3. 已启用 ClusterResourceSet=true。
  4. 已收集 vCenter 服务器、用户名、密码和 thumbprint。
  5. 外部 LoadBalancer 满足第 4 层监听器、后端、健康检查、所有权和可达性约定。如果集群改用 Self-built VIP,则已满足 Self-built VIP 前置条件,并已确定 <vrid> 和 <vip_interface>。
  6. Pod CIDR、Service CIDR 和 kube-ovn-join-cidr 不与现有网络重叠。
  7. VM template 在每个所需数据中心中均可用。
  8. 已确认所需的数据存储和 vCenter 资源池路径。
  9. 永久平台 Registry 包含所需的 Kube-OVN、CoreDNS 和 vSphere CPI 标签。
  10. VM template 包含所选 Kubernetes 和组件版本所需的、在本地预加载的 etcd 和 kube-apiserver 镜像的确切引用。
  11. cpaas.io/registry-address 值计划设置为不带 scheme 或 /v2/ 路径的 <registry_address>。
  12. 控制平面和 worker 引导清单均通过 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 上创建集群。