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
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.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)
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.
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"
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.
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.
Crie sua instância do Config Controller.
gcloud anthos config controller create cc-deployrun --location=us-central1
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
.
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).
Crie um novo diretório para seus manifestos e navegue até ele:
mkdir deploy-cloudrun cd deploy-cloudrun
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
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
Crie o arquivo
run-prod-service.yaml
, no mesmo diretórioEste 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 derun-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.
No diretório com seus manifestos criados recentemente (
/deploy-cloudrun/
), crie o arquivoclouddeploy.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
erun-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.
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.
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
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
.
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.
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.
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.
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
eprod
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.
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
Exclua o Config Controller:
gcloud anthos config controller delete cc-deployrun --location=us-central1 --project=PROJECT_ID
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.
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/