使用 Terraform 和工具包部署节点和 VCF

本文档介绍了如何使用 Terraform 自动化工具为 Google Cloud 上的 VMware 解决方案部署裸机 ESXi 节点、第 2 层广播网络、Cloud DNS 和区域级内部负载均衡器 (ILB),并搭配使用 VMware Cloud Foundation (VCF)。

自动化操作会预配以下基础设施:

  • 专用裸金属 ESXi Hypervisor(z3-highmem-192-highlssd-metal 或 z3-highmem-192-metal)。
  • 具有巨型帧 (MTU 8896) 的多 VLAN 第 2 层广播网络。
  • Cloud DNS 专用托管区域和入站查询转发政策。
  • 具有免费 ARP / 路由器通告 (GARP_RA) 快速 IP 移动高可用性的区域级 ILB。
  • 用于管理和 NSX 数据路径接口的可用区级网络端点组 (NEG)。

准备工作

在运行 Terraform 自动化之前,请安装所需的工具、启用所需的 API、将第 2 层子网网络列入许可清单,并验证 Google Cloud 项目的以下要求:

  1. 确保您的项目在目标区域和可用区中有足够的裸金属节点配额。如需了解所需配额以及如何查看或申请增加配额,请参阅配额和限制。
  2. 确保您拥有所需的 Identity and Access Management (IAM) 权限,包括 Compute Admin (roles/compute.admin);如果您使用 Cloud DNS,则还需要 DNS Administrator (roles/dns.admin)。
  3. 规划域名系统 (DNS) 基础架构,以支持对所有规划的 ESXi 节点主机名和 VCF 设备端点进行正向和反向查找。
  4. 节点主机名:在部署期间提供每个节点的完全限定域名 (FQDN)。这可确保 ESXi 使用主机名生成证书。
  5. 可信映像政策:如果您的组织未强制执行 constraints/compute.trustedImageProjects 组织政策,则无需执行任何操作。如果您的组织强制执行此政策,请允许 projects/smve-prod-public-images,以便 Compute Engine 可以创建裸金属启动磁盘。如需了解详情,请参阅设置映像访问限制条件。
  6. VPC Service Controls:如果您的目标项目不在服务边界内,则无需执行任何操作。如果您的项目位于服务边界内,请添加一条出站流量规则,以允许对 smve-prod-public-images 项目 (projects/999037279871) 执行 compute.googleapis.com 操作:

    - egressFrom:
        identityType: ANY_IDENTITY
      egressTo:
        operations:
        - serviceName: compute.googleapis.com
          methodSelectors:
          - method: "*"
        resources:
        - projects/999037279871
    

    如需了解详情,请参阅出站流量规则参考。

安装 Terraform

您必须安装 Terraform CLI 1.3.0 版或更高版本。如需安装 Terraform,请选择与您的操作系统对应的标签页:

Debian 或 Ubuntu

如需在 Debian 或 Ubuntu 上安装 Terraform,请运行以下命令:

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com '"$(lsb_release -cs)"' main' | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update && sudo apt-get install -y terraform

RHEL 或 CentOS

如需在 RHEL 或 CentOS 上安装 Terraform,请运行以下命令:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform

通用 Linux

如需通过直接下载二进制文件来安装 Terraform,请运行以下命令:

export TERRAFORM_VERSION='1.9.5'
curl -fsSLO 'https://releases.hashicorp.com/terraform/'"${TERRAFORM_VERSION}"'/terraform_'"${TERRAFORM_VERSION}"'_linux_amd64.zip'
unzip 'terraform_'"${TERRAFORM_VERSION}"'_linux_amd64.zip'
sudo mv terraform /usr/local/bin/
rm 'terraform_'"${TERRAFORM_VERSION}"'_linux_amd64.zip'

启用 Google Cloud API

在目标 Google Cloud 项目中启用以下所需的 API:

服务端点 用途
compute.googleapis.com 裸金属实例、虚拟私有云 (VPC) 网络、第 2 层子网、防火墙、NEG、区域级 ILB 和静态 IP 预留。
dns.googleapis.com 专用正向和反向 DNS 托管区域、入站转发政策和 DNS 记录集。

如需使用 gcloud CLI 启用所需的 API,请运行以下命令:

gcloud services enable \
    compute.googleapis.com \
    dns.googleapis.com \
    --project='PROJECT_ID'

将 PROJECT_ID 替换为目标 Google Cloud 项目的 ID。

验证区域配额

在预配裸金属节点或创建集群之前,请验证您的项目是否有足够的区域和全球 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 个

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

将基于 VLAN 的第 2 层子网网络列入许可清单

VMware 解决方案要求将虚拟私有云 (VPC) 网络子网的解析子网掩码属性设置为仅通过学习广播主要范围,以支持基于 VLAN 的网络。在 Google Cloud 控制台支持中心提交支持服务工单,并提供以下信息:

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

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

配置组织政策和 VPC Service Controls

VMware 解决方案中的裸金属 ESXi 实例从 smve-prod-public-images 项目(项目编号为 999037279871)中托管的 Google 提供的 ESXi 映像启动。默认情况下,无需进行其他配置。 仅当您的组织强制执行可信映像政策或使用 VPC Service Controls 时,才应用以下配置:

  • 可信映像政策:如果您的组织未强制执行 constraints/compute.trustedImageProjects 组织政策,则无需执行任何操作。如果您的组织强制执行此政策,请允许 projects/smve-prod-public-images,以便 Compute Engine 可以创建裸金属启动磁盘。如需了解详情,请参阅设置映像访问限制条件。
  • VPC Service Controls 出站流量规则:如果目标项目不在服务边界内,则无需执行任何操作。如果您的项目位于服务边界内,请添加一条出站流量规则,以允许对 smve-prod-public-images 项目 (projects/999037279871) 执行 compute.googleapis.com 操作:

    - egressFrom:
        identityType: ANY_IDENTITY
      egressTo:
        operations:
        - serviceName: compute.googleapis.com
          methodSelectors:
          - method: "*"
        resources:
        - projects/999037279871
    

    如需了解详情,请参阅出站流量规则参考。

配置 IAM 权限和角色

运行 Terraform 的身份(人工管理员或自动化 CI/CD 服务账号)需要对目标Google Cloud 项目具有以下 IAM 角色:

角色 角色 ID 使用范围
Compute Admin roles/compute.admin 预配裸金属计算实例、挂接自定义启动磁盘映像、配置布置政策,以及管理多 NIC 接口。管理 VPC 网络、第 2 层广播子网、静态 IP 预留、区域级 ILB、后端服务、转发规则和可用区级 NEG。创建和管理 VPC 入站防火墙安全规则。
DNS Administrator roles/dns.admin 管理 Cloud DNS 专用转发和反向区域、入站查询转发政策以及 A 和 PTR 资源记录集。
服务账号用户 roles/iam.serviceAccountUser 将此角色授予默认 Compute Engine 服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com),以允许使用 cloud-platform 范围预配实例。

使用 gcloud CLI 授予角色

如需分配所需的项目级角色和服务账号权限,请运行以下命令:

# Assign required project-level roles (use 'serviceAccount:SA_EMAIL' if granting to a service account)
for ROLE in \
    roles/compute.admin \
    roles/dns.admin; do
  gcloud projects add-iam-policy-binding 'PROJECT_ID' \
      --member='user:USER_EMAIL' \
      --role=${ROLE}
done
# Grant Service Account User role on the Compute Engine default service account
gcloud iam service-accounts add-iam-policy-binding \
    'PROJECT_NUMBER-compute@developer.gserviceaccount.com' \
    --member='user:USER_EMAIL' \
    --role='roles/iam.serviceAccountUser' \
    --project='PROJECT_ID'

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

  • PROJECT_ID:目标 Google Cloud 项目的 ID。
  • PROJECT_NUMBER:目标 Google Cloud项目的项目编号。
  • USER_EMAIL:您的用户身份的电子邮件地址。

对 Terraform 运行程序进行身份验证

根据您的操作环境,选择以下身份验证策略之一:

使用服务账号模拟进行身份验证

服务账号模拟通过生成短期有效的 OAuth 2.0 访问令牌来消除长期有效的凭证密钥。您的个人身份会进行身份验证,而 Terraform 会以指定服务账号身份运行。Google Cloud 会针对服务账号审核 Terraform 执行的操作。

  1. 为您的个人 Google Cloud 身份授予运行程序服务账号的 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator):

    gcloud iam service-accounts add-iam-policy-binding 'SA_EMAIL' \
       --member='user:USER_EMAIL' \
       --role='roles/iam.serviceAccountTokenCreator' \
       --project='PROJECT_ID'
    

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

    • SA_EMAIL:Terraform 运行器服务账号的电子邮件地址。
    • USER_EMAIL:您的个人 Google Cloud身份的邮箱。
    • PROJECT_ID:目标 Google Cloud 项目的 ID。
  2. 对本地环境进行身份验证:

    gcloud auth application-default login
    
  3. 设置 GOOGLE_IMPERSONATE_SERVICE_ACCOUNT 环境变量,以在 Terraform 执行过程中强制执行模拟:

    export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT='SA_EMAIL'
    

使用应用默认凭据进行身份验证

在开发和测试环境中使用应用默认凭证 (ADC),其中您的用户身份直接拥有所需权限。Google Cloud 会针对您的个人身份审核操作:

gcloud auth application-default login
gcloud config set project 'PROJECT_ID'

将 PROJECT_ID 替换为目标 Google Cloud 项目的 ID。

使用服务账号密钥文件进行身份验证

在不支持交互式用户登录且身份验证依赖于长期有效的服务账号凭证密钥的自动化 CI/CD 流水线(例如 Cloud Build、GitHub Actions 或 Jenkins)中使用服务账号密钥文件。将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为服务账号密钥文件的路径:

export GOOGLE_APPLICATION_CREDENTIALS='KEY_FILE'

将 KEY_FILE 替换为您的服务账号 JSON 密钥的路径。

查看模块化架构

Terraform 会在四个模块化阶段协调资源预配。这种模块化设计强制执行严格的依赖项顺序,以确保在部署计算主机、负载均衡器和 DNS 记录之前存在网络前提条件:

+-----------------------------------------------------------------------------------+
| STAGE 1: VPC Network Infrastructure, Firewalls & Cloud DNS (modules/vpc)          |
| - Custom VPC Network (MTU 8896 jumbo frames)                                      |
| - VPC Ingress Allow-All Firewall Rule                                             |
| - Dedicated Standard Subnetwork (for DNS inbound resolver)                        |
| - Cloud DNS Private Forward & Reverse Managed Zones                               |
| - Cloud DNS Inbound Forwarding Policy (Dynamic DNS_RESOLVER IP discovery)         |
+-----------------------------------------------------------------------------------+
                                         │
                                         ▼
+-----------------------------------------------------------------------------------+
| STAGE 2: L2 Broadcast Subnetworks & Zonal NEGs (modules/subnets)                  |
| - Primary Management Subnet (Untagged Native VLAN, ARP broadcast learning)        |
| - Storage & Infrastructure Subnets: vSAN (VLAN tagged), vMotion, NSX TEP          |
| - Optional Dynamic Workload Subnets                                               |
| - Zonal Network Endpoint Groups (GCE_VM_IP_DEDICATED_BACKEND) for Mgmt & NSX TEP   |
+-----------------------------------------------------------------------------------+
                                         │
                                         ▼
+-----------------------------------------------------------------------------------+
| STAGE 3: Bare-Metal ESXi Hosts, IP Allocations & Host DNS (modules/hosts)         |
| - Compute Resource Placement Policy (Availability Domain Count: 5-8, default: 6)  |
| - Universal IP Allocator: Static reservations & dynamic allocation for all NICs   |
| - Bare-Metal ESXi Instances (z3-highmem-192-highlssd-metal, 4+ Multi-NICs)        |
| - Automated NEG Endpoint Attachments (in cluster_creation mode)                   |
| - Cloud DNS Forward (A) and Reverse (PTR) Records for all ESXi Hosts              |
+-----------------------------------------------------------------------------------+
                                         │
                                         ▼
+-----------------------------------------------------------------------------------+
| STAGE 4: Regional Internal Load Balancers & Appliances (modules/appliances)       |
| - Regional Backend Services (GARP_RA Fast IP Move HA Policy)                      |
| - Regional Forwarding Rules (L3_DEFAULT / ALL_PORTS / allow_global_access)        |
| - Automated Cloud DNS Forward (A) and Reverse (PTR) Records for Mgmt Appliances   |
+-----------------------------------------------------------------------------------+

为管理集群预配资源

管理网域管理集群托管核心 VCF 控制平面设备(SDDC Manager、vCenter Server、NSX 管理集群和 VMware Aria Suite)以及 ESXi 虚拟机监控程序。

设置 Terraform 工作区

创建专用工作区目录,并使用 Git 克隆工具包代码库:

mkdir -p ~/vcf-deployments/mgmt-cluster
cd ~/vcf-deployments/mgmt-cluster
git clone https://github.com/GoogleCloudPlatform/self-managed-vmware-solution-toolkit

配置变量定义文件

使用目标环境值创建变量定义文件 (management_cluster.tfvars)。将 sample_management_cluster.tfvars 文件从 e2e-terraform 目录复制到 management_cluster.tfvars 文件中,然后按照内嵌说明和注释根据需要更新所有字段:

cp self-managed-vmware-solution-toolkit/e2e-terraform/sample_management_cluster.tfvars \
    self-managed-vmware-solution-toolkit/e2e-terraform/management_cluster.tfvars

应用 Terraform 配置

前往 self-managed-vmware-solution-toolkit/e2e-terraform 目录,然后初始化并应用 Terraform 配置:

cd self-managed-vmware-solution-toolkit/e2e-terraform
terraform init
terraform plan -var-file='management_cluster.tfvars' -out=tfplan
terraform apply tfplan

查看并导出 Terraform 输出

运行 terraform apply 后,Terraform 会公开四个类别的结构化输出:

  • gcp_resources_self_links:VPC 网络、子网、实例、布置政策、NEG、后端服务、转发规则、防火墙和 Cloud DNS 区域的完整 Google Cloud 资源页内链接网址。
  • neg_attachment_commands:
    • 当 deployment_mode 变量设置为 "cluster_creation" 时: 返回一条状态消息,指示 Terraform 在集群创建期间自动附加 NEG。
    • 当 deployment_mode 变量设置为 "node_addition" 时:提供将新预配的 ESXi 主机实例附加到管理和 NSX NEG 所需的 gcloud compute network-endpoint-groups update 命令。
    • 当 deployment_mode 变量设置为 "appliance_addition" 时: 返回一条状态消息,指示 NEG 仍附加到现有集群节点,并且 Terraform 在添加设备期间不会修改它们。
  • python_scripts_input_config:工具包 python 目录中下游 VCF 安装程序部署自动化脚本的结构化参数配置载荷。您可以通过运行下一部分中所述的辅助脚本,将此输出转换为 Python 脚本工具包所需的 JSON 格式。
  • management_domain_deployment_input_config:管理网域部署的结构化输入,其中大多数字段都是通过端到端预配预先填充的。您可以根据需要或指示修改此输入,并使用下一部分中所述的导出脚本将其转换为 JSON 文件,以进行管理网域部署。

导出部署配置

该工具包包含一个辅助脚本 (scripts/export_deployment_config.py),用于从 Terraform 输出中提取配置块,并将其导出为格式化且符合架构的 JSON 文件,以供下游工作流使用:

  • management_domain_deployment_input_config:VCF 管理网域部署的输入 JSON。
  • python_scripts_input_config:工具包 Python 自动化脚本 (vcf_deployer) 的输入 JSON (config.json)。

运行帮助程序脚本

通过选择以下选项之一,从 e2e-terraform 目录运行辅助脚本(或指定 -d 或 -i 标志):

  • 同时导出两种配置:

    python3 ../scripts/export_deployment_config.py --config all --output-dir .
    

    此命令会生成以下文件:

    • management_domain_deployment_input.json
    • python_scripts_input_config.json
  • 仅导出 VCF 管理网域部署输入 JSON:

    python3 ../scripts/export_deployment_config.py --config mgmt -o management_domain_deployment_input.json
    
  • 仅导出 Python 工具包输入 JSON:

    python3 ../scripts/export_deployment_config.py --config python -o config.json
    
  • 从保存的 Terraform 输出或通过管道传输的标准输入 (stdin) 中导出:

    # From stdin pipe:
    terraform output -json | python3 ../scripts/export_deployment_config.py --config all --output-dir .
    
    # From a saved JSON file:
    terraform output -json > outputs.json
    python3 ../scripts/export_deployment_config.py -i outputs.json --config all --output-dir .
    

后续步骤

  1. 运行节点准备工具包,以重置每个主机上的初始 ESXi root 密码,为 VCF 部署准备节点,并使用端到端 Terraform 配置中的 python_scripts_input_config 输出(使用辅助脚本转换为 JSON)部署 VCF 安装程序设备。如需查看相关说明,请参阅使用工具包准备节点并部署 VCF。
  2. 在 VCF 安装程序中配置与区域级离线仓库的连接,以下载所需的软件包:
    • 协议:HTTPS
    • FQDN(请勿使用 IP 地址):offline-depot.REGION.selfmanagedvmwareengine.goog(将 REGION 替换为裸金属节点所在的 Google Cloud区域)
    • 端口:443
    • 用户名:vcf-depot-user
    • 密码:Google1!
  3. 通过向 VCF 安装程序提供 management_domain_deployment_input_config JSON 文件(使用辅助脚本导出)来部署管理网域。请确保将输入配置中标记为 user_should_input 的所有字段替换为目标值。如需了解如何完成 VCF 启动工作流,请参阅 Broadcom 文档中的部署新的 VCF 舰队或新的 VCF 实例。
  4. 在使用 Terraform 管理节点容量中,通过添加节点来扩展集群容量。
  5. 在使用 Terraform 添加 VCF 设备中为其他 VCF 设备预配负载均衡器和 DNS 记录。