Deployment Manager-Konfigurationen mit DM Convert konvertieren

Auf dieser Seite wird beschrieben, wie Sie mit DM Convert Ihre Deployment Manager-Konfigurationen in das Kubernetes-Ressourcenmodell (KRM) oder Terraform konvertieren.

Umgebung einrichten

Umgebungsvariablen einrichten

Speichern Sie die folgenden Umgebungsvariablen, die im weiteren Verlauf dieser Anleitung verwendet werden:

export PROJECT_ID=$(gcloud config get-value project) \
export DM_CONVERT_IMAGE="us-central1-docker.pkg.dev/\
dm-convert-host/deployment-manager/dm-convert:public-preview"

Tools einrichten

Sie benötigen Zugriff auf die folgenden Tools:

  • gcloud

  • docker

  • kubectl

  • bq

  • jq

Wenn Sie DM Convert mit Cloud Shell ausführen, haben Sie bereits Zugriff darauf.

In Cloud Shell öffnen

Konfigurationen konvertieren

Auf übergeordneter Ebene migrieren Sie Ihre Deployment Manager-Konfiguration so zu Terraform oder KRM:

  1. Vorbereiten einer Deployment Manager-Bereitstellung für die Konvertierung.

  2. Konvertieren der Konfiguration in das HCL-Format (HashiCorp-Konfigurationssprache für Terraform) oder das KRM-Format (Kubernetes-Ressourcenmodell).

  3. Verwenden der Terraform- oder Config Connector-Anwendung, um die konvertierte Konfiguration anzuwenden.

  4. Verwerfen der vorhandenen Deployment Manager-Bereitstellung.

Vorhandene Bereitstellung vorbereiten

DM Convert basiert auf Deployment Manager-Konfigurationsdateien und -Vorlagen. Im Verlauf des Leitfadens werden diese Dateien erstellt und lokal als Eingabe für das DM Convert-Tool gespeichert.

Sie können eine Konfigurationsdatei selbst erstellen oder eine Konfiguration aus einer Live-Bereitstellung abrufen.

Konfigurationsdatei konvertieren

Mit der folgenden Beispielkonfiguration können Sie den Converter testen. Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID und speichern Sie den folgenden Inhalt in einer Datei mit dem Namen deployment.yaml:

  resources:
  - name: bigquerydataset
    type: bigquery.v2.dataset
    properties:
      datasetReference:
        datasetId: bigquerydataset
        projectId: PROJECT_ID
      defaultTableExpirationMs: 36000000
      location: us-west1
  - type: bigquery.v2.table
    name: bigquerytable
    properties:
      datasetId: bigquerydataset
      labels:
        data-source: external
        schema-type: auto-junk
      tableReference:
        projectId: PROJECT_ID
        tableId: bigquerytable
    metadata:
      dependsOn:
      - bigquerydataset
  • Konfiguration aus einer Live-Bereitstellung abrufen

    Wenn Sie die Konfiguration einer Live-Bereitstellung abrufen und konvertieren möchten, können Sie die erweiterte Konfiguration abrufen und auf dem Laufwerk speichern. Führen Sie dazu die folgenden Befehle aus und ersetzen Sie dabei DEPLOYMENT_NAME durch den Namen der Bereitstellung.

    # Configure your project/deployment
    DEPLOYMENT_NAME=DEPLOYMENT_NAME
    PROJECT_ID=PROJECT_ID
    
    # Fetch the latest manifest for the given deployment
    gcloud deployment-manager deployments describe $DEPLOYMENT_NAME \
      --project $PROJECT_ID --format="value(deployment.manifest)"
    https://www.googleapis.com/deploymentmanager/v2/projects/$PROJECT_ID/global/deployments/bq/manifests/manifest-1618872644848
    
    # The manifest name is the last path segment from the URI
    # in the above command output
    MANIFEST_NAME="manifest-1618872644848"
    # Save the expanded manifest to deployment.yaml
    gcloud deployment-manager manifests describe $MANIFEST_NAME \
      --deployment $DEPLOYMENT_NAME --project $PROJECT_ID \
      --format="value(expandedConfig)" > deployment.yaml
    

Bereitstellung konvertieren

Wenn Sie Ressourcen in deployment.yaml in das HCL- oder KRM-Format konvertieren und als konvertierte Ausgabe speichern möchten, führen Sie den folgenden Befehl im selben Verzeichnis wie deployment.yaml mit den gewünschten Ersetzungen aus:

CONVERTED_RESOURCES=OUTPUT_FILE

docker run --rm -it --workdir=/convert \
--volume=$(pwd):/convert \
$DM_CONVERT_IMAGE \
--config deployment.yaml \
--output_format OUTPUT_FORMAT \
--output_file OUTPUT_FILE \
--output_tf_import_file OUTPUT_IMPORT_FILE \
--deployment_name DEPLOYMENT_NAME \
--project_id $PROJECT_ID

Ersetzen Sie die Parameter:

  • OUTPUT_FORMAT: Das Ausgabeformat der Konvertierung. Dies kann entweder TF für Terraform oder KRM für KRM sein.

  • OUTPUT_FILE: Der Name der Datei, in der die konvertierte Ausgabe gespeichert wird.

  • (Nur Terraform) OUTPUT_IMPORT_FILE: Der Name der Datei, in der die Terraform-Importbefehle gespeichert werden. Wenn ein project_id-Flag angegeben ist, werden die Importbefehle basierend auf diesem Flag generiert. Wenn kein project_id-Flag angegeben ist, werden die Importbefehle basierend auf dem projectId-Attribut aus der Ressourcenkonfiguration generiert.

  • DEPLOYMENT_NAME: Der Name der Bereitstellung. Dies ist wichtig, wenn Sie Vorlagen in Ihrer Deployment Manager-Konfiguration und wenn Sie die Umgebungsvariable deployment verwenden. Weitere Informationen finden Sie unter Umgebungsvariable verwenden.

Conversions ansehen

# Print output file
cat OUTPUT_FILE

Konvertierte Konfiguration anwenden

Terraform

Terraform einrichten

# Configure default project
cat <<EOF > echo > main.tf
provider "google" {
  project = "$PROJECT_ID"
}
EOF

Nachdem Sie Ihre Deployment Manager-Ressourcen in Terraform konvertiert haben, können Sie mit Terraform Ressourcen erstellen, indem Sie die konvertierte Konfiguration direkt bereitstellen.

Konvertierte Konfiguration mit Terraform bereitstellen

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
terraform init
echo "***************  TERRAFORM PLAN  ******************"
terraform plan
echo "**************  TERRAFORM APPLY  ******************"
terraform apply

Optional: Vorhandene Ressourcen importieren

Wenn Sie eine vorhandene Bereitstellung konvertieren und die Ressourcen mit Terraform verwalten möchten, ohne sie neu bereitzustellen, können Sie die Importfunktion von Terraform verwenden.

In diesem Abschnitt verwenden Sie deployment.yaml für den Importvorgang.

Initialisieren Sie Terraform:

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
terraform init

Die Importbefehle werden generiert und in OUTPUT_IMPORT_FILE gespeichert. Führen Sie den folgenden Befehl aus, um den Inhalt anzusehen:

cat OUTPUT_IMPORT_FILE

Führen Sie den folgenden Befehl aus, um die Ressourcen für deployment.yaml zu importieren:

# Make the import file executable
chmod +x OUTPUT_IMPORT_FILE
# Perform the import
./OUTPUT_IMPORT_FILE

Nachdem Sie die Ressourcen in den Terraform-Zustand importiert haben, können Sie mit dem Terraform-Befehl plan prüfen, ob es Änderungen zwischen dem Zustand und der generierten Terraform-Konfiguration gibt:

terraform plan

Dies führt zur folgenden Ausgabe:

Terraform will perform the following actions:

# google_bigquery_dataset.bigquerydataset will be updated in-place
~ resource "google_bigquery_dataset" "bigquerydataset" {
    ...
    ~ labels = {
        # the label value will be based on the deployment name and may not
        # match
        - "goog-dm" = "bq-for-import" -> null
      }
    ...
  }

# google_bigquery_table.bigquerytable will be updated in-place
~ resource "google_bigquery_table" "bigquerytable" {
    ...
    ~ labels = {
        # the label value will be based on the deployment name and may not
        # match
        - "goog-dm" = "bq-for-import" -> null
      }
    ...
  }

Plan: 0 to add, 2 to change, 0 to destroy.

Akzeptieren Sie diese Änderung im Terraform-Plan, da Deployment Manager-spezifische Labels entfernt werden, z.B. goog-dm, die nicht mehr erforderlich sind, sobald Ressourcen von Terraform verwaltet werden.

Führen Sie den folgenden Befehl aus, um die Terraform-Konfiguration anzuwenden:

# Accept changes by entering yes when prompted
terraform apply

Jetzt werden alle in deployment.yaml definierten Ressourcen von Terraform verwaltet.

Wenn Sie beispielsweise prüfen möchten, ob Terraform die konvertierten Ressourcen tatsächlich verwaltet, können Sie eine kleine Änderung an der Terraform-Konfiguration vornehmen, indem Sie die Standardablaufzeit der Tabelle in der google_bigquery_dataset.bigquerydataset-Ressource ändern:

...
# change from 10 hrs to 12 hrs
default_table_expiration_ms = 43200000
...

Nachdem Sie die Änderungen vorgenommen haben, können Sie die Terraform-Konfiguration anwenden und die Änderungen mit der bq-Befehlszeile überprüfen:

# Accept changes by entering yes when prompted
terraform apply
# Access the dataset properties via bq to verify the changes
bq show --format=prettyjson bigquerydataset | jq '.defaultTableExpirationMs'

Die Ausgabe sollte mit den in der aktualisierten Terraform-Konfiguration angegebenen Werten übereinstimmen. Das bestätigt, dass Terraform diese Ressourcen jetzt verwaltet.

KRM

Config Connector einrichten

Zum Bearbeiten der Ressourcen in den KRM-Konfigurationsdateien benötigen Sie einen Kubernetes-Cluster mit installiertem Config Connector. Informationen zum Erstellen eines Testclusters finden Sie unter Mit dem GKE-Add-on installieren.

Achten Sie in Cloud Shell darauf, dass Ihre kubectl-Anmeldedaten für den zu verwendenden GKE-Cluster konfiguriert sind. Ersetzen Sie GKE_CLUSTER durch den Namen des Clusters und führen Sie den folgenden Befehl aus:

gcloud container clusters get-credentials GKE_CLUSTER

Konvertierte KRM-Konfiguration mit kubectl bereitstellen

Führen Sie die folgenden Befehle aus, um Ihre konvertierte KRM-Konfiguration mit kubectl bereitzustellen:

# Ensure that the namespace is annotated to create resources in the correct
# project/folder/organization. https://cloud.google.com/config-connector/docs/how-to/install-upgrade-uninstall#specify
kubectl apply -n CONFIG_CONNECTOR_NAMESPACE \
  -f OUTPUT_FILE

# Wait for the resources to become healthy
kubectl wait -n CONFIG_CONNECTOR_NAMESPACE \
  --for=condition=Ready \
  --timeout=5m -f OUTPUT_FILE

Bereinigen

Beispiel-Dataset und -Tabelle bereinigen

Terraform

# NOTE: if Terraform state gets corrupted during testing,
# use init --reconfigure to reset backend
echo "***************  TERRAFORM INIT  ******************"
terraform init
# Remove delete protection on BigQuery table
sed -i "/resource \"google_bigquery_table\"/a deletion_protection=\"false\"" \
OUTPUT_FILE
terraform apply
echo "***************  TERRAFORM DESTROY ****************"
terraform destroy

KRM

Führen Sie folgenden Befehl aus, um das BigQuery-Dataset und die Tabelle aus der Beispielkonfiguration zu bereinigen:

# If the resource was created via Config Connector:
kubectl delete -n CONFIG_CONNECTOR_NAMESPACE \
  -f OUTPUT_FILE

Beispiel-Deployment Manager-Bereitstellung verwerfen

Führen Sie folgenden Befehl aus, um eine Live-Bereitstellung zu verwerfen, die Sie erfolgreich in KRM oder Terraform konvertiert haben:

gcloud deployment-manager deployments delete DEPLOYMENT_NAME --delete-policy ABANDON

Unterstützte Ressourcen für die Umwandlung

Terraform

Führen Sie den folgenden Befehl aus, um eine Liste der für Terraform unterstützten Ressourcen aufzurufen:

docker run --rm -it \
us-central1-docker.pkg.dev/dm-convert-host/deployment-manager/dm-convert:public-preview \
--output_format tf \
--list_supported_types

KRM

Führen Sie den folgenden Befehl aus, um die unterstützten Ressourcen für KRM aufzulisten:

docker run --rm -it \
us-central1-docker.pkg.dev/dm-convert-host/deployment-manager/dm-convert:public-preview \
--output_format krm \
--list_supported_types

Nächste Schritte

Sehen Sie sich die Best Practices und Empfehlungen für die konvertierte Konfiguration an.