使用 Terraform 和工具包部署節點和 VCF

本文說明如何使用 Terraform 自動化功能,在 Google Cloud 上部署裸機 ESXi 節點、第 2 層廣播網路、Cloud DNS,以及 VMware 解決方案的區域性內部負載平衡器 (ILB),並搭配 VMware Cloud Foundation (VCF)。

自動化作業會佈建下列基礎架構:

  • 專屬裸機 ESXi 管理程序 (z3-highmem-192-highlssd-metal 或 z3-highmem-192-metal)。
  • 多 VLAN 第 2 層廣播網路,支援巨型框架 (MTU 8896)。
  • 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:如果目標專案不在 service perimeter 內,則不需採取任何行動。如果專案位於 service perimeter,請新增輸出規則,允許對 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) 網路的子網路將「Resolve Subnet Mask」(解析子網路遮罩) 屬性設為「Broadcast primary range only with learning」(僅透過學習廣播主要範圍),以支援 VLAN 網路。在Google Cloud 控制台支援中心建立支援單,並提供下列資訊:

  • 產品:Google Cloud VMware Engine
  • Priority:P2
  • 類別:網路連線
  • 業務影響:一般技術問題
  • 提供更多詳細資料:Allowlist L2 network connectivity for my project,以及專案 ID、專案編號,以及部署作業的目標區域和可用區

如要進一步瞭解 VLAN 網路支援,請參閱「第 2 層模擬:ARP 廣播和自訂 MAC 學習」。

設定組織政策和 VPC Service Controls

VMware 解決方案中的裸機 ESXi 執行個體,會從 Google 提供的 ESXi 映像檔啟動,這些映像檔託管於 smve-prod-public-images 專案,專案編號為 999037279871。根據預設,您無須額外進行設定。只有在貴組織強制執行信任的映像檔政策,或使用 VPC Service Controls 時,才需要套用下列設定:

  • 可信映像檔政策:如果組織未強制執行 constraints/compute.trustedImageProjects 組織政策,則不需採取任何行動。如果貴組織強制執行這項政策,請允許 projects/smve-prod-public-images,讓 Compute Engine 建立裸機開機磁碟。詳情請參閱「設定映像檔存取限制」。
  • VPC Service Controls 輸出規則:如果目標專案不在 service perimeter 內,則不需採取任何行動。如果專案位於 service perimeter 內,請新增輸出規則,允許對 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 管理員 roles/compute.admin 佈建裸機運算執行個體、附加自訂開機磁碟映像檔、設定配置政策,以及管理多 NIC 介面。管理虛擬私有雲網路、第 2 層廣播子網路、靜態 IP 預留項目、區域性 ILB、後端服務、轉送規則和可用區 NEG。建立及管理虛擬私有雲輸入防火牆安全性規則。
DNS 管理員 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. 將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予執行工具服務帳戶的個人 Google Cloud 身分:

    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 Hypervisor。

設定 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)。將 e2e-terraform 目錄中的 sample_management_cluster.tfvars 檔案複製到 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:虛擬私有雲網路、子網路、執行個體、配置政策、NEG、後端服務、轉送規則、防火牆和 Cloud DNS 區域的完整 Google Cloud 資源自我連結網址。
  • neg_attachment_commands:
    • deployment_mode 變數設為 "cluster_creation" 時: 傳回狀態訊息,指出 Terraform 會在建立叢集時自動附加 NEG。
    • 當 deployment_mode 變數設為 "node_addition" 時:提供 gcloud compute network-endpoint-groups update 指令,用於將新佈建的 ESXi 主機執行個體附加至管理和 NSX NEG。
    • 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 安裝程式中設定與區域離線存放區的連線,下載必要的軟體套件:
    • Protocol (通訊協定):HTTPS
    • FQDN (請勿使用 IP 位址): offline-depot.REGION.selfmanagedvmwareengine.goog (將 REGION 替換為裸機節點所在的 Google Cloud區域)
    • Port (通訊埠):443
    • 使用者名稱:vcf-depot-user
    • 密碼:Google1!
  3. 將 management_domain_deployment_input_config JSON 檔案 (使用輔助指令碼匯出) 提供給 VCF 安裝程式,部署管理網域。請務必將輸入設定中所有標示為 user_should_input 的欄位替換為目標值。如需完成 VCF 啟動工作流程的操作說明,請參閱 Broadcom 說明文件中的「Deploy a new VCF fleet or a new VCF instance」(部署新的 VCF 機群或新的 VCF 執行個體)。
  4. 按照「使用 Terraform 管理節點容量」一文的說明,新增節點來擴充叢集容量。
  5. 在「使用 Terraform 新增 VCF 設備」中,為其他 VCF 設備佈建負載平衡器和 DNS 記錄。