Terraform 및 도구 키트를 사용하여 노드 및 VCF 배포

이 문서에서는 Terraform 자동화를 사용하여 VMware Cloud Foundation (VCF)을 사용하는 Google Cloud 의 VMware 솔루션에 베어메탈 ESXi 노드, 레이어 2 브로드캐스트 네트워크, Cloud DNS, 리전 내부 부하 분산기 (ILB)를 배포하는 방법을 설명합니다.

자동화는 다음 인프라를 프로비저닝합니다.

  • 전용 베어메탈 ESXi 하이퍼바이저 (z3-highmem-192-highlssd-metal 또는 z3-highmem-192-metal)
  • 점보 프레임 (MTU 8896)이 있는 멀티 VLAN Layer 2 브로드캐스트 네트워크
  • Cloud DNS 비공개 관리형 영역 및 인바운드 쿼리 전달 정책
  • 무상 ARP / 라우터 공지 (GARP_RA) 빠른 IP 이동 고가용성이 있는 리전 ILB
  • 관리 및 NSX 데이터 경로 인터페이스를 위한 영역 네트워크 엔드포인트 그룹 (NEG)

시작하기 전에

Terraform 자동화를 실행하기 전에 필요한 도구를 설치하고, 필요한 API를 사용 설정하고, 레이어 2 서브넷 네트워킹을 허용 목록에 추가하고, Google Cloud 프로젝트에 대한 다음 요구사항을 확인합니다.

  1. 프로젝트의 대상 리전 및 영역에 베어메탈 노드 할당량이 충분한지 확인합니다. 필수 할당량과 할당량 상향을 보거나 요청하는 방법에 대한 안내는 할당량 및 한도를 참조하세요.
  2. Compute Admin (roles/compute.admin) 및 Cloud DNS를 사용하는 경우 DNS Administrator (roles/dns.admin)를 포함하여 필요한 Identity and Access Management (IAM) 권한이 있는지 확인합니다.
  3. 계획된 모든 ESXi 노드 호스트 이름 및 VCF 어플라이언스 엔드포인트에 대한 정방향 및 역방향 조회를 지원하도록 도메인 이름 시스템 (DNS) 인프라를 계획합니다.
  4. 노드 호스트 이름: 배포 중에 각 노드의 정규화된 도메인 이름 (FQDN)을 제공합니다. 이렇게 하면 ESXi가 호스트 이름을 사용하여 인증서를 생성합니다.
  5. 신뢰할 수 있는 이미지 정책: 조직에서 constraints/compute.trustedImageProjects 조직 정책을 시행하지 않는 경우 별도의 조치가 필요하지 않습니다. 조직에서 이 정책을 적용하는 경우 Compute Engine에서 베어메탈 부팅 디스크를 만들 수 있도록 projects/smve-prod-public-images를 허용합니다. 자세한 내용은 이미지 액세스 제약조건 설정을 참조하세요.
  6. VPC 서비스 제어: 대상 프로젝트가 서비스 경계에 있지 않으면 별도의 조치가 필요하지 않습니다. 프로젝트가 서비스 경계에 있는 경우 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 vCPU 192개 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 128GB 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 솔루션에서는 VLAN 기반 네트워킹을 지원하기 위해 Virtual Private Cloud (VPC) 네트워크의 서브넷에 Resolve Subnet Mask 속성이 Broadcast primary range only with learning으로 설정되어 있어야 합니다. Google Cloud 콘솔 고객센터에서 다음 정보를 사용하여 지원 티켓을 엽니다.

  • 제품: Google Cloud VMware Engine
  • 우선순위: P2
  • 카테고리: 네트워크 연결
  • 비즈니스 영향: 일반적인 기술 관련 질문
  • 자세한 내용 제공: Allowlist L2 network connectivity for my project, 프로젝트 ID, 프로젝트 번호, 배포의 대상 리전 및 영역

VLAN 기반 네트워킹 지원에 대한 자세한 내용은 레이어 2 에뮬레이션: ARP 브로드캐스팅 및 커스텀 MAC 학습을 참조하세요.

조직 정책 및 VPC 서비스 제어 구성

VMware 솔루션의 베어메탈 ESXi 인스턴스는 프로젝트 번호가 999037279871인 smve-prod-public-images 프로젝트에서 호스팅되는 Google 제공 ESXi 이미지에서 부팅됩니다. 기본적으로 추가 구성은 필요하지 않습니다. 조직에서 신뢰할 수 있는 이미지 정책을 시행하거나 VPC 서비스 제어를 사용하는 경우에만 다음 구성을 적용합니다.

  • 신뢰할 수 있는 이미지 정책: 조직에서 constraints/compute.trustedImageProjects 조직 정책을 시행하지 않는 경우 별도의 조치가 필요하지 않습니다. 조직에서 이 정책을 적용하는 경우 Compute Engine에서 베어메탈 부팅 디스크를 만들 수 있도록 projects/smve-prod-public-images를 허용합니다. 자세한 내용은 이미지 액세스 제약조건 설정을 참조하세요.
  • VPC 서비스 제어 이그레스 규칙: 대상 프로젝트가 서비스 경계에 없으면 별도의 작업이 필요하지 않습니다. 프로젝트가 서비스 경계에 있는 경우 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을 실행하는 ID (인간 관리자 또는 자동화된 CI/CD 서비스 계정)에는 대상Google Cloud 프로젝트에 대한 다음 IAM 역할이 필요합니다.

역할 역할 ID 사용 범위
Compute 관리자 roles/compute.admin 베어메탈 컴퓨팅 인스턴스를 프로비저닝하고, 커스텀 부팅 디스크 이미지를 연결하고, 배치 정책을 구성하고, 멀티 NIC 인터페이스를 관리합니다. VPC 네트워크, 레이어 2 브로드캐스트 서브넷, 고정 IP 예약, 리전 ILB, 백엔드 서비스, 전달 규칙, 영역 NEG를 관리합니다. VPC 인그레스 방화벽 보안 규칙을 만들고 관리합니다.
DNS 관리자 roles/dns.admin Cloud DNS 비공개 전달 및 역방향 영역, 인바운드 쿼리 전달 정책, A 및 PTR 리소스 레코드 세트를 관리합니다.
서비스 계정 사용자 roles/iam.serviceAccountUser cloud-platform 범위로 인스턴스를 프로비저닝할 수 있도록 기본 Compute Engine 서비스 계정 (PROJECT_NUMBER-compute@)에 이 역할을 부여합니다.

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@' \
    --member='user:USER_EMAIL' \
    --role='roles/iam.serviceAccountUser' \
    --project='PROJECT_ID'

명령어를 실행하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 대상 Google Cloud 프로젝트의 ID입니다.
  • PROJECT_NUMBER: 대상 Google Cloud프로젝트의 프로젝트 번호입니다.
  • USER_EMAIL: 사용자 ID의 이메일 주소입니다.

Terraform 실행기 인증

운영 환경에 따라 다음 인증 전략 중 하나를 선택합니다.

서비스 계정 가장을 사용하여 인증

서비스 계정 가장은 단기 OAuth 2.0 액세스 토큰을 생성하여 장기 사용자 인증 정보 키를 제거합니다. Terraform이 지정된 서비스 계정으로 실행되는 동안 개인 ID가 인증됩니다.Google Cloud 는 서비스 계정에 대해 Terraform에서 수행한 작업을 감사합니다.

  1. 실행자 서비스 계정에 대한 서비스 계정 토큰 생성자 역할 (roles/iam.serviceAccountTokenCreator)을 개인 Google Cloud ID에 부여합니다.

    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 CloudID의 이메일 주소입니다.
    • PROJECT_ID: 대상 Google Cloud 프로젝트의 ID입니다.
  2. 로컬 환경을 인증합니다.

    gcloud auth application-default login
    
  3. GOOGLE_IMPERSONATE_SERVICE_ACCOUNT 환경 변수를 설정하여 Terraform 실행 전반에서 가장을 적용합니다.

    export GOOGLE_IMPERSONATE_SERVICE_ACCOUNT='SA_EMAIL'
    

애플리케이션 기본 사용자 인증 정보를 사용하여 인증

사용자 ID에 필요한 권한이 직접 부여된 개발 및 테스트 환경에서 애플리케이션 기본 사용자 인증 정보 (ADC)를 사용합니다.Google Cloud 는 개인 ID에 대한 작업을 감사합니다.

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은 4개의 모듈식 단계에 걸쳐 리소스 프로비저닝을 조정합니다. 이 모듈식 설계는 엄격한 종속 항목 순서를 적용하여 컴퓨팅 호스트, 부하 분산기, 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)을 만듭니다. e2e-terraform 디렉터리에서 management_cluster.tfvars 파일로 sample_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 리소스 자체 링크 URL을 완료합니다.
  • 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 파일로 변환할 수 있습니다.

배포 구성 내보내기

이 도구 키트에는 Terraform 출력에서 구성 블록을 추출하고 다운스트림 워크플로를 위해 스키마를 준수하는 형식의 JSON 파일로 내보내는 도우미 스크립트 (scripts/export_deployment_config.py)가 포함되어 있습니다.

  • 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 출력을 사용하여 VCF 설치 프로그램 어플라이언스를 배포합니다 (도우미 스크립트를 사용하여 JSON으로 변환됨). 자세한 내용은 노드 준비 및 도구 키트를 사용하여 VCF 배포를 참조하세요.
  2. VCF 설치 프로그램에서 리전별 오프라인 저장소에 대한 연결을 구성하여 필요한 소프트웨어 번들을 다운로드합니다.
    • 프로토콜: HTTPS
    • FQDN (IP 주소 사용 안함): offline-depot.REGION.selfmanagedvmwareengine.goog (REGION를 베어메탈 노드가 있는 Google Cloud리전으로 바꿈)
    • 포트: 443
    • 사용자 이름: vcf-depot-user
    • 비밀번호: Google1!
  3. management_domain_deployment_input_config JSON 파일 (도우미 스크립트를 사용하여 내보냄)을 VCF 설치 프로그램에 제공하여 관리 도메인을 배포합니다. 입력 구성에서 user_should_input로 표시된 모든 필드를 대상 값으로 바꿉니다. VCF 브링업 워크플로를 완료하는 방법은 Broadcom 문서의 새 VCF Fleet 또는 새 VCF 인스턴스 배포를 참조하세요.
  4. Terraform을 사용하여 노드 용량 관리에서 노드를 추가하여 클러스터 용량을 확장합니다.
  5. Terraform을 사용하여 VCF 어플라이언스 추가에서 추가 VCF 어플라이언스에 대한 부하 분산기 및 DNS 레코드를 프로비저닝합니다.