使用 DM Convert 转换您的 Deployment Manager 配置

本页介绍了使用 DM 转换将 Deployment Manager 配置转换为 Kubernetes 资源模型 (KRM)Terraform 的过程。

设置环境

设置环境变量

保存以下环境变量,本指南的其余部分将使用这些变量:

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"

设置工具

您必须有权访问以下工具:

  • gcloud

  • docker

  • kubectl

  • bq

  • jq

如果您使用 Cloud Shell 运行 DM Convert,则表明您已经可以访问它们。

在 Cloud Shell 中打开

转换配置

概括来讲,您可以通过以下方式将 Deployment Manager 配置迁移到 Terraform 或 KRM:

  1. 准备 Deployment Manager 部署以进行转换。

  2. 将配置转换为 HCL(HashiCorp 配置语言,适用于 Terraform)或 KRM(Kubernetes 资源模型)格式。

  3. 使用 Terraform 或 Config Connector 应用转换后的配置。

  4. 放弃现有的 Deployment Manager 部署。

准备现有部署

DM Convert 在 Deployment Manager 配置文件和模板上运行。在本指南中,这些文件将在本地创建并保存,以用作 DM Convert 工具的输入。

您可以自行创建配置文件,也可以从实时部署中获取配置。

转换配置文件

您可以使用以下示例配置来试用转换器。将 PROJECT_ID 替换为您的 Google Cloud 项目 ID,并将以下内容保存到名为 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
  • 从实时部署中获取配置

    如果要获取和转换实时部署的配置,则可以通过运行以下命令检索扩展配置并将其保存到磁盘,并将 DEPLOYMENT_NAME 替换为部署名称。

    # 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
    

转换部署

如需将 deployment.yaml 中的资源转换为 HCL 或 KRM 格式并将其另存为转换后的输出,请在 deployment.yaml 所在的目录中运行以下命令,并进行所需的替换:

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

进行以下替换:

  • OUTPUT_FORMAT:转换的输出格式。这可以是 TF (Terraform) 或 KRM (KRM)。

  • OUTPUT_FILE:转换后的输出保存到的文件的名称。

  • (仅限 Terraform) OUTPUT_IMPORT_FILE:用于保存 Terraform 导入命令的文件的名称。如果指定了 project_id 标志,系统会根据该标志生成导入命令。如果未指定 project_id 标志,系统会根据资源配置中的 projectId 属性生成导入命令。

  • DEPLOYMENT_NAME:部署的名称。如果您在 Deployment Manager 配置中使用模板,并且同时使用 deployment 环境变量,则该参数适用。如需了解详情,请访问使用环境变量

查看转化

# Print output file
cat OUTPUT_FILE

应用转换后的配置

Terraform

设置 Terraform

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

将 Deployment Manager 资源转换为 Terraform 资源后,您可以使用 Terraform 直接部署转换后的配置来创建资源。

使用 Terraform 部署转换后的配置

# 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

(可选)导入现有资源

如果您要转换现有部署,并且希望使用 Terraform 管理其资源,而无需重新部署,可以使用 Terraform 导入功能

在本部分中,您将使用 deployment.yaml 进行导入过程。

初始化 Terraform:

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

系统会生成导入命令并将其保存到 OUTPUT_IMPORT_FILE。如需查看其内容,请运行以下命令:

cat OUTPUT_IMPORT_FILE

如需导入 deployment.yaml 的资源,请运行以下命令:

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

将资源导入 Terraform 状态后,您可以运行 Terraform plan 命令,验证状态与生成的 Terraform 配置之间是否有任何更改:

terraform plan

这会生成以下输出:

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.

接受 Terraform 方案中的这项更改,因为它会移除部署管理器专用标签(例如 goog-dm),这些标签在资源由 Terraform 管理后就不再需要了。

如需应用 Terraform 配置,请运行以下命令:

# Accept changes by entering yes when prompted
terraform apply

现在,deployment.yaml 中定义的所有资源都由 Terraform 管理。

例如,如果您想验证 Terraform 是否实际在管理转换后的资源,可以通过修改 google_bigquery_dataset.bigquerydataset 资源中的默认表过期时间,对 Terraform 配置进行细微更改:

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

进行更改后,您可以应用 Terraform 配置,并使用 bq 命令行界面 (CLI) 验证更改:

# 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'

您收到的输出应与更新后的 Terraform 配置中提供的值一致,这表明 Terraform 现在正在管理这些资源。

KRM

设置 Config Connector

如需激活 KRM 配置文件中的资源,您需要一个安装了 Config Connector 的 Kubernetes 集群。如需创建测试集群,请参阅使用 GKE 插件进行安装

在 Cloud Shell 中,确保为要使用的 GKE 集群配置了 kubectl 凭据。将 GKE_CLUSTER 替换为集群的名称,然后运行以下命令:

gcloud container clusters get-credentials GKE_CLUSTER

使用 kubectl 部署转换后的 KRM 配置

如需使用 kubectl 部署转换后的 KRM 配置,请运行以下命令:

# 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

清理

清理示例数据集和表

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

要从示例配置中清理 BigQuery 数据集和表,请运行以下命令:

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

放弃示例 Deployment Manager 部署

如需放弃已成功转换为 KRM 或 Terraform 的实时部署,请运行以下命令:

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

支持的转化资源

Terraform

如需列出 Terraform 支持的资源,请运行以下命令:

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

如需列出 KRM 支持的资源,请运行以下命令:

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

后续步骤

查看转换后的配置的最佳实践和建议