Implantar um site com o Cloud Run

Pode ser difícil executar sites com toda a sobrecarga de criar e gerenciar instâncias, clusters, pods, serviços de máquina virtual (VM, na sigla em inglês) e muito mais. Isso não é um problema para apps maiores e de várias camadas, mas se você quer apenas que seu site seja implantado e visível, isso pode gerar uma sobrecarga.

Com o Cloud Run, a implementação do Google Cloud do Knative, você pode gerenciar e implantar seu site sem a sobrecarga necessária para as implantações baseadas em VM ou Kubernetes. Essa é uma abordagem mais simples em termos de gerenciamento e também permite que você escalone para zero quando não há solicitações para seu site.

O Cloud Run não só oferece o desenvolvimento sem servidor aos contêineres, mas também pode ser executado nos seus próprios clusters do Google Kubernetes Engine (GKE) ou em uma solução de plataforma como serviço (PaaS) totalmente gerenciada fornecida pelo Cloud Run. Você testará o último cenário deste codelab.

O diagrama a seguir ilustra o fluxo da implantação e da hospedagem do Cloud Run. Você começará com uma imagem do Docker criada pelo Cloud Build, acionada no Cloud Shell. Em seguida, implante essa imagem no Cloud Run com um comando no Cloud Shell.

Prerequisites

O que você vai aprender

  • Como criar uma imagem do Docker com o Cloud Build e fazer upload dela para gcr.io
  • Implantar imagens do Docker no Cloud Run
  • Gerenciar implantações do Cloud Run
  • Como configurar um endpoint para um app no Cloud Run

O que você vai criar

  • Um site estático executado em um contêiner do Docker
  • Uma versão desse contêiner localizada no Container Registry
  • Uma implantação do Cloud Run para seu site estático

Pré-requisitos

  • Uma Conta do Google com acesso administrativo para criar projetos ou um projeto com papel de proprietário

Configuração de ambiente personalizada

Se você ainda não tem uma Conta do Google, é necessário criar uma. Em seguida, faça login no Console do Google Cloud e clique em Projeto > Criar projeto.

Lembre-se do ID do projeto, que é preenchido automaticamente no nome dele. O ID do projeto é um nome exclusivo em todos os projetos do Google Cloud, portanto, o nome na captura de tela já foi usado e não funcionará para você. Ele será indicado posteriormente como PROJECT_ID.

Em seguida, você precisa ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud e ativar a API Cloud Run.

Ative a API Cloud Run

Clique em Menu de navegação ☰ > APIs e serviços > Painel> Ativar APIs e serviços. .

Pesquise "Cloud Run API" e clique em API Cloud Run > Ativar.

A execução por este codelab não deve custar mais do que alguns dólares, mas pode ser mais se você decidir usar mais recursos ou se deixá-los em execução (consulte Limpeza no final). Para mais informações, consulte Preços.

Novos usuários do Google Cloud estão qualificados para um teste sem custo financeiro de US$300.

Cloud Shell

Embora o Google Cloud e o Cloud Run possam ser operados remotamente no seu laptop, você usará o Cloud Shell, um ambiente de linha de comando executado no Google Cloud. O ambiente é pré-configurado com todas as bibliotecas de cliente e frameworks necessários.

O Cloud Shell é uma máquina virtual com base em Debian que contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal permanente de 5 GB, além de ser executada no Google Cloud, o que aprimora o desempenho e a autenticação da rede. Isso significa que tudo que você precisa para este codelab é um navegador (sim, funciona em um Chromebook).

Para ativar o Google Cloud Shell, no console do desenvolvedor, clique no botão no canto superior direito (só leva alguns instantes para provisionar e se conectar ao ambiente):

activateCloudShell.png

Clique no botão "Iniciar o Cloud Shell":

Screen Shot 2017-06-14 às 10.13.43 PM.png

Depois que você se conectar ao Cloud Shell, sua autenticação já terá sido feita, e o projeto estará definido com o PROJECT_ID:

gcloud auth list

Resposta ao comando

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

O Cloud Shell também define algumas variáveis de ambiente por padrão, que podem ser úteis à medida que você executa comandos futuros.

echo $GOOGLE_CLOUD_PROJECT

Resposta ao comando

<PROJECT_ID>

Se, por algum motivo, o projeto não estiver definido, basta emitir o seguinte comando :

gcloud config set project <PROJECT_ID>

Quer encontrar seu PROJECT_ID? Confira o ID usado nas etapas de configuração ou procure no painel do console:

ID do projeto.png

IMPORTANTE: por fim, defina a zona padrão e a configuração do projeto:

gcloud config set compute/zone us-central1-f

É possível escolher uma variedade de zonas diferentes. Saiba mais na documentação "Regiões e zonas".

Como você está implantando um site, basta clonar a origem do repositório para se concentrar na criação de imagens do Docker e na implantação no Cloud Run.

Execute os seguintes comandos para clonar o repositório na sua instância do Cloud Shell e mudar para o diretório apropriado. Você também instalará as dependências do Node.js para testar o aplicativo antes da implantação.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Isso clona o repositório, altera o diretório e instala as dependências necessárias para executar o aplicativo localmente. A execução do script pode levar alguns minutos.

Investigue e teste seu app. Execute o seguinte comando para iniciar o servidor da Web:

cd ~/monolith-to-microservices/monolith
npm start

Saída:

Monolith listening on port 8080!

Para visualizar o app, clique em Visualização na Web e selecione Visualizar na porta 8080.

Isso abre uma nova janela onde você pode ver sua loja sofisticada em ação.

Você pode fechar esta janela após visualizar o site. Para interromper o processo do servidor da Web, pressione CONTROL+C (Command+C no Macintosh) na janela de terminal.

Agora que os arquivos de origem estão prontos, é hora de colocar o app no Docker.

Normalmente, é preciso usar uma abordagem de duas etapas, que envolve a criação de um contêiner do Docker e o envio dele para um registro de modo a armazenar a imagem para o GKE. No entanto, você pode facilitar a vida ao usar o Cloud Build para criar o contêiner do Docker e colocar a imagem no Container Registry com um único comando! Para ver o processo manual de criação e envio de um Dockerfile, consulte o Guia de início rápido do Container Registry.

O Cloud Build compacta os arquivos do diretório e os move para um bucket do Cloud Storage. Em seguida, o processo de compilação usa todos os arquivos do bucket e usa o Dockerfile, que está presente no mesmo diretório para executar o processo de compilação do Docker. Como você especificou a sinalização --tag com o host como gcr.io para a imagem do Docker, a imagem do Docker resultante será enviada para o Container Registry.

Primeiro verifique se a API Cloud Build está ativada. Para isso, execute o seguinte comando:

gcloud services enable cloudbuild.googleapis.com

Depois de ativar a API, execute o seguinte comando no Cloud Shell para iniciar o processo de compilação:

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

Esse processo leva alguns minutos, mas, após ser concluído, terá uma resposta semelhante a esta no terminal:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

Para ver o histórico de builds ou acompanhar o processo em tempo real, acesse o Console do Cloud e clique em Menu de navegação ☰ > Cloud Build > Histórico. Nela, é possível ver uma lista de todas as suas versões anteriores, mas só pode haver uma que você criou.

Se você clicar no ID do build, poderá ver todos os detalhes desse build, incluindo a saída do registro. Para ver a imagem de contêiner que foi criada, clique no link ao lado de Imagem.

Agora que você colocou seu site em um contêiner e o enviou para o Container Registry, é hora de implantá-lo no Cloud Run.

Há duas abordagens de implantação no Cloud Run:

  • O Cloud Run (totalmente gerenciado) é o modelo PaaS em que todo o ciclo de vida do contêiner é gerenciado. Você usará essa abordagem para este codelab.
  • O Cloud Run for Anthos é o Cloud Run com uma camada adicional de controle, que permite migrar clusters e pods do GKE. Para mais informações, consulte Como configurar o Cloud Run for Anthos no Google Cloud.

Os exemplos de linha de comando estarão no Cloud Shell usando as variáveis de ambiente que você configurou anteriormente.

Linha de comando

Execute o comando a seguir para implantar o app:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

Será solicitado que você especifique em qual região você gostaria de executar. Selecione a região mais próxima de você e aceite o nome do serviço sugerido (monolítico).

Para fins de teste, permita solicitações não autenticadas para o app. Digite y na solicitação.

Verifique a implantação

Para verificar se a implantação foi criada com sucesso, execute o seguinte comando. Pode levar alguns instantes para que o Pod status seja Running:

gcloud run services list

Selecione [1] Cloud Run (totalmente gerenciado).

Saída:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

A saída mostra várias coisas. Você pode ver a implantação e o usuário que a implantou (seu endereço de e-mail) e o URL que pode ser usado para acessar o app. Parece que tudo foi criado com sucesso.

Abra o URL fornecido na lista de serviços do navegador da Web e você verá o mesmo site que visualizou localmente.

Agora, implante seu app novamente, mas desta vez ajuste um dos parâmetros.

Por padrão, um aplicativo do Cloud Run terá um valor de simultaneidade de 80, o que significa que cada instância de contêiner atenderá a até 80 solicitações por vez. É uma grande mudança no modelo de funções como serviço (FaaS), em que uma instância processa uma solicitação por vez.

Implante novamente a mesma imagem de contêiner com um valor de simultaneidade de 1 (apenas para fins de teste) e veja o que acontece.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

Responda às perguntas seguintes, como você fez pela primeira vez. Quando o comando for concluído, consulte o Console do Cloud para ver o resultado.

No painel do Cloud Run, clique no serviço monolith para ver os detalhes.

Clique na guia Revisões. Você verá duas revisões criadas. Clique em monolith-00002 e analise os detalhes. Você verá o valor de simultaneidade reduzido a 1.

]

Essa configuração é suficiente para testes, mas, na maioria dos cenários de produção, você terá contêineres compatíveis com várias solicitações simultâneas.

Agora, restaure a simultaneidade original sem reimplantar. É possível definir o valor de simultaneidade como o padrão de 80 ou 0. Isso removerá todas as restrições de simultaneidade e definirá o valor máximo padrão, que é 80 no momento da gravação.

Execute o seguinte comando no Cloud Shell para atualizar a revisão atual:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

Observe que outra revisão foi criada, que o tráfego foi redirecionado e que a simultaneidade está de volta à 80.

Sua equipe de marketing pediu para você mudar a página inicial do site da sua empresa. Eles acham que deveriam ser mais informativos sobre o que a empresa é e vende. Nesta seção, você adicionará texto à página inicial para deixar a equipe de marketing feliz.

Parece que um dos desenvolvedores já criou as mudanças com o nome de arquivo index.js.new. Basta copiar esse arquivo em index.js para que suas alterações sejam refletidas. Siga as instruções para fazer as alterações apropriadas.

Execute os seguintes comandos, copie o arquivo atualizado no nome de arquivo correto e imprima o conteúdo para verificar as alterações:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

O código resultante será parecido com este:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

Os componentes do React foram atualizados, mas você precisa criar o app React para gerar os arquivos estáticos. Execute o comando a seguir para criar o aplicativo React e copiá-lo no diretório público monolith:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Agora que seu código está atualizado, você precisa recriar o contêiner do Docker e publicá-lo no Container Registry. Você pode usar o mesmo comando anterior, mas, desta vez, atualizará o marcador de versão.

Execute o comando para acionar o Cloud Build de novo com a imagem atualizada (versão 2.0.0):

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Na próxima seção, você usará essa imagem para atualizar seu app sem inatividade.

As alterações foram feitas, e a equipe de marketing adorou a nova versão. É hora de atualizar o site sem interromper os usuários.

O Cloud Run trata cada implantação como uma nova revisão, que é colocada on-line e, em seguida, com o tráfego redirecionado para ela.

Siga os próximos conjuntos de instruções para atualizar seu site.

Linha de comando

Na linha de comando, você pode implantar novamente o serviço para atualizar a imagem para uma nova versão com o seguinte comando:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

Verifique a implantação

Valide a atualização de implantação executando o seguinte comando:

gcloud run services describe monolith --platform managed 

A saída será semelhante ao seguinte:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

Você verá que o serviço está usando a versão mais recente da sua imagem implantada em uma nova revisão.

Para verificar as alterações, navegue até o URL externo do serviço do Cloud Run novamente e observe que o título do app foi atualizado.

Execute o seguinte comando para listar os serviços e visualizar o endereço IP se você o esqueceu:

gcloud run services list

O site exibirá o texto que você adicionou ao componente da página inicial.

Excluir imagens do Container Registry

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

Excluir artefatos do Cloud Build do Cloud Storage

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}' 

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

Excluir serviço do Cloud Run

gcloud run services delete monolith --platform managed

Você implantou, dimensionou e atualizou seu site com o Cloud Run.

Saiba mais