将 vSphere 集群添加到网域

本文档介绍了如何使用 Compute Engine 裸金属实例,将 vSphere 集群添加到 Google Cloud 上的 VMware 解决方案中的现有 VMware Cloud Foundation (VCF) 9.1 网域。当您需要将计算和 vSAN 存储容量扩展到单个集群之外、隔离工作负载或在现有网域中应用单独的 vSphere Lifecycle Manager (vLCM) 映像或 vSAN 存储政策时,请添加集群。您可以将集群添加到同一项目、虚拟私有云 (VPC) 网络和可用区中的以下任一网域:

  • 管理网域:添加由管理 vCenter Server 和 NSX Manager 管理的集群。
  • VI 工作负载网域:添加由工作负载网域 vCenter Server 及其 NSX Manager 实例管理的集群。

架构摘要

将 vSphere 集群添加到现有 VCF 网域时,部署会使用以下架构:

  • 裸金属 ESXi 主机:每个新 ESXi 主机都是一个 z3-highmem-192-highlssd-metal 裸金属实例,连接到 VPC 网络的现有第 2 层子网(ESXi 管理、vMotion、vSAN 和 NSX 隧道端点 [TEP])。每个主机都通过一个主要网络接口 (nic0) 和加 VLAN 标签的 Dynamic Network Interface 进行连接。
  • 无其他管理设备:由于您将集群添加到已管理目标网域的 vCenter Server 和 NSX Manager,因此无需部署新的管理设备。您也无需创建新的设备 Cloud DNS 记录、后端服务、高可用性 (HA) 政策或转发规则。而是将新主机添加到现有可用区级网络端点组 (NEG)。
  • IP 地址分配和对齐:VCF 从网络池中分配 vMotion 和 vSAN IP 地址,NSX 从 NSX IP 地址池中分配 TEP (vmk10) IP 地址。由于 VCF 9.1 中的两个池都不支持按主机静态分配,因此您在部署期间将 Compute Engine Dynamic NIC 与 VCF 分配的 IP 地址对齐,同时保持所有 VCF 验证处于启用状态。

准备工作

在创建集群之前,请验证以下部分中的要求并配置环境变量。

验证环境要求

验证您的环境是否满足以下要求:

  • 权限:您在目标项目中拥有所需的 Identity and Access Management (IAM) 角色,包括 Compute Admin (roles/compute.admin)、DNS Administrator (roles/dns.admin) 和 Secret Manager Secret Accessor (roles/secretmanager.secretAccessor)。
  • Secret Manager 中的凭据:如果您在初始部署后更改或轮替了 VCF 中的 ESXi root、SDDC Manager、vCenter Server 或 NSX Manager 密码,Secret Manager 不会自动更新。在运行本文档中的命令之前,请更新 Secret Manager 中的相应 Secret,或直接提供更新后的密码,使其与您的有效 VCF 凭据一致。
  • 网域运行状况:目标网域运行状况良好(vCenter Server、vSAN、NSX Manager、SDDC Manager 和 VCF Operations),并且没有失败的任务。
  • vSphere Lifecycle Manager (vLCM) 映像:VCF 映像库中提供了 vLCM 映像,或者您计划从主机中提取映像。请使用现有集群所用的相同映像,以便所有主机保持一致。
  • 存储设备:每个新主机都具有 NVMe 本地 SSD 设备,这些设备没有预先存在的分区,这是 vSAN 所必需的。
  • 节点数下限:集群至少需要三个裸金属节点,这是 vSAN 允许一个故障 (FTT=1) 所需的下限。
  • 机器类型:集群中的所有节点都使用相同的机器类型(对于 vSAN Express Storage Architecture (ESA),为 z3-highmem-192-highlssd-metal)。
  • 可用区:新集群与现有管理和 NSX TEP 可用区级 NEG 位于同一可用区。
  • Jumpbox 虚拟机:您可以访问安装了 gcloud CLI、curl 和 jq 且与 VPC 网络(例如,在 bm-gcp-demo 子网中)建立了网络连接的 Jumpbox 虚拟机。
  • 可信映像政策和 VPC Service Controls:如果您的组织强制执行 constraints/compute.trustedImageProjects 组织政策或使用 VPC Service Controls 服务边界,请确保您的项目允许映像访问 smve-prod-public-images 项目 (projects/999037279871)。如需了解详情,请参阅管理节点容量。
  • 基于 VLAN 的网络:VMware 解决方案要求 VPC 网络的子网将解析子网掩码属性设置为仅通过学习广播主要范围,以支持基于 VLAN 的网络。在 Google Cloud 控制台支持中心中提交支持服务工单,并提供以下信息:

    • 产品:Google Cloud VMware Engine
    • 优先级:P2
    • 类别:Network Connectivity
    • 业务影响:常规技术问题
    • 提供更多详细信息:Allowlist L2 network connectivity for my project,以及您的项目 ID、项目编号和部署的目标区域和可用区

    如需详细了解对基于 VLAN 的网络的支持,请参阅第 2 层模拟:ARP 广播和自定义 MAC 学习。

查看示例环境参数

本文档中的命令使用以下示例参数:

输入参数 示例值 说明
项目 ID PROJECT_ID 与目标网域 Google Cloud 相同的项目
区域和可用区 us-east4/us-east4-b 与现有可用区级 NEG 位于同一可用区
客户 ID demo 现有资源名称中使用的标识符
目标网域 mgmt-domain(或 wld01) 现有管理网域或 VI 工作负载网域
集群名称 cl02 新 vSphere 集群的名称
机器类型 z3-highmem-192-highlssd-metal 集群中所有节点的机器类型相同
节点数 3 vSAN FTT=1 的节点数下限
VPC 网络 bm-demo 现有 VPC 网络
子网 (VLAN ID) bm-mgmt-demo(未加标签)、bm-vmotion-demo (2)、bm-vsan-demo (3)、bm-nsx-demo (4) 现有第 2 层子网
区域 NEG bm-mgmt-demo,bm-nsx-tep-demo 现有管理和 NSX TEP NEG
ESXi 映像 系列 astra-vcf-9-1-x,项目 smve-prod-offline-depot 与现有集群相同的 ESXi 映像 build
DNS 域名和区域 vmware.gve / dns-zone-demo,rev-dns-zone-demo 现有的 Cloud DNS 正向和反向托管式区域
SDDC 管理器 sddcm.vmware.gve (192.168.0.3) 现有 SDDC Manager 设备
ESXi root 密码 esxi-root-password 包含 ESXi root 密码的现有 Secret Manager 密文

规划 IP 地址和主机名

下表显示了三个新 ESXi 主机的示例 IP 地址计划:

ESXi 主机 管理 IP (nic0) vMotion (VLAN 2) vSAN (VLAN 3) NSX TEP (VLAN 4)
esxi-h7 192.168.0.161 192.168.2.21 192.168.3.21 192.168.4.21
esxi-h8 192.168.0.162 192.168.2.22 192.168.3.22 192.168.4.22
esxi-h9 192.168.0.163 192.168.2.23 192.168.3.23 192.168.4.23

选择目标网域

您选择的目标网域决定了哪个 vCenter Server、NSX Manager 和叠加传输可用区管理新集群:

参数或资源 管理网域中的集群 VI 工作负载网域中的集群
TARGET_DOMAIN变量 mgmt-domain wld01
管理 vCenter Server vc01.vmware.gve vc02.vmware.gve
NSX_MANAGER变量 nsx01.vmware.gve(管理 NSX) nsx05.vmware.gve(专用 NSX)或 nsx01.vmware.gve(共享管理 NSX)
TRANSPORT_ZONE变量 overlay-tz-mgmt-nsxt 工作负载网域 NSX 实例的叠加传输区域

验证区域配额

在预配裸金属节点或创建集群之前,请验证您的项目是否有足够的区域和全球 Compute Engine 配额。在将该区域中所有现有集群的资源与项目配额进行比较之前,请先将这些资源添加到以下增量值中:

配额指标 每个裸金属节点所需的资源 3 节点集群所需的资源
Z3的compute.googleapis.com/cpus_per_vm_family 192 个 vCPU 3 × 192 = 576 个 vCPU
Z3的compute.googleapis.com/local_ssd_total_storage_per_vm_family 72 TB 3 × 72 TB = 216 TB
compute.googleapis.com/hyperdisk_balanced_total_storage 128 GB 3 × 128 GB = 384 GB
compute.googleapis.com/resource_policies 向现有集群添加节点时为 0 每个集群 1 项分散布置政策
compute.googleapis.com/regional_backend_services_protocol_forwarding_fast_ha 在不添加新设备的情况下添加节点或集群时,此值为 0 每个新的 VCF 管理设备 VIP 或 NSX Edge 端点 1 个

如需查看所需配额的完整列表以及有关如何查看或申请增加配额的说明,请参阅配额和限制。

设置环境变量

在 jumpbox shell 中设置以下环境变量,以便在本指南中的命令中使用:

export PROJECT_ID="PROJECT_ID"
export REGION="us-east4"
export ZONE="us-east4-b"
export CUSTOMER_ID="demo"
export VPC_NETWORK="bm-${CUSTOMER_ID}"
export DOMAIN="vmware.gve"
export DNS_ZONE="dns-zone-${CUSTOMER_ID}"
export REV_DNS_ZONE="rev-dns-zone-${CUSTOMER_ID}"
export MGMT_SUBNET="bm-mgmt-${CUSTOMER_ID}"
export VMOTION_SUBNET="bm-vmotion-${CUSTOMER_ID}"
export VSAN_SUBNET="bm-vsan-${CUSTOMER_ID}"
export TEP_SUBNET="bm-nsx-${CUSTOMER_ID}"
export MGMT_NEG="bm-mgmt-${CUSTOMER_ID}"
export TEP_NEG="bm-nsx-tep-${CUSTOMER_ID}"
export CLUSTER_NAME="cl02"
export PLACEMENT_POLICY="bm-${CLUSTER_NAME}"
export NETWORK_POOL_NAME="${CLUSTER_NAME}-np01"
export TEP_POOL_NAME="${CLUSTER_NAME}-tep-pool"
export VDS_NAME="${CLUSTER_NAME}-vds-01"
export MACHINE_TYPE="z3-highmem-192-highlssd-metal"
export ESXI_IMAGE_FAMILY="astra-vcf-9-1-x"
export ESXI_IMAGE_PROJECT="smve-prod-offline-depot"
export SDDC_MANAGER="sddcm.vmware.gve"            # 192.168.0.3
export VCF_USER="admin@local"
export VCF_PASSWORD="VCF_ADMIN_PASSWORD"
export ESXI_PASSWORD_SECRET="esxi-root-password"  # Secret Manager secret holding the ESXi root password
export MTU=8896                                   # VPC MTU

# Target domain parameters
export TARGET_DOMAIN="mgmt-domain"                # Or wld01
export NSX_MANAGER="nsx01.vmware.gve"             # Or nsx05.vmware.gve for wld01 with a dedicated NSX instance
export TRANSPORT_ZONE="overlay-tz-mgmt-nsxt"      # Overlay transport zone of the target NSX instance

# Ordered host list: name mgmt_ip vmotion_ip vsan_ip tep_ip
CLUSTER_HOSTS=(
  "esxi-h7 192.168.0.161 192.168.2.21 192.168.3.21 192.168.4.21"
  "esxi-h8 192.168.0.162 192.168.2.22 192.168.3.22 192.168.4.22"
  "esxi-h9 192.168.0.163 192.168.2.23 192.168.3.23 192.168.4.23"
)

# TEP pool range matching the new hosts' Compute Engine TEP NIC IPs
export TEP_CIDR="192.168.4.0/24"
export TEP_GATEWAY="192.168.4.1"
export TEP_START="192.168.4.21"
export TEP_END="192.168.4.23"

在运行这些命令之前,请替换以下内容:

  • PROJECT_ID:目标 Google Cloud项目的 ID。
  • VCF_ADMIN_PASSWORD:您的 SDDC Manager 管理员密码。

确认您计划使用的 IP 地址均未被现有转发规则或实例使用:

gcloud compute forwarding-rules list --project="${PROJECT_ID}" --regions="${REGION}" \
    --format="table(name,IPAddress,subnetwork.basename())"
gcloud compute instances list --project="${PROJECT_ID}" --zones="${ZONE}" \
    --format="table(name,networkInterfaces[].networkIP.list())"

创建 DNS 记录

部署管理网域时,您创建了第 2 层子网、Cloud DNS 入站转发政策以及正向和反向托管区域。由于添加集群不会部署新设备,因此您只需为新 ESXi 主机创建正向 (A) 和反向 (PTR) 记录:

add_dns() {
  local name=$1 ip=$2
  gcloud dns record-sets create "${name}.${DOMAIN}." \
      --rrdatas="${ip}" --type=A --ttl=300 \
      --zone="${DNS_ZONE}" --project="${PROJECT_ID}"
  local rev
  rev=$(echo "${ip}" | awk -F. '{print $4"."$3"."$2"."$1".in-addr.arpa."}')
  gcloud dns record-sets create "${rev}" \
      --rrdatas="${name}.${DOMAIN}." --type=PTR --ttl=300 \
      --zone="${REV_DNS_ZONE}" --project="${PROJECT_ID}"
}

for entry in "${CLUSTER_HOSTS[@]}"; do
  read -r HOST MGMT_IP _ <<< "${entry}"
  add_dns "${HOST}" "${MGMT_IP}"
done

# Verify DNS records
gcloud dns record-sets list --zone="${DNS_ZONE}" --project="${PROJECT_ID}" \
    --filter="name~'esxi-h[7-9]'"

创建裸金属实例

为新集群创建专用布置政策。然后,您需要为每个裸金属 ESXi 主机创建一个主要管理接口 (nic0) 以及用于 vMotion(VLAN 2)、vSAN(VLAN 3)和 NSX TEP(VLAN 4)的加 VLAN 标签的 Dynamic NIC。

创建布置政策

创建组布置政策:

gcloud compute resource-policies create group-placement "${PLACEMENT_POLICY}" \
    --region="${REGION}" \
    --availability-domain-count=6 \
    --collocation=COLLOCATED \
    --project="${PROJECT_ID}"

创建启动磁盘和裸金属 ESXi 实例

为集群中的每个主机创建 Google Cloud Hyperdisk Balanced 启动磁盘和裸金属 ESXi 实例:

i=0
for entry in "${CLUSTER_HOSTS[@]}"; do
  read -r HOST MGMT_IP VMOTION_IP VSAN_IP TEP_IP <<< "${entry}"
  AD=$(( (i % 6) + 1 )); i=$((i + 1))

  # Create boot disk
  gcloud compute disks create "${HOST}" \
      --image-project="${ESXI_IMAGE_PROJECT}" \
      --image-family="${ESXI_IMAGE_FAMILY}" \
      --type=hyperdisk-balanced --interface=NVME --size=128GB \
      --guest-os-features=IDPF \
      --zone="${ZONE}" --project="${PROJECT_ID}"

  # Create bare-metal ESXi host
  gcloud compute instances create "${HOST}" \
      --zone="${ZONE}" \
      --machine-type="${MACHINE_TYPE}" \
      --can-ip-forward \
      --resource-policies="${PLACEMENT_POLICY}" \
      --availability-domain="${AD}" \
      --hostname="${HOST}.${DOMAIN}" \
      --disk="name=${HOST},boot=yes,auto-delete=yes" \
      --labels=gcve-node=true \
      --tags=mm-gcve-node \
      --deletion-protection \
      --maintenance-policy=TERMINATE \
      --restart-on-failure \
      --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
      --project="${PROJECT_ID}" \
      --network-interface="network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=${MGMT_SUBNET},no-address,private-network-ip=${MGMT_IP}" \
      --network-interface="network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=${VMOTION_SUBNET},no-address,private-network-ip=${VMOTION_IP},vlan=2" \
      --network-interface="network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=${VSAN_SUBNET},no-address,private-network-ip=${VSAN_IP},vlan=3" \
      --network-interface="network-tier=PREMIUM,stack-type=IPV4_ONLY,subnet=${TEP_SUBNET},no-address,private-network-ip=${TEP_IP},vlan=4"
done

# Verify instance creation and network interfaces
gcloud compute instances list --project="${PROJECT_ID}" --zones="${ZONE}" \
    --filter="name~'esxi-h[7-9]'" \
    --format="table(name,status,networkInterfaces[].vlan.list(),networkInterfaces[].networkIP.list())"

更新 NEG 成员资格

可用区中的所有节点都必须属于子网的同一可用区级 NEG,以便 VCF 网络设备可以在集群节点之间路由流量。将新主机添加到现有管理 NEG 和 NSX TEP NEG:

# List the NEGs in the zone (management and NSX TEP)
gcloud compute network-endpoint-groups list --zones="${ZONE}" --project="${PROJECT_ID}" \
    --format="table(name,subnetwork.basename(),networkEndpointType,size)"

ALL_NEGS=("${MGMT_NEG}" "${TEP_NEG}")
for entry in "${CLUSTER_HOSTS[@]}"; do
  read -r HOST _ <<< "${entry}"
  for NEG in "${ALL_NEGS[@]}"; do
    gcloud compute network-endpoint-groups update "${NEG}" \
        --zone="${ZONE}" \
        --add-endpoint="instance=${HOST}" \
        --project="${PROJECT_ID}"
  done
done

# Verify NEG endpoints
for NEG in "${ALL_NEGS[@]}"; do
  gcloud compute network-endpoint-groups list-network-endpoints "${NEG}" \
      --zone="${ZONE}" --project="${PROJECT_ID}" \
      --format="table(networkEndpoint.instance,networkEndpoint.ipAddress)"
done

重置 ESXi root 密码

为了安全和主机调试,请将每个新主机的 root 密码重置为存储在 Secret Manager 中的 ESXi root 密码。在后续步骤中,您将使用同一 Secret 来调试主机。确保密码符合 VCF 复杂性要求(至少 15 个字符,包括大写字母、小写字母、数字和特殊字符)。如果您在初始部署后更改或轮替了 ESXi root 或 VCF 密码,请在运行这些命令之前更新 Secret Manager 中的相应 Secret。

如需在每个新主机上重置 root 密码,请从 jumpbox 虚拟机运行以下命令,并在系统提示时输入初始 ESXi root 密码:

# 1. Read the ESXi root password from Secret Manager
ESXI_ROOT_PASSWORD=$(gcloud secrets versions access latest \
    --secret="${ESXI_PASSWORD_SECRET}" --project="${PROJECT_ID}")

# 2. Reset the root password on each new host
for entry in "${CLUSTER_HOSTS[@]}"; do
  read -r HOST _ <<< "${entry}"
  ssh -o StrictHostKeyChecking=no "root@${HOST}.${DOMAIN}" \
      "esxcli system account set -i root -p '${ESXI_ROOT_PASSWORD}' -c '${ESXI_ROOT_PASSWORD}'"
done

# 3. Optional: Verify that the FQDN is set and vmk0 is configured as STATIC
ssh "root@esxi-h7.${DOMAIN}" \
    'esxcli system hostname get; esxcli network ip interface ipv4 get -i vmk0'

创建专用网络池

VCF 会从您在调试主机时选择的网络池中分配 vMotion 和 vSAN IP 地址。由于现有集群的网络池仅包含其自己的主机 IP 地址,因此请创建一个专用网络池,其 IP 范围包含您预先分配给新主机的 Compute Engine Dynamic NIC 的确切 vMotion 和 vSAN IP 地址。使用专用网络池可将 VCF IP 分配保持在预先分配的 Compute Engine IP 地址集内,因此,如果以后发生不匹配,您只需调整主机到 IP 的顺序。

您可以使用 VCF Operations 或 SDDC Manager API 创建网络池:

VCF Operations

在 VCF Operations 中,前往网络池管理,点击创建网络池,然后使用 vMotion(VLAN 2、192.168.2.21–192.168.2.23)和 vSAN(VLAN 3、192.168.3.21–192.168.3.23)网络设置以及 8896 字节的 MTU 创建 cl02-np01 网络池。

SDDC Manager API

运行以下命令,创建网络池并检索其 ID:

TOKEN=$(curl -s -X POST "https://${SDDC_MANAGER}/v1/tokens" \
    -H "Content-Type: application/json" \
    -d "{\"username\":\"${VCF_USER}\",\"password\":\"${VCF_PASSWORD}\"}" | jq -r '.accessToken')

curl -s -X POST "https://${SDDC_MANAGER}/v1/network-pools" \
    -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" \
    -d "{
      \"name\": \"${NETWORK_POOL_NAME}\",
      \"networks\": [
        { \"type\": \"VMOTION\", \"vlanId\": 2, \"mtu\": ${MTU},
          \"subnet\": \"192.168.2.0\", \"mask\": \"255.255.255.0\", \"gateway\": \"192.168.2.1\",
          \"ipPools\": [ { \"start\": \"192.168.2.21\", \"end\": \"192.168.2.23\" } ] },
        { \"type\": \"VSAN\", \"vlanId\": 3, \"mtu\": ${MTU},
          \"subnet\": \"192.168.3.0\", \"mask\": \"255.255.255.0\", \"gateway\": \"192.168.3.1\",
          \"ipPools\": [ { \"start\": \"192.168.3.21\", \"end\": \"192.168.3.23\" } ] }
      ]
    }"

# Retrieve the network pool ID for host commissioning
POOL_ID=$(curl -s "https://${SDDC_MANAGER}/v1/network-pools" -H "Authorization: Bearer ${TOKEN}" \
    | jq -r --arg n "${NETWORK_POOL_NAME}" '.elements[] | select(.name==$n) | .id')
echo "${POOL_ID}"

调试主机

使用 VCF Operations 或 SDDC Manager API 将新的 ESXi 主机添加到 SDDC Manager 清单中:

VCF Operations

  1. 在 VCF Operations 中,依次前往资产清单 > 主机 > 委托主机。
  2. 选择 cl02-np01 网络池,然后选择 vSAN ESA 存储类型。
  3. 输入主机 FQDN(esxi-h7.vmware.gve、esxi-h8.vmware.gve 和 esxi-h9.vmware.gve)以及 root 凭据。
  4. 接受 SSL 指纹,验证主机,然后点击调试。

SDDC Manager API

运行以下命令以验证和调试主机,然后轮询任务 ID,直到其返回 Successful:

ESXI_PASSWORD=$(gcloud secrets versions access latest \
    --secret="${ESXI_PASSWORD_SECRET}" --project="${PROJECT_ID}")

HOST_FQDNS=$(for entry in "${CLUSTER_HOSTS[@]}"; do
  read -r HOST _ <<< "${entry}"; echo "${HOST}.${DOMAIN}"
done | jq -R . | jq -s .)

HOSTS_JSON=$(jq -n --argjson f "${HOST_FQDNS}" --arg p "${ESXI_PASSWORD}" \
    --arg np "${POOL_ID}" --arg npn "${NETWORK_POOL_NAME}" \
    '$f | map({fqdn: ., username: "root", password: $p, storageType: "VSAN_ESA",
               networkPoolId: $np, networkPoolName: $npn})')

# 1. Validate hosts
curl -s -X POST "https://${SDDC_MANAGER}/v1/hosts/validations" \
    -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" -d "${HOSTS_JSON}"

# 2. Commission hosts
TASK_ID=$(curl -s -X POST "https://${SDDC_MANAGER}/v1/hosts" \
    -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" \
    -d "${HOSTS_JSON}" | jq -r '.id')

# 3. Poll task status until Successful
curl -s "https://${SDDC_MANAGER}/v1/tasks/${TASK_ID}" -H "Authorization: Bearer ${TOKEN}" | jq -r '.status'

如果主机 SSL 指纹显示内部(非 FQDN)证书名称,则表示主机上未配置 DNS 搜索网域。在受影响的 ESXi 主机上,运行 esxcli network ip dns search add -d vmware.gve 命令,重新运行 /var/lib/vmware/osdata/init.sh 脚本,然后运行 /sbin/generate-certificates 命令并重启 rhttpproxy 和 hostd 服务 (/etc/init.d/rhttpproxy restart && /etc/init.d/hostd restart)。

检查部署前 IP 调整情况

在 SDDC Manager 中,让所有 vSAN、vMotion 和网络连接验证保持启用状态。只有当 VCF 分配给每个主机的 vmk1 (vMotion) 和 vmk2 (vSAN) IP 地址与该主机的 Compute Engine Dynamic NIC IP 地址匹配时,这些验证检查才会通过。如果由于 SDDC Manager 以不同的主机顺序分配池 IP 地址而导致不匹配,则集群创建任务会在连接检查时暂停。然后,您需要在后续步骤中对齐 Dynamic NIC,然后再重试该任务。

  1. 验证网络池范围是否与 Compute Engine vMotion 和 vSAN NIC IP 地址匹配:确认网络池仅包含您预先分配给新主机的 Dynamic NIC 的 IP 地址(在本示例中为 192.168.2.21–192.168.2.23 和 192.168.3.21–192.168.3.23):

    # Inspect network pool definition
    curl -s "https://${SDDC_MANAGER}/v1/network-pools/${POOL_ID}" \
        -H "Authorization: Bearer ${TOKEN}" | jq '.networks[] | {type, vlanId, mtu, ipPools}'
    
    # Inspect Compute Engine dynamic NIC IPs per new host (VLAN 2 = vMotion, 3 = vSAN, 4 = TEP)
    for entry in "${CLUSTER_HOSTS[@]}"; do
      read -r HOST _ <<< "${entry}"
      echo "== ${HOST}"
      gcloud compute instances describe "${HOST}" --zone="${ZONE}" --project="${PROJECT_ID}" \
          --format="table(networkInterfaces[].name,networkInterfaces[].vlan,networkInterfaces[].networkIP)"
    done
    
  2. 按主机名升序分配 IP 地址:按主机名升序(esxi-h7 → .21、esxi-h8 → .22、esxi-h9 → .23)预先分配 Compute Engine IP 地址,以便两侧的 IP 地址集相同。

  3. 确认 SDDC Manager 不会绕过验证:在 SDDC Manager 设备上(以 root 身份),验证 application.properties 文件不包含任何 validation.disable.* 属性:

    # Must return no output. If any validation.disable.* line is present, remove it
    # and run: systemctl restart domainmanager
    grep -n 'validation.disable' /etc/vmware/vcf/domainmanager/application.properties
    

    如果您使用 SDDC Manager API 添加集群,请勿在请求正文中设置 "skipValidations": true 属性。

  4. 调整 NSX TEP 池的大小,使其与 Compute Engine TEP NIC IP 地址匹配:为集群配置一个新的静态 NSX TEP IP 地址池,范围为 192.168.4.21–192.168.4.23(从 TEP_START 变量到 TEP_END 变量),与新主机的 VLAN 4 Dynamic NIC 上的 IP 地址匹配,并将网关设置为 192.168.4.1。

添加集群

您可以使用 VCF Operations 或 SDDC Manager API 将集群添加到目标网域:

VCF Operations

登录 VCF Operations,前往清单,展开 VCF 实例,选择目标网域(mgmt-domain 或 wld01),然后点击添加集群(或在 SDDC Manager 界面中,前往工作负载网域 > 目标网域 > 操作 > 添加集群)。使用以下设置完成向导:

向导页面 字段 值
存储 类型 vSAN、启用 vSAN ESA、vSAN HCI、传输中数据加密关闭
集群 集群名称 cl02
映像 vLCM 映像 选择现有集群使用的映像,或选择从此 VCF 实例中的主机中提取映像(使用 esxi-h7)
主机 主机 esxi-h7、esxi-h8、esxi-h9(已作为 vSAN ESA 调试,使用 cl02-np01 网络池)
vSphere Distributed Switch 个人资料 默认(单个 VDS)或自定义:1 个上行链路(uplink1 → vmnic0)、MTU 8896、流量类型 ESX 管理、虚拟机管理、vMotion、vSAN 和 NSX
NSX 切换模式 虚拟交换机运行模式 清除应用在 NSX Manager 中配置的默认虚拟交换机模式,并将操作模式设置为标准。VMware 解决方案主机不支持默认模式(增强型数据路径标准)。
NSX 主机叠加层 TEP VLAN 和 IP 分配 VLAN 4(与现有 NSX 配置匹配)、静态 IP 池(不使用 DHCP):新池 cl02-tep-pool、CIDR 192.168.4.0/24、范围 192.168.4.21–192.168.4.23、网关 192.168.4.1
查看 提交 点击完成。前往车队管理 > 任务,监控任务并记录任务 ID (TASK_ID)。

SDDC Manager API

检索目标网域 ID、vLCM 映像个性 ID 和已调试的主机 ID,然后验证并提交用于创建集群的规范:

# 1. Retrieve target domain ID, vLCM image personality ID, and host specs
DOMAIN_ID=$(curl -s "https://${SDDC_MANAGER}/v1/domains" -H "Authorization: Bearer ${TOKEN}" \
    | jq -r --arg d "${TARGET_DOMAIN}" '.elements[] | select(.name==$d) | .id')

curl -s "https://${SDDC_MANAGER}/v1/personalities" -H "Authorization: Bearer ${TOKEN}" \
    | jq -r '.elements[] | [.personalityId, .personalityName] | @tsv'
IMAGE_ID="PERSONALITY_ID"   # Select the personalityId of the existing clusters' image

HOST_SPECS=$(curl -s "https://${SDDC_MANAGER}/v1/hosts" -H "Authorization: Bearer ${TOKEN}" \
    | jq --argjson f "${HOST_FQDNS}" --arg vds "${VDS_NAME}" '
        [.elements[] | select(.fqdn as $x | $f | index($x))
         | {id, hostNetworkSpec: {vmNics: [{id: "vmnic0", uplink: "uplink1", vdsName: $vds}]}}]')
echo "${HOST_SPECS}" | jq 'length'   # Must equal 3

# 2. Construct the cluster specification (without skipValidations)
CLUSTER_SPEC=$(jq -n \
    --arg domain "${DOMAIN_ID}" --arg name "${CLUSTER_NAME}" --arg img "${IMAGE_ID}" \
    --argjson hosts "${HOST_SPECS}" --arg vds "${VDS_NAME}" --argjson mtu "${MTU}" \
    --arg tz "${TRANSPORT_ZONE}" --arg pool "${TEP_POOL_NAME}" \
    --arg cidr "${TEP_CIDR}" --arg gw "${TEP_GATEWAY}" --arg s "${TEP_START}" --arg e "${TEP_END}" '
{
  domainId: $domain,
  computeSpec: { clusterSpecs: [{
    name: $name,
    clusterImageId: $img,
    hostSpecs: $hosts,
    datastoreSpec: { vsanDatastoreSpec: { datastoreName: ($name + "-vsan"), esaConfig: { enabled: true } } },
    networkSpec: {
      vdsSpecs: [{
        name: $vds, mtu: $mtu,
        portGroupSpecs: [
          { name: ($vds + "-pg-mgmt"),    transportType: "MANAGEMENT", activeUplinks: ["uplink1"], teamingPolicy: "loadbalance_loadbased" },
          { name: ($vds + "-pg-vmotion"), transportType: "VMOTION",    activeUplinks: ["uplink1"], teamingPolicy: "loadbalance_loadbased" },
          { name: ($vds + "-pg-vsan"),    transportType: "VSAN",       activeUplinks: ["uplink1"], teamingPolicy: "loadbalance_loadbased" }
        ],
        nsxtSwitchConfig: {
          transportZones: [ { name: $tz, transportType: "OVERLAY" } ],
          hostSwitchOperationalMode: "STANDARD"
        }
      }],
      nsxClusterSpec: { nsxTClusterSpec: {
        uplinkProfiles: [{ name: ($name + "-uplink-profile"),
          teamings: [ { policy: "LOADBALANCE_SRCID", activeUplinks: ["uplink-1"] } ],
          transportVlan: 4 }],
        ipAddressPoolsSpec: [{ name: $pool,
          subnets: [{ cidr: $cidr, gateway: $gw, ipAddressPoolRanges: [ { start: $s, end: $e } ] }] }]
      }},
      networkProfiles: [{
        name: ($name + "-network-profile"), isDefault: true,
        nsxtHostSwitchConfigs: [{
          vdsName: $vds, uplinkProfileName: ($name + "-uplink-profile"), ipAddressPoolName: $pool,
          vdsUplinkToNsxUplink: [ { vdsUplinkName: "uplink1", nsxUplinkName: "uplink-1" } ]
        }]
      }]
    }
  }]}
}')

# 3. Validate the cluster specification
curl -s -X POST "https://${SDDC_MANAGER}/v1/clusters/validations" \
    -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" \
    -d "${CLUSTER_SPEC}" | jq '{executionStatus, resultStatus}'

# 4. Create the cluster and poll the task
TASK_ID=$(curl -s -X POST "https://${SDDC_MANAGER}/v1/clusters" \
    -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" \
    -d "${CLUSTER_SPEC}" | jq -r '.id')
curl -s "https://${SDDC_MANAGER}/v1/tasks/${TASK_ID}" -H "Authorization: Bearer ${TOKEN}" | jq -r '.status'

在运行命令之前,请将 PERSONALITY_ID 替换为集群 vLCM 映像的 personalityId 值。

如果 VCF 为主机分配的 vMotion 或 vSAN IP 地址与其 Compute Engine 动态 NIC 不同,则任务会在 vSAN 和 vMotion 连接的验证步骤停止。让任务保持失败状态,完成对齐 vMotion 和 vSAN Dynamic NIC中的步骤,然后重试该任务。请勿取消任务或停用验证检查。

对齐 vMotion 和 vSAN Dynamic NIC

如果集群创建任务在 vSAN 和 vMotion 连接的验证步骤中停止,请应用本部分中的步骤。如果任务通过了该步骤,请仅运行第 1 步和第 2 步以确认 IP 对齐,然后继续执行对齐 NSX TEP Dynamic NIC。

  1. 读取 VCF 分配的 IP 地址:查询 SDDC Manager /v1/hosts 端点(或 SDDC Manager platform 数据库),以查看 VCF 为每个主机分配了哪些 vMotion (vmk1) 和 vSAN (vmk2) IP 地址:

    curl -s "https://${SDDC_MANAGER}/v1/hosts" -H "Authorization: Bearer ${TOKEN}" | jq -r '
      ["FQDN","STATUS","CLUSTER","MGMT_IP","VMOTION_IP","VSAN_IP"],
      (.elements | sort_by(.fqdn)[] | [
         .fqdn, (.status // "-"), (.cluster.name // .cluster.id // "-"),
         (([.ipAddresses[]? | select(.type=="MANAGEMENT") | .ipAddress] | first) // "-"),
         (([.ipAddresses[]? | select(.type=="VMOTION")    | .ipAddress] | first) // "-"),
         (([.ipAddresses[]? | select(.type=="VSAN")       | .ipAddress] | first) // "-")
      ]) | @tsv' | column -t
    
    # Alternative (run on the SDDC Manager appliance shell):
    # psql -h localhost -U postgres -d platform \
    #   -c "select hostname, vmotion_ip_address, vsan_ip_address from host;"
    
  2. 与 Compute Engine Dynamic NIC 进行比较:列出每个新主机上的当前 Dynamic NIC IP 地址:

    for entry in "${CLUSTER_HOSTS[@]}"; do
      read -r HOST _ <<< "${entry}"
      echo "== ${HOST}"
      gcloud compute instances describe "${HOST}" --zone="${ZONE}" --project="${PROJECT_ID}" \
          --format="table(networkInterfaces[].name,networkInterfaces[].vlan,networkInterfaces[].networkIP)"
    done
    
  3. 先删除所有不匹配的 Dynamic NIC,然后再重新添加:在重新添加任何接口之前,请先删除所有不匹配主机上的每个不匹配 Dynamic NIC(用于 vMotion 的 nic0.2 接口和用于 vSAN 的 nic0.3 接口);否则,两个主机之间交换的 IP 地址会失败,并显示 IP_IN_USE 错误:

    # Example: VCF assigned esxi-h7 vMotion 192.168.2.22 and vSAN 192.168.3.22
    HOST="esxi-h7"
    VCF_VMOTION_IP="192.168.2.22"
    VCF_VSAN_IP="192.168.3.22"
    
    # 3a. Delete mismatched NICs (run on all mismatched hosts before running 3b)
    gcloud compute instances network-interfaces delete "${HOST}" \
        --network-interface=nic0.2 \
        --zone="${ZONE}" --project="${PROJECT_ID}" --quiet
    gcloud compute instances network-interfaces delete "${HOST}" \
        --network-interface=nic0.3 \
        --zone="${ZONE}" --project="${PROJECT_ID}" --quiet
    
    # 3b. Re-add the dynamic NICs with the VCF-allocated IP addresses
    # vMotion (VLAN 2)
    gcloud compute instances network-interfaces add "${HOST}" \
        --parent-nic-name=nic0 --vlan=2 \
        --network="${VPC_NETWORK}" --subnetwork="${VMOTION_SUBNET}" \
        --private-network-ip="${VCF_VMOTION_IP}" --no-address \
        --zone="${ZONE}" --project="${PROJECT_ID}"
    
    # vSAN (VLAN 3)
    gcloud compute instances network-interfaces add "${HOST}" \
        --parent-nic-name=nic0 --vlan=3 \
        --network="${VPC_NETWORK}" --subnetwork="${VSAN_SUBNET}" \
        --private-network-ip="${VCF_VSAN_IP}" --no-address \
        --zone="${ZONE}" --project="${PROJECT_ID}"
    
  4. 重试失败的集群任务:在 VCF Operations 中,前往舰队管理 > 任务以重试任务,或运行以下 SDDC Manager API 命令:

    curl -s -X PATCH "https://${SDDC_MANAGER}/v1/tasks/${TASK_ID}" \
        -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" \
        -d '{"status": "RETRY"}'
    

    重试的任务会再次运行 vSAN 和 vMotion 的连接性检查,并在所有 Compute Engine Dynamic NIC 与 VCF 分配的 IP 地址匹配后成功完成。

对齐 NSX TEP Dynamic NIC

在 NSX 将主机配置为传输节点后,验证并调整新主机上的 VLAN 4 NSX TEP (vmk10) Dynamic NIC。

  1. 检索 NSX 分配的 TEP IP 地址:查询目标网域 (NSX_MANAGER) 的 NSX Manager,或在每个 ESXi 主机上运行 esxcli network ip interface ipv4 get -i vmk10 命令:

    NSX_PW="NSX_ADMIN_PASSWORD"
    
    # Map transport node ID to hostname
    curl -s -u "admin:${NSX_PW}" "https://${NSX_MANAGER}/api/v1/transport-nodes" \
        | jq -r '.results[] | [.id, .display_name] | @tsv'
    
    # Map transport node ID to TEP device and IP address
    curl -s -u "admin:${NSX_PW}" "https://${NSX_MANAGER}/api/v1/transport-nodes/state" \
        | jq -r '.results[] | [.transport_node_id, .state,
            ([.host_switch_states[]?.endpoints[]? | .device_name + "=" + .ip] | join(","))] | @tsv'
    

    在运行这些命令之前,请将 NSX_ADMIN_PASSWORD 替换为 NSX Manager admin 密码(可从 SDDC Manager /v1/credentials 端点或 VCF Operations 密码管理中获取)。

  2. 与 Compute Engine TEP NIC (VLAN 4) 进行比较:将 NSX 分配的 vmk10 IP 地址与新主机(esxi-h7、esxi-h8 和 esxi-h9)上的 VLAN 4 Dynamic NIC IP 地址进行比较。只有新主机在范围内;请勿修改其他集群中主机的 TEP NIC。

  3. 重新创建不匹配的 TEP NIC:对于所有不匹配的新主机,首先将每个主机与 TEP NEG 分离,然后删除所有不匹配主机上的 nic0.4 接口。然后,您重新添加 nic0.4 接口,并将主机重新挂接到 TEP NEG:

    # Example: Compute Engine has 192.168.4.21 on esxi-h7, but NSX assigned 192.168.4.23
    HOST="esxi-h7"
    CURRENT_TEP_IP="192.168.4.21"
    NSX_TEP_IP="192.168.4.23"
    
    # 3a. Detach the host from the TEP NEG
    gcloud compute network-endpoint-groups update "${TEP_NEG}" \
        --zone="${ZONE}" --project="${PROJECT_ID}" \
        --remove-endpoint="instance=${HOST},ip=${CURRENT_TEP_IP}"
    
    # 3b. Delete the mismatched TEP NIC (nic0.4) on all mismatched hosts first
    gcloud compute instances network-interfaces delete "${HOST}" \
        --network-interface=nic0.4 \
        --zone="${ZONE}" --project="${PROJECT_ID}" --quiet
    
    # 3c. Re-add nic0.4 with the NSX-allocated IP address
    gcloud compute instances network-interfaces add "${HOST}" \
        --parent-nic-name=nic0 --vlan=4 \
        --network="${VPC_NETWORK}" --subnetwork="${TEP_SUBNET}" \
        --private-network-ip="${NSX_TEP_IP}" --no-address \
        --zone="${ZONE}" --project="${PROJECT_ID}"
    
    # 3d. Re-attach the host to the TEP NEG
    gcloud compute network-endpoint-groups update "${TEP_NEG}" \
        --zone="${ZONE}" --project="${PROJECT_ID}" \
        --add-endpoint="instance=${HOST}"
    

验证集群部署

集群创建任务完成并且您对齐所有 Dynamic NIC 后,请验证以下内容:

  • vCenter Server(vc01 或 vc02):cl02 集群和所有三个主机均已连接且运行状况良好,没有网络警报。
  • vSAN:对于 cl02 集群,请依次前往监控 > vSAN > Skyline Health,确认所有健康检查均已通过,并且 vSAN 数据存储区显示所有三个主机的总容量。
  • NSX Manager:依次前往系统 > Fabric > 主机,确认每个新主机都显示成功和启动,并且所有叠加隧道都已启动。
  • VCF 操作:目标网域中的集群状态为活跃,且任务列表未显示任何失败的任务。
  • 现有集群:网域中的所有其他集群保持正常运行。
  • 可选:使用 vMotion 在现有集群和 cl02 集群之间以及 cl02 集群中的主机之间迁移测试虚拟机。

在 ESXi 主机 shell(例如 esxi-h7)中,验证 vMotion、vSAN 和 NSX TEP 接口上的巨型帧连接(8896 MTU 减去 28 字节 IP/ICMP 标头 = 8868 字节):

esxcli network ip interface ipv4 get                        # Verify vmk0, vmk1, vmk2, and vmk10 IPs
vmkping -S vmotion -I vmk1 -d -s 8868 192.168.2.22          # vMotion
vmkping -I vmk2 -d -s 8868 192.168.3.22                     # vSAN
vmkping ++netstack=vxlan -I vmk10 -d -s 8868 192.168.4.22   # NSX TEP

可选:配置 vSAN 允许的故障数

对于 vSAN ESA,VCF 会根据集群类型和主机数量创建并分配默认数据存储区存储政策。如需明确配置 FTT 设置,请选择集群主机数量支持的政策:

可容忍的故障数 数据放置方案 主机数量下限
FTT=1 RAID-1(镜像)或 RAID-5(纠删码) 3(建议使用 4 个或更多,以便在主机故障后或维护期间进行重建)
FTT=2 RAID-1(镜像) 5
FTT=2 RAID-6(纠删码) 6

如需在目标网域的 vCenter Server(vc01 或 vc02)的 vSphere 客户端中设置默认存储政策,请执行以下操作:

  1. 为 vSAN ESA 集群停用自动政策管理,以便 vSAN 不会覆盖您的自定义默认政策。
  2. 前往政策和配置文件 > 虚拟机存储政策 > 创建,启用 vSAN 存储规则,然后在可用性部分中,选择允许的故障数(例如,对于 3 到 4 个主机,选择 1 个故障 - RAID-1(镜像);对于 6 个或更多主机,选择 2 个故障 - RAID-6(纠删码))。
  3. 将新政策设置为数据存储区默认政策:选择 cl02 vSAN 数据存储区,依次前往配置 > 常规 > 默认存储政策 > 修改,然后选择新政策。
  4. 将政策应用于现有虚拟机(虚拟机政策 > 修改虚拟机存储政策)。前往 cl02 集群的监控 > vSAN > 虚拟对象,以验证合规性。

排查集群创建问题

下表列出了将 vSphere 集群添加到网域时的常见问题、原因和解决方法:

问题 原因 解决方法
vSAN 和 vMotion 连接验证失败;新主机报告运行状况不佳 当您创建或扩展集群时,SDDC Manager 会从网络池中分配 vmk1 和 vmk2 IP 地址,而不会保留主机顺序。 请保持启用验证功能。创建一个与 Compute Engine NIC IP 地址匹配的专用网络池,验证预部署对齐情况,如果任务在连接性检查时暂停,请对齐 Dynamic NIC 并重试任务。
添加集群后,NSX 主机状态为 Degraded 或隧道已关闭 NSX Manager 会从 IP 池中随机分配 TEP (vmk10) IP 地址,因此这些地址可能与 Compute Engine TEP NIC 不匹配;Dynamic NIC 子网不支持 DHCP。 使用与 Compute Engine TEP IP 地址匹配的专用 TEP IP 地址池,并在 NSX 主机准备工作完成后调整 TEP Dynamic NIC。
BFD 处于启动状态时,NSX_VDL2 代理或主机报告 Degraded NSX TEP IP 池中缺少网关 IP 地址。 在 TEP IP 池中配置子网网关 (192.168.4.1)。
重新添加 Dynamic NIC 时出现 IP_IN_USE 错误 两个主机交换了 IP 地址,或者计划的 IP 地址与其他集群重叠。 请先删除所有主机上所有不匹配的 Dynamic NIC,然后再重新添加任何接口,并验证您的 IP 方案是否与现有集群重叠。
不支持 NSX 虚拟交换机模式 在 VCF 9.x 中,默认 NSX 虚拟交换机模式为增强型数据路径标准,VMware 解决方案主机不支持该模式。 清除应用在 NSX Manager 中配置的默认虚拟交换机模式,并将操作模式设置为标准(或 API 规范中的 "hostSwitchOperationalMode": "STANDARD")。如需了解详情,请参阅 NSX 虚拟交换机模式。
主机无法 ping 通子网网关 (.1) Google Cloud 不会响应子网网关 IP 地址上的 ICMP 回显请求。 预期行为;忽略网关 ping 警告。
时间同步 (NTP) 配置 裸金属主机使用 Compute Engine 元数据服务器进行时间同步。 直接将元数据服务器 IP 地址 (169.254.169.254) 用作 NTP 服务器。
主机指纹或证书显示内部名称 主机上未设置 DNS 搜索网域,或者主机名带有结尾英文句点。 运行 esxcli network ip dns search add -d vmware.gve 命令,重新运行 /var/lib/vmware/osdata/init.sh 脚本,然后运行 /sbin/generate-certificates 命令并重启 rhttpproxy 和 hostd 服务。
主机调试失败 vmk0 VMkernel 适配器仍使用 DHCP,因为启动服务未对其进行转换。 运行 esxcli network ip interface ipv4 get -i vmk0 命令。如果类型为 DHCP,请手动将其设置为静态(例如,在 esxi-h7 上:esxcli network ip interface ipv4 set -i vmk0 -t static -I 192.168.0.161 -N 255.255.255.0 -g 192.168.0.1)。
vSAN 复制错误、vMotion 超时或 NSX 叠加层分片 VCF 会将 VDS、VMkernel 适配器和 NSX 配置文件的 MTU 默认设置为 9000 字节,而 VPC 网络会丢弃大于 8896 字节的帧。 在 VDS、网络池(vMotion 和 vSAN)以及 NSX 上行链路配置文件中配置 8896 字节的 MTU。如需了解详情,请参阅 VDS MTU 不匹配。
向导会提示输入叠加层端口组的 VLAN ID 默认 VDS 配置文件需要 NSX 主机叠加层 VLAN ID。 输入现有 NSX 配置的 TEP VLAN ID(在本指南中为 4)。
新集群上不存在工作负载虚拟机的端口组 默认 VDS 配置文件仅创建基础架构端口组。 在创建集群后为工作负载虚拟机创建分布式端口组,或使用自定义交换机配置。
无法使用所选 vLCM 映像添加主机 集群的 vLCM 映像与主机上安装的 ESXi build 不同。 使用现有集群所用的同一 ESXi 映像系列,或从其中一个新主机中提取映像。

后续步骤