使用 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 專案符合下列需求:
- 請確認專案在目標區域和可用區中,有足夠的裸機節點配額。如要瞭解必要配額,以及如何查看或要求提高配額,請參閱「配額與限制」。
- 確認您具備必要的 Identity and Access Management (IAM) 權限,包括
Compute Admin(roles/compute.admin);如果您使用 Cloud DNS,則須具備DNS Administrator(roles/dns.admin)。 - 規劃網域名稱系統 (DNS) 基礎架構,支援所有預定 ESXi 節點主機名稱和 VCF 設備端點的正向和反向查詢。
- 節點主機名稱:在部署期間提供每個節點的完整網域名稱 (FQDN)。這可確保 ESXi 使用主機名稱產生憑證。
- 可信映像檔政策:如果組織未強制執行
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詳情請參閱「輸出規則參考資料」。
安裝 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 對服務帳戶執行的動作。
將服務帳戶權杖建立者角色 (
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。
驗證本機環境:
gcloud auth application-default login設定
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.jsonpython_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 .
後續步驟
- 執行節點準備工具包,重設各主機的初始 ESXi
root密碼、準備節點以部署 VCF,並使用端對端 Terraform 設定的python_scripts_input_config輸出內容 (使用輔助指令碼轉換為 JSON),部署 VCF 安裝程式設備。如需操作說明,請參閱「使用工具包準備節點並部署 VCF」。 - 在 VCF 安裝程式中設定與區域離線存放區的連線,下載必要的軟體套件:
- Protocol (通訊協定):
HTTPS - FQDN (請勿使用 IP 位址):
offline-depot.REGION.selfmanagedvmwareengine.goog(將REGION替換為裸機節點所在的 Google Cloud區域) - Port (通訊埠):
443 - 使用者名稱:
vcf-depot-user - 密碼:
Google1!
- Protocol (通訊協定):
- 將
management_domain_deployment_input_configJSON 檔案 (使用輔助指令碼匯出) 提供給 VCF 安裝程式,部署管理網域。請務必將輸入設定中所有標示為user_should_input的欄位替換為目標值。如需完成 VCF 啟動工作流程的操作說明,請參閱 Broadcom 說明文件中的「Deploy a new VCF fleet or a new VCF instance」(部署新的 VCF 機群或新的 VCF 執行個體)。 - 按照「使用 Terraform 管理節點容量」一文的說明,新增節點來擴充叢集容量。
- 在「使用 Terraform 新增 VCF 設備」中,為其他 VCF 設備佈建負載平衡器和 DNS 記錄。