本页介绍了使用 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
如果您使用 Cloud Shell 运行 DM Convert,则表明您已经可以访问它们。
转换配置
概括来讲,您可以通过以下方式将 Deployment Manager 配置迁移到 Terraform 或 KRM:
准备 Deployment Manager 部署以进行转换。
将配置转换为 HCL(HashiCorp 配置语言,适用于 Terraform)或 KRM(Kubernetes 资源模型)格式。
使用 Terraform 或 Config Connector 应用转换后的配置。
放弃现有的 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
后续步骤
查看转换后的配置的最佳实践和建议。