Experimento do Google Cloud Deploy e do Cloud Run

Neste documento, apresentamos um tutorial de experimento que coloca você à disposição com um pipeline de entrega no Google Cloud Deploy que implanta contêineres no Cloud Run. Ao final deste tutorial, você terá um pipeline de CD direcionado ao Cloud Run com dois ambientes: dev e prod. É possível implantar e promover novas imagens de contêiner usando os estágios do pipeline e acompanhar o processo no Console do Google Cloud.

Este tutorial depende de vários serviços do Google Cloud, principalmente do Config Controller e incluindo serviços pré-GA que ainda estão no pré-lançamento e não estão em geral disponíveis (API Cloud Run Admin v2). Com o Config Controller, é possível provisionar recursos de maneira declarativa usando o Modelo de recurso do Kubernetes (KRM, na sigla em inglês). O Google Cloud Deploy usa o Config Controller para criar e gerenciar serviços do Cloud Run como parte do pipeline de entrega.

Se você tiver dúvidas, encontrar bugs ou quiser enviar feedback, entre em contato pelo e-mail clouddeploy-feedback-external@google.com.

Tutorial do Cloud Shell

As instruções deste documento também estão incluídas em um tutorial fácil de seguir, baseado no Cloud Shell. Siga este tutorial ao usar este documento para orientação e contexto.

Configurar o ambiente

  1. Crie um novo projeto e defina o projeto padrão para a Google Cloud CLI.

    Recomendamos que você comece com um novo projeto.

    gcloud config set project PROJECT_ID
    

    No comando acima, substitua PROJECT_ID pelo ID do projeto real. Neste documento, o código (comandos e arquivos) contém {PROJECT_ID} como um marcador. A substituição aqui preencherá todas as instâncias deste documento, a menos que você atualize a página.

  2. Ative as APIs necessárias:

    gcloud services enable \
        krmapihosting.googleapis.com \
        clouddeploy.googleapis.com \
        compute.googleapis.com \
        run.googleapis.com
    

    Este comando ativa as seguintes APIs, que são necessárias para concluir este experimento:

    • Compute Engine
    • Controlador de configuração
    • Google Cloud Deploy
    • Cloud Build (ativado pelo Google Cloud Deploy)
    • Cloud Storage (ativado pelo Google Cloud Deploy)
    • Resource Manager
    • Cloud Run
    • Google Kubernetes Engine (ativado pelo Config Controller)
  3. Verifique se você instalou e configurou a Google Cloud CLI.

    Além disso, será necessário garantir que o kubectl esteja instalado:

    which kubectl || gcloud components install kubectl
    

    Se você estiver executando comandos do Cloud Shell, esses componentes já estão instalados.

  4. Configurar a conta de serviço padrão do Compute Engine

    Por padrão, o Google Cloud Deploy usa a conta de serviço padrão do Compute Engine. A conta de serviço já pode ter as permissões necessárias. Essa etapa é para organizações que desativam as concessões automáticas de papéis para contas de serviço padrão.

    Execute os comandos a seguir para garantir que a conta de serviço tenha as permissões adequadas:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/clouddeploy.jobRunner"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/container.developer"
    
  5. Consulte a Visão geral do Google Cloud Deploy.

    Nesta visão geral, você aprenderá sobre o serviço e os conceitos do Google Cloud Deploy.

Configurar o Config Controller

O Google Cloud Deploy usa uma instância do Config Controller para implantar os serviços e revisões do Cloud Run.

  1. Antes de criar o Config Controller, verifique se há uma rede padrão:

    gcloud compute networks list
    

    A saída bem-sucedida do Console terá esta aparência:

    NAME: default
    SUBNET_MODE: AUTO
    BGP_ROUTING_MODE: REGIONAL
    IPV4_RANGE:
    GATEWAY_IPV4:
    

    Se você don't tiver uma rede padrão, execute o seguinte comando:

    gcloud compute networks create default --subnet-mode=auto
    

    Se a saída estiver correta, não será necessário executar esse comando.

    Se tiver outros problemas, consulte o Guia de solução de problemas do Controlador de configuração ou entre em contato com o administrador da sua organização.

  2. Crie sua instância do Config Controller.

    gcloud anthos config controller create cc-deployrun --location=us-central1
    
  1. Conceda permissões do Config Controller nos projetos em que você quer implantar. O comando a seguir dá as permissões mínimas necessárias para que o controlador de configuração crie e gerencie serviços do Cloud Run no seu projeto.

    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    
    gcloud projects add-iam-policy-binding "PROJECT_ID" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/run.admin" \
        --project "PROJECT_ID"
    
    gcloud projects add-iam-policy-binding "PROJECT_ID" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/iam.serviceAccountUser" \
        --project "PROJECT_ID"
    

Criar seus arquivos de configuração

O Google Cloud Deploy usa o Skaffold para fornecer os detalhes do que será implantado e como implantá-lo corretamente nos destinos separados. Neste experimento, temos dois destinos: run-dev e run-prod.

Destinos de experimentos do Cloud Run do Google Cloud Deploy, run-dev e run-prod

Nesta seção, você cria um arquivo skaffold.yaml que identifica os manifestos do Cloud Run que implantarão seu aplicativo por meio de um pipeline de entrega do Google Cloud Deploy. Você também criará os manifestos dos serviços do Cloud Run, um para cada ambiente de destino (run-dev-service.yaml e run-prod-service.yaml, respectivamente).

  1. Crie um novo diretório para seus manifestos e navegue até ele:

    mkdir deploy-cloudrun
    cd deploy-cloudrun
    
  2. Crie o arquivo skaffold.yaml nesse diretório.

    skaffold.yaml informa ao Google Cloud Deploy quais manifestos serão implantados em cada destino no pipeline para uma determinada versão.

    apiVersion: skaffold/v2beta26
    kind: Config
    profiles:
     - name: prod
       deploy:
         kubectl:
           manifests:
             - run-prod-*.yaml
     - name: dev
       deploy:
         kubectl:
           manifests:
             - run-dev-*.yaml
    
  3. Crie o arquivo run-dev-service.yaml, no mesmo diretório.

    Este manifesto declarativo representa a versão do ambiente dev do seu serviço do Cloud Run.

    Observe as configurações personalizadas para esse ambiente, como limitar o escalonamento de contêineres a duas instâncias. Os rótulos e um nome são usados para distinguir essa versão do serviço no seu projeto. Observe que o nome da imagem é uma variável: run-container em vez de uma imagem de contêiner específica. Isso é substituído por uma imagem de contêiner específica quando você cria uma versão no Google Cloud Deploy.

    apiVersion: run.cnrm.cloud.google.com/v1beta1
    kind: RunService
    metadata:
      labels:
        cloud-deploy-target: run-dev
      name: deploytest-dev
      namespace: config-control
    spec:
      ingress: INGRESS_TRAFFIC_ALL
      location: us-central1
      projectRef:
        external: projects/PROJECT_ID
      template:
        containers:
          - env:
              - name: environment
                value: dev
            image: run-container
        scaling:
          maxInstanceCount: 2
      traffic:
        - percent: 100
          type: TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST
    
  4. Crie o arquivo run-prod-service.yaml, no mesmo diretório

    Este manifesto representa a versão prod do seu serviço do Cloud Run. Observe o nome, os rótulos e as configurações de escalonamento atualizados, bem como a reutilização de run-container.

    apiVersion: run.cnrm.cloud.google.com/v1beta1
    kind: RunService
    metadata:
      labels:
        cloud-deploy-target: run-prod
      name: deploytest-prod
      namespace: config-control
    spec:
      ingress: INGRESS_TRAFFIC_ALL
      location: us-central1
      projectRef:
        external: projects/PROJECT_ID
      template:
        containers:
          - env:
              - name: environment
                value: prod
            image: run-container
        scaling:
          maxInstanceCount: 10
      traffic:
        - percent: 100
          type: TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST
    

Criar pipelines e entregas de entrega

É possível definir o pipeline de entrega e os destinos do Google Cloud Deploy em um arquivo ou em arquivos separados. Neste tutorial, para simplificar, você criará um único arquivo.

  1. No diretório com seus manifestos criados recentemente (/deploy-cloudrun/), crie o arquivo clouddeploy.yaml:

    apiVersion: deploy.cloud.google.com/v1
    kind: DeliveryPipeline
    metadata:
     name: my-run-app-1
    description: main application pipeline
    serialPipeline:
     stages:
     - targetId: run-dev
       profiles:
       - dev
     - targetId: run-prod
       profiles:
       - prod
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
     name: run-dev
    description: Cloud Run development environment
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/krmapihost-cc-deployrun
    ---
    
    apiVersion: deploy.cloud.google.com/v1
    kind: Target
    metadata:
     name: run-prod
    description: Cloud Run production environment
    gke:
     cluster: projects/PROJECT_ID/locations/us-central1/clusters/krmapihost-cc-deployrun
    

    cloudeploy.yaml define uma sequência de progressão de dois estágios no pipeline de entrega: run-dev e run-prod. O arquivo também define destinos para cada um desses dois estágios.

    Observe que os dois destinos apontam para o mesmo Config Controller como um cluster do GKE. Esse Config Controller, compatível com um cluster do GKE subjacente criado no momento da criação do Config Controller, cria os serviços do Cloud Run para cada ambiente usando o respectivo manifesto.

    Seu cluster do GKE

  2. Registre o pipeline de entrega e os destinos com o Google Cloud Deploy:

    gcloud deploy apply --file clouddeploy.yaml --region=us-central1
    

    A saída será semelhante ao seguinte:

    Waiting for the operation on resource projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1.
    Waiting for the operation on resource projects/sample-project/locations/us-central1/targets/run-dev...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/targets/run-dev.
    Waiting for the operation on resource projects/sample-project/locations/us-central1/targets/run-prod...done.
    Created Cloud Deploy resource: projects/sample-project/locations/us-central1/targets/run-prod.
    

Crie uma versão e implante o contêiner

Com os arquivos de configuração preparados e o pipeline de entrega e os destinos registrados, agora podemos criar o recurso de lançamento que representa a imagem do contêiner a ser implantada. Usaremos um contêiner de exemplo para implantar, echoserver:

gcloud deploy releases create run-release-001 --project=PROJECT_ID --region=us-central1 --delivery-pipeline=my-run-app-1 --labels="use-case=my-cloud-run-experiment" --images=run-container="us-docker.pkg.dev/cloudrun/container/hello"

A saída será semelhante ao seguinte:

Creating temporary tarball archive of 4 file(s) totalling 2.0 KiB before compression.
Uploading tarball of [.] to [gs://sample-project_clouddeploy_us-central1/source/1643560782.447815-aed1fdf4973b4d25b9b7d09ff9fbbaa9.tgz]
Waiting for operation [operation-1643560782826-5d6cf50a08a8d-e40f7a45-ac4aa0ae]...done.
Created Cloud Deploy release run-release-001.
Creating rollout projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-dev-0001 in target run-dev...done.

Como esta é a primeira versão (implantando no primeiro destino na progressão), o Google Cloud Deploy também cria um recurso de lançamento e implanta o app no primeiro destino na progressão: run-dev. Talvez seja necessário aguardar alguns minutos até que o lançamento seja concluído (estado de lançamento: SUCCEEDED). É possível acompanhar o status do lançamento usando o seguinte comando:

gcloud deploy rollouts list --delivery-pipeline=my-run-app-1 --region=us-central1 --release run-release-001

A saída será semelhante ao seguinte:

approvalState: DOES_NOT_NEED_APPROVAL
createTime: '2022-02-10T21:25:11.228171Z'
deployEndTime: '2022-02-10T21:26:37.984888Z'
deployStartTime: '2022-02-10T21:26:09.778897390Z'
deployingBuild: projects/435050644073/locations/us-central1/builds/59f588d1-0cbc-4c46-9574-7e3f3b763ae6
enqueueTime: '2022-02-10T21:26:09.108240Z'
etag: 5f57d54f8b11d20e
name: projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-dev-0001
state: SUCCEEDED
targetId: run-dev
uid: 9cab18e1dfea4054b7d182b707c21f75

Agora que o app foi implantado no primeiro destino, podemos verificar se o serviço do Cloud Run (deploytest-dev) está sendo executado conforme o esperado:

gcloud run services list --region=us-central1

A saída será semelhante ao seguinte:


SERVICE: deploytest-dev
REGION: us-central1
URL: https://deploytest-dev-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T04:25:13.081829Z

Promover a versão

Agora que o aplicativo foi implantado no primeiro destino, run-dev, promova-o usando o seguinte comando:

gcloud deploy releases promote --release=run-release-001 --delivery-pipeline=my-run-app-1 --region=us-central1 --project=PROJECT_ID

A saída será semelhante ao seguinte:

Promoting release run-release-001 to target run-prod.

Do you want to continue (Y/n)? Y

Creating rollout projects/sample-project/locations/us-central1/deliveryPipelines/my-run-app-1/releases/run-release-001/rollouts/run-release-001-to-run-prod-0001 in target run-prod...done.

Como promover a versão no Console do Google Cloud

Após a conclusão, verifique novamente se o serviço de produção do Cloud Run está em execução:

gcloud run services list --region=us-central1

A saída será semelhante ao seguinte:


SERVICE: deploytest-dev
REGION: us-central1
URL: https://deploytest-dev-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T04:25:13.081829Z


SERVICE: deploytest-prod
REGION: us-central1
URL: https://deploytest-prod-k5kzux4u6a-uc.a.run.app
LAST DEPLOYED BY: service-435050644073@gcp-sa-yakima.iam.gserviceaccount.com
LAST DEPLOYED AT: 2022-01-30T16:04:43.468907Z

Serviços do Cloud Run

Ver resultados no console do Cloud Deploy

Para visualizar a progressão de versões pelo pipeline de entrega, abra o Console do Google Cloud Deploy e navegue até o pipeline de entrega my-run-app-1.

Progressão da versão na visualização do pipeline

Avaliar a versão

Para ver os detalhes da versão criada, clique no nome relacionado run-release-001 na tabela"Versões"na visualização de detalhes do pipeline de entrega.

Na visualização de detalhes da versão, é possível inspecionar mais recursos, como o parâmetro de imagens especificadas (contêiner) (artefatos de build) e manifestos de serviços renderizados.

Detalhes da versão

Revisar o lançamento

Cada lançamento também é listado na página "Lançamento". Clique no nome do lançamento para abrir os detalhes dele, que contêm informações detalhadas sobre os registros de lançamento e renderização.

Detalhes do lançamento

Ver o serviço no console do Cloud Run

Verifique se o serviço foi iniciado corretamente usando os registros de serviço criados no Console do Cloud Run.

Registros de serviço do Cloud Run

Exercícios com desafio

Neste ponto, você criou um pipeline de entrega de serviço do Cloud Run, promovendo um contêiner de um ambiente de desenvolvimento para um ambiente de produção. Veja a seguir uma lista de exercícios de desafio que podem ser realizados para explorar melhor os pipelines de entrega do Cloud Run no Google Cloud Deploy.

  • Adicionar uma aprovação ao pipeline de entrega para o ambiente de serviço de produção.

  • Converter um dos seus serviços atuais do Cloud Run para usar um pipeline de entrega do Google Cloud Deploy.

  • Parametrizar um manifesto de serviço do Cloud Run para dev e prod usando o Kustomize. Consulte também o tutorial do tutorial sobre perfis do Skaffold do Google Cloud Deploy.

Limpar

Ao concluir este experimento, é possível excluir o projeto ou remover os recursos do projeto para evitar cobranças na sua conta do Google Cloud por esses recursos.

  1. Exclua os serviços do Cloud Run implantados por meio do Config Controller do cluster diretamente.

    Excluir o namespace do cluster do Config Controller garante que todos os serviços do Cloud Run criados sejam excluídos.

    kubectl -n config-control delete runservice deploytest-dev
    
    kubectl -n config-control delete runservice deploytest-prod
    
  2. Exclua o Config Controller:

    gcloud anthos config controller delete cc-deployrun  --location=us-central1 --project=PROJECT_ID
    
  3. Exclua o pipeline de entrega:

    gcloud deploy delivery-pipelines delete my-run-app-1 --force --region=us-central1 --project=PROJECT_ID
    

    Isso exclui o próprio pipeline de entrega, além de todos os recursos de lançamento e lançamento que o Google Cloud Deploy criou para esse pipeline.

  4. Exclua os buckets do Cloud Storage criados pelo Google Cloud Deploy usando o Console do Cloud Storage.

    Os buckets de armazenamento podem ser identificados por convenções de nomenclatura, como [PROJECT]_clouddeploy_[region] e [region].deploy-artifacts.[project-id].appspot.com, e com o seguinte comando:

    gsutil ls | egrep "_clouddeploy_|deploy-artifacts.PROJECT_ID.appspot.com" | xargs --max-lines=1 echo gsutil gsutil -m rm -r
    

    Isso exibe os comandos a serem executados depois que você verificar a precisão da lista de buckets:

    gsutil rb gs://PROJECT_ID_clouddeploy_us-central1/
    gsutil rb gs://us-central1.deploy-artifacts.PROJECT_ID.appspot.com/