使用 Terraform

如要在 Google Distributed Cloud (GDC) 實體隔離環境中設定 Terraform,您必須下載 Terraform,並設定 Terraform 來處理 Kubernetes 資源。

本文適用於所有需要設定 Terraform,以管理實體隔離硬體和軟體工作流程的目標對象。詳情請參閱「GDC 實體隔離方案說明文件的目標對象」。

事前準備

  • 請按照 HashiCorp 提供的說明文件,將 Terraform 1.6.3 以上版本下載到工作站:https://developer.hashicorp.com/terraform/install。本文中的後端設定採用舊版 Terraform 不支援的設定。

  • 確認您已有 GDC 儲存空間 bucket。如果沒有 Storage bucket,請建立一個。詳情請參閱「建立儲存空間 bucket」。

  • 確認系統能辨識物件儲存庫使用的憑證授權單位 (CA) 憑證。

  • 安裝 gdcloud CLI。詳情請參閱「使用 gdcloud CLI」。

  • 為託管要透過 Terraform 管理的資源的 API 伺服器或叢集,產生 kubeconfig 檔案。詳情請參閱「取得 kubeconfig 檔案」。

設定 Terraform

如要在 GDC 環境中設定 Terraform,請完成下列步驟:

  1. 在 Terraform 模組或工作站上的 Terraform 檔案集合中,建立 main.tf 檔案並新增下列設定:

    terraform {
      backend "s3" {
        bucket = "BUCKET_FQN"
        key = "TF_STATE_PATH"
        region = "ZONE"
        endpoints = {
          s3 = "BUCKET_ENDPOINT"
        }
        use_path_style = true
        access_key = "ACCESS_KEY"
        secret_key = "SECRET_KEY"
        skip_credentials_validation = true
        skip_requesting_account_id = true
        skip_metadata_api_check = true
        skip_region_validation = true
        skip_s3_checksum = true
      }
    }
    

    更改下列內容:

    • BUCKET_FQN:Bucket 自訂資源的 status.fullyQualifiedName 值。例如 aabc2z8-platform-terraform-state。

    • TF_STATE_PATH:要儲存在 bucket 中的 Terraform 狀態檔案路徑。例如:main.tfstate。

    • ZONE:Bucket 自訂資源 (status.region) 的可用區,例如 zone1。Terraform 需要區域值,但 GDC 物件儲存庫不會檢查該值。

    • BUCKET_ENDPOINT:Bucket 自訂資源的 status.endpoint 值。例如 https://objectstorage.org-1.zone1.google.gdch.test。

    • ACCESS_KEY:從含有存取憑證的密鑰取得的存取金鑰。如要進一步瞭解如何取得存取金鑰,請參閱「取得 bucket 存取憑證」。Secret 中的值是以 base64 編碼。請先解碼再使用。

    • SECRET_KEY:從含有存取憑證的密鑰取得的密鑰。如要進一步瞭解如何取得 Secret Key,請參閱「取得 bucket 存取憑證」。Secret 中的值是以 base64 編碼。請先解碼再使用。

    GDC 物件儲存空間與 S3 相容,但並非 AWS。其餘設定會為非 AWS S3 儲存空間設定後端:

    • use_path_style:使用路徑樣式 bucket 定址,用於 GDC 物件儲存庫。

    • skip_credentials_validation 和 skip_requesting_account_id:阻止 Terraform 呼叫 AWS STS 和 AWS IAM。GDC 不提供這些服務。

    • skip_metadata_api_check:禁止 Terraform 查詢 AWS EC2 中繼資料服務。

    • skip_region_validation:可讓您將可用區名稱當做區域。

    • skip_s3_checksum:Terraform 上傳狀態檔案時,不會要求提供 SHA-256 核對和。

  2. 在上一個步驟指定的儲存空間 bucket 中,初始化 Terraform 狀態檔案:

    terraform init
    
  3. 部署 crd-viewer 叢集角色資源,並繫結至使用者帳戶:

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: crd-viewer
    rules:
    - apiGroups: ["apiextensions.k8s.io"]
      resources: ["customresourcedefinitions"]
      verbs: ["get", "list", "watch"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: crd-viewer-binding
    subjects:
    - kind: User
      name: USER_EMAIL
    roleRef:
      kind: ClusterRole
      name: crd-viewer
      apiGroup: rbac.authorization.k8s.io
    EOF
    

    更改下列內容:

    • KUBECONFIG:API 伺服器或叢集的 kubeconfig 檔案,用於託管您透過 Terraform 管理的資源。

    • USER_EMAIL:要繫結角色的使用者電子郵件地址。

    將 crd-viewer 角色部署到要使用 Terraform 的每個 API 伺服器或叢集。

  4. 在 main.tf 檔案中,插入下列 required_providers 區塊:

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    

    這項設定會安裝 Kubernetes 供應商,在 GDC 環境中佈建及管理 Kubernetes 資源。

  5. 初始化 Terraform 目前使用的目錄,以便安裝供應商:

    terraform init
    

後續步驟