Terraform konfigurieren

Wenn Sie Terraform in Ihrer GDC-Umgebung (Google Distributed Cloud) mit Air Gap verwenden möchten, müssen Sie es herunterladen und für die Verarbeitung von Kubernetes-Ressourcen konfigurieren.

Hinweis

  • Laden Sie Terraform 1.6.3 oder höher auf Ihre Workstation herunter. Folgen Sie dazu der Dokumentation von HashiCorp: https://developer.hashicorp.com/terraform/install. Die Backend-Konfiguration in diesem Dokument verwendet Einstellungen, die von älteren Terraform-Versionen nicht unterstützt werden.

  • Prüfen Sie, ob Sie einen GDC-Storage-Bucket haben. Wenn Sie keinen Storage-Bucket haben, erstellen Sie einen.

  • Achten Sie darauf, dass Ihr System das vom Objektspeicher verwendete Zertifikat der Zertifizierungsstelle (CA) erkennen kann.

Statusdatei verwalten

Die Statusdatei in Terraform wird verwendet, um den aktuellen Status der Bereitstellung aufzuzeichnen und der Terraform-Konfiguration zuzuordnen. Da der GDC-Objektspeicher mit S3 implementiert wird, können Sie die Terraform S3 API verwenden, um mit einer freigegebenen Statusdatei zu synchronisieren. Dazu müssen Sie Terraform so konfigurieren, dass es mit dem Remote-Zustand synchronisiert wird:

  1. Fügen Sie einer lokal gespeicherten Terraform-Datei, z. B. der Datei main.tf, die folgende Konfiguration hinzu:

    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
      }
    }
    

    Ersetzen Sie Folgendes:

    • BUCKET_FQN: der status.fullyQualifiedName-Wert aus der benutzerdefinierten Ressource Bucket. Beispiel: aabc2z8-platform-terraform-state.

    • TF_STATE_PATH: der Pfad der Terraform-Statusdatei, die im Storage-Bucket gespeichert werden soll. Beispiel: main.tfstate.

    • ZONE: die Zone der benutzerdefinierten Bucket-Ressource (status.region). Beispiel: zone1. Terraform erfordert einen Regionswert, der jedoch vom GDC-Objektspeicher nicht geprüft wird.

    • BUCKET_ENDPOINT: der status.endpoint-Wert aus der benutzerdefinierten Ressource Bucket. Beispiel: https://objectstorage.org-1.zone1.google.gdch.test.

    • ACCESS_KEY: der Zugriffsschlüssel, der aus dem Secret mit Ihren Zugriffsdaten abgerufen wurde. Folgen Sie der Anleitung unter Anmeldedaten für den Bucket-Zugriff abrufen, um den Zugriffsschlüssel zu erhalten. Der Wert im Secret ist base64-codiert. Decodieren Sie ihn, bevor Sie ihn verwenden.

    • SECRET_KEY: der Secret-Schlüssel, der aus dem Secret mit Ihren Zugriffsanmeldedaten abgerufen wurde. Folgen Sie der Anleitung unter Bucket-Zugriffsanmeldedaten abrufen, um den geheimen Schlüssel zu erhalten. Der Wert im Secret ist base64-codiert. Decodieren Sie ihn, bevor Sie ihn verwenden.

    Der GDC-Objektspeicher ist S3-kompatibel, aber nicht AWS. Mit den verbleibenden Einstellungen wird das Backend für Nicht-AWS-S3-Speicher konfiguriert:

    • use_path_style: Verwendet die pfadbasierte Bucket-Adressierung für den GDC-Objektspeicher.

    • skip_credentials_validation und skip_requesting_account_id: Verhindert, dass Terraform AWS STS und AWS IAM aufruft. GDC bietet diese Dienste nicht an.

    • skip_metadata_api_check: Verhindert, dass Terraform den AWS EC2-Metadatendienst abfragt.

    • skip_region_validation: Ermöglicht die Verwendung des Zonennamens als Region.

    • skip_s3_checksum: Verhindert, dass Terraform beim Hochladen der Statusdatei nach einer SHA-256-Prüfsumme fragt.

  2. Initialisieren Sie die neuen Änderungen an der Statusdatei im Storage-Bucket, den Sie im vorherigen Schritt angegeben haben:

    terraform init
    

Berechtigungen festlegen

Neben den Berechtigungen, die zum Ausführen einer bestimmten Aufgabe mit Terraform erforderlich sind, z. B. zum Erstellen eines GDC-Projekts, benötigen Sie auch Berechtigungen zum Aufrufen benutzerdefinierter Ressourcendefinitionen in diesem Bereich. Wenden Sie die erforderlichen Berechtigungen für die Verwendung von Terraform an:

  1. Erstellen Sie die Clusterrollenressource 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
    

    Ersetzen Sie KUBECONFIG durch die kubeconfig-Datei des API-Servers oder Clusters, der die Ressource hostet, die Sie mit Terraform verwalten. Die meisten Ressourcen werden beispielsweise auf dem Management API-Server ausgeführt. Legen Sie für Containerarbeitslasten die kubeconfig-Datei des Kubernetes-Clusters fest. Achten Sie darauf, den globalen API-Server festzulegen, wenn Sie eine globale Ressource verwalten.

  2. Binden Sie die im vorherigen Schritt definierte Clusterrolle an den Nutzer:

    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
    

Wiederholen Sie diese Schritte für jeden API-Server oder Cluster, für den Sie Terraform-Berechtigungen festlegen möchten.

Terraform-Anbieter installieren und konfigurieren

Sie müssen den Kubernetes-Anbieter installieren, um Kubernetes-Ressourcen bereitzustellen und zu verwalten.

  1. Fügen Sie in einer Terraform-Datei in Ihrem Modul, z. B. der Datei main.tf, den folgenden required_providers-Block ein:

    terraform {
      required_providers {
        kubernetes = {
          source = "hashicorp/kubernetes"
          version = ">=2.24.0"
        }
      }
    }
    
  2. Initialisieren Sie Ihr Terraform-Arbeitsverzeichnis, um den Anbieter zu installieren:

    terraform init