設定 Terraform

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

事前準備

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

  • 確認您已有 GDC 儲存空間 bucket。如果沒有 Storage bucket,請建立一個。

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

管理狀態檔案

Terraform 中的狀態檔案用於記錄部署作業的目前狀態,並對應至 Terraform 設定。由於 GDC 物件儲存庫是使用 S3 實作,因此您可以使用 Terraform S3 API 與共用狀態檔案同步。為此,您必須設定 Terraform,與遠端狀態同步:

  1. 將下列設定新增至儲存在本機的 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:Terraform 狀態檔案的路徑,用於儲存在 Storage bucket 中。例如: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:從含有存取憑證的密鑰取得的密鑰。請按照「取得 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. 在上一步指定的儲存空間值區中,初始化新的狀態檔案編輯內容:

    terraform init
    

設定權限

除了使用 Terraform 執行特定工作所需的權限 (例如建立 GDC 專案),您也必須具備在該範圍內查看自訂資源定義的權限。套用使用 Terraform 所需的權限:

  1. 建立 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"]
    EOF
    

    將 KUBECONFIG 替換為 API 伺服器或叢集的 kubeconfig 檔案,該伺服器或叢集託管您使用 Terraform 管理的資源。舉例來說,大多數資源都在 Management API 伺服器上執行。如果是容器工作負載,請設定 Kubernetes 叢集 kubeconfig 檔案。如果您管理的是全域資源,請務必設定全域 API 伺服器。

  2. 將上一步定義的叢集角色繫結至使用者:

    kubectl apply --kubeconfig KUBECONFIG -f - <<EOF
    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
    

針對要設定 Terraform 權限的每個 API 伺服器或叢集,重複執行上述步驟。

安裝及設定 Terraform 供應商

您必須安裝 Kubernetes Provider,才能佈建及管理 Kubernetes 資源。

  1. 在模組的 Terraform 檔案 (例如 main.tf 檔案) 中,插入下列 required_providers 區塊:

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    
  2. 初始化 Terraform 目前使用的目錄,以便安裝供應商:

    terraform init