DM Convert를 사용하여 Deployment Manager 구성 변환

이 페이지에서는 DM Convert를 사용하여 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(Terraform용 HashiCorp 구성 언어) 또는 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: 변환의 출력 형식입니다. Terraform의 경우 TF, 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에서 관리되는 경우 필요하지 않은 Deployment Manager 특정 라벨(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

다음 단계

변환된 구성의 권장사항 및 추천을 검토합니다.