Converter as configurações do Deployment Manager com o DM Convert

Nesta página, descrevemos o processo de uso do DM Convert para converter as configurações do Deployment Manager no modelo de recursos do Kubernetes (KRM) (em inglês) ou no Terraform.

configure seu ambiente

Configurar as variáveis de ambiente

Salve as seguintes variáveis de ambiente, que são usadas no restante deste guia:

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"

Configurar suas ferramentas

Você precisa ter acesso às seguintes ferramentas:

  • gcloud

  • docker

  • kubectl

  • bq

  • jq

Se você usa o Cloud Shell para executar a conversão direta, já tem acesso a eles.

Abrir no Cloud Shell

Converter suas configurações

Em geral, você migra sua configuração do Deployment Manager para o Terraform ou o KRM da seguinte maneira:

  1. Preparar uma implantação do Deployment Manager para a conversão.

  2. converter a configuração no formato HCL (HashiCorp, para Terraform) ou formato KRM (Kubernetes Resource Model).

  3. Como usar o Terraform ou o Config Connector para aplicar a configuração convertida.

  4. Como abandonar a implantação atual do Deployment Manager.

Preparar a implantação atual

O DM Convert opera em arquivos de configuração e modelos do Deployment Manager. Ao longo do guia, esses arquivos serão criados e salvos localmente como entrada para a ferramenta DM Convert.

É possível criar um arquivo de configuração ou adquirir uma configuração de uma implantação ativa.

Converter um arquivo de configuração

Você pode usar a configuração de amostra a seguir para testar o conversor. Substitua PROJECT_ID pelo ID do projeto do Google Cloud e salve o conteúdo abaixo em um arquivo chamado 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
  • Adquirir uma configuração de uma implantação ativa

    Se você quiser adquirir e converter a configuração de uma implantação ativa, poderá recuperar a configuração expandida e salvá-la no disco executando os seguintes comandos, substituindo DEPLOYMENT_NAME pelo nome: implantação.

    # 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
    

Converter a implantação

Para converter recursos no deployment.yaml para o formato HCL ou KRM e salvá-los como saídas convertidas, execute o seguinte comando no mesmo diretório de deployment.yaml com as substituições desejadas:

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

Faça as seguintes substituições:

  • OUTPUT_FORMAT: o formato de saída da conversão. Pode ser TF para Terraform ou KRM para KRM.

  • OUTPUT_FILE: o nome do arquivo em que a saída convertida é salva.

  • (Somente Terraform) OUTPUT_IMPORT_FILE: o nome do arquivo em que os comandos de importação do Terraform são salvos. Se uma sinalização project_id for especificada, os comandos de importação serão gerados com base nessa sinalização. Se uma sinalização project_id não for especificada, os comandos de importação serão gerados com base no atributo projectId da configuração do recurso.

  • DEPLOYMENT_NAME: o nome da implantação. Isso é relevante se você estiver usando modelos na configuração do Deployment Manager e também a variável de ambiente deployment. Para mais informações, acesse Como usar uma variável de ambiente.

Conferir as conversões

# Print output file
cat OUTPUT_FILE

Aplicar a configuração convertida

Terraform

Configurar o Terraform

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

Depois de converter os recursos do Deployment Manager em Terraform, você poderá usá-lo para criar recursos implantando diretamente a configuração convertida.

Implantar a configuração convertida usando o 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

(Opcional) Importar recursos atuais

Se você estiver convertendo uma implantação atual e quiser usar o Terraform para gerenciar os recursos dele sem reimplantar, use o recurso de importação do Terraform.

Nesta seção, você usará deployment.yaml para o processo de importação.

Inicialize o Terraform:

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

Os comandos de importação são gerados e salvos em OUTPUT_IMPORT_FILE. Para revisar o conteúdo, execute o seguinte comando:

cat OUTPUT_IMPORT_FILE

Para importar os recursos para deployment.yaml, execute o seguinte comando:

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

Depois de importar os recursos para o estado do Terraform, é possível verificar se há alguma alteração entre o estado e a configuração gerada do Terraform executando o comando plan do Terraform:

terraform plan

Isso produz a seguinte saída:

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.

Aceite essa alteração no Terraform plan, já que ela remove rótulos específicos do Deployment Manager, ou seja, goog-dm, que não são necessários quando os recursos estão sendo gerenciados pelo Terraform.

Para aplicar a configuração do Terraform, execute o seguinte comando:

# Accept changes by entering yes when prompted
terraform apply

Agora todos os recursos definidos em deployment.yaml estão sob gerenciamento do Terraform.

Por exemplo, se você quiser verificar se o Terraform está de fato gerenciando os recursos convertidos, faça uma pequena alteração na configuração do Terraform modificando o prazo de validade padrão da tabela no recurso google_bigquery_dataset.bigquerydataset:

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

Depois de fazer as alterações, aplique a configuração do Terraform e use a interface de linha de comando (CLI) bq para verificar as alterações:

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

A saída recebida precisa corresponder aos valores fornecidos na configuração atualizada do Terraform, confirmando que agora o Terraform está gerenciando esses recursos.

KRM

Configurar o Config Connector

Para ativar os recursos nos arquivos de configuração do KRM, você precisa de um cluster do Kubernetes com o Config Connector instalado. Para criar um cluster de teste, consulte Como instalar com o complemento do GKE.

No Cloud Shell, verifique se as credenciais kubectl estão configuradas para o cluster do GKE que você quer usar. Substitua GKE_CLUSTER pelo nome do cluster e execute o seguinte comando:

gcloud container clusters get-credentials GKE_CLUSTER

Implante sua configuração de KRM convertida usando kubectl.

Para implantar a configuração de KRM convertida usando kubectl, execute os seguintes comandos:

# 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

Limpar

Limpar o conjunto de dados e a tabela de amostra

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

Para limpar o conjunto de dados e a tabela do BigQuery da configuração de amostra, execute:

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

Abandonar a amostra de implantação do Deployment Manager

Para abandonar uma implantação ativa que você converteu para KRM ou Terraform, execute:

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

Recursos compatíveis para conversão

Terraform

Para listar os recursos compatíveis com o Terraform, execute o seguinte comando:

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

Para listar os recursos compatíveis com o KRM, execute o seguinte comando:

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

Próximas etapas

Consulte as práticas recomendadas e recomendações para a configuração convertida.