Ambiente de desenvolvimento

1. Visão geral

Este laboratório mostra recursos desenvolvidos para simplificar o fluxo de trabalho dos engenheiros de software responsáveis por desenvolver aplicativos Python em um ambiente conteinerizado. O desenvolvimento de contêineres típico exige que o usuário entenda os detalhes dos contêineres e do processo de criação do contêiner. Além disso, os desenvolvedores geralmente precisam interromper o fluxo, saindo do ambiente de desenvolvimento integrado para testar e depurar os aplicativos em ambientes remotos. Com as ferramentas e tecnologias mencionadas neste tutorial, os desenvolvedores podem trabalhar efetivamente com aplicativos conteinerizados sem sair do ambiente de desenvolvimento integrado.

58a4cdd3ed7a123a.png

O que é o Cloud Workstations?

O Cloud Workstations oferece ambientes de desenvolvimento gerenciados no Google Cloud com segurança integrada e ambientes de desenvolvimento pré-configurados e personalizáveis. Acesse o Cloud Workstations em um ambiente de desenvolvimento integrado baseado em navegador, em vários editores de código locais (como VSCode ou JetBrains IDEs, como IntelliJ IDEA Ultimate e PyCharm Professional) ou por SSH.

O Cloud Workstations usa os seguintes recursos:

  • Os administradores criam clusters de estação de trabalho.
  • Em cada cluster de estações de trabalho, os administradores criam uma ou mais configurações de estações de trabalho que funcionam como modelos para elas.
  • Os desenvolvedores podem criar estações de trabalho que definem ambientes de desenvolvimento, fornecendo um ambiente de desenvolvimento integrado do Cloud, ferramentas de linguagem, bibliotecas e muito mais.

Com o Cloud Workstations, os administradores de TI e segurança podem provisionar, escalonar, gerenciar e proteger facilmente os ambientes de desenvolvimento, além de permitir que os desenvolvedores acessem esses ambientes com configurações consistentes e ferramentas personalizáveis.

O Cloud Workstations melhora a postura de segurança dos seus ambientes de desenvolvimento de aplicativos e ajuda a mudar a segurança para a esquerda. Ele tem recursos de segurança, como VPC Service Controls, entrada ou saída particular, atualização forçada de imagem e políticas de acesso do Identity and Access Management.

O que é o Cloud Code?

O Cloud Code oferece suporte ao ambiente de desenvolvimento integrado em todo o ciclo de desenvolvimento de aplicativos do Kubernetes e do Cloud Run, desde a criação e personalização de um novo aplicativo a partir de modelos de amostra até a execução do seu aplicativo finalizado. O Cloud Code ajuda você ao longo do caminho com amostras prontas para execução, snippets de configuração prontos para uso e uma experiência de depuração personalizada. Isso facilita muito o desenvolvimento com o Kubernetes e o Cloud Run.

Veja alguns recursos do Cloud Code:

  • Crie e execute aplicativos continuamente
  • Suporte para depuração do aplicativo do Kubernetes em desenvolvimento
  • Streaming e visualização de registros

Saiba mais sobre outros recursos do Cloud Code.

O que você vai aprender

Neste laboratório, você aprenderá métodos para desenvolver com contêineres no GCP, incluindo:

  • Revisar o Cloud Workstations
  • Iniciar estação de trabalho
  • Revisar o Cloud Code
  • Depurar no Kubernetes

2. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google Você pode atualizar a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser mudado após a definição. O console do Cloud gera automaticamente uma string exclusiva. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, poderá gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Configuração do ambiente

No Cloud Shell, defina o ID e o número do projeto. Salve-as como variáveis PROJECT_ID e PROJECT_ID.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

Neste laboratório, você vai implantar códigos no GKE. Você também vai usar estações de trabalho do Cloud como o ambiente de desenvolvimento integrado.

O script de configuração abaixo prepara essa infraestrutura para você.

  1. Baixe o script de configuração e torne-o executável.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
  1. Abra o arquivo setup_with_cw.sh e edite os valores das senhas que estão definidos como CHANGEME no momento
  2. Execute o script de configuração para criar um cluster do GKE que você vai usar neste laboratório. Essa configuração leva cerca de 20 minutos.
./setup_with_cw.sh &
  1. Abra o Cloud Workstations no Console do Cloud. Aguarde o cluster estar no status READY antes de prosseguir para as próximas etapas.
  2. Se a sessão do Cloud Shell tiver sido desconectada, clique em "Reconectar". e execute o comando gcloud cli para definir o ID do projeto. Substitua o ID do projeto de exemplo abaixo pelo ID do projeto do Qwiklabs antes de executar o comando.
gcloud config set project qwiklabs-gcp-project-id
  1. Faça o download e execute o script abaixo no terminal para criar a configuração do Cloud Workstations.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh

Cluster e configuração do Cloud Workstations

Abra o Cloud Workstations no Console do Cloud. Verifique se o cluster está no status READY.

305e1a3d63ac7ff6.png

Verificar o status das configurações atuais.

2e23c2e9983d1ccf.png

Crie uma nova estação de trabalho.

a53adeeac81a78c8.png

Mude o nome para my-workstation e selecione a configuração atual: codeoss-python.

f052cd47701ec774.png

Iniciar estação de trabalho

  1. Inicie e inicie a estação de trabalho. A estação de trabalho vai levar alguns instantes para ser iniciada.

682f8a307032cba3.png

  1. Clique no ícone na barra de endereço para permitir cookies de terceiros. 1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

  1. Clique em "O site não está funcionando?".

36a84c0e2e3b85b.png

  1. Clique em "Permitir cookies".

2259694328628fba.png

  1. Depois que a estação de trabalho for iniciada, o ambiente de desenvolvimento integrado Code OSS vai aparecer.

Clique em "Marcar como concluído" na página "Primeiros passos" um, o ambiente de desenvolvimento integrado da estação de trabalho

94874fba9b74cc22.png

3. Visão geral do Cloud Code

Analisar as diferentes seções disponíveis no Cloud Code.

  • Desenvolvimento do Kubernetes. Tenha acesso a um ambiente totalmente integrado de desenvolvimento e depuração do Kubernetes no seu ambiente de desenvolvimento integrado. Crie e gerencie clusters diretamente do ambiente de desenvolvimento integrado.
  • Depure aplicativos em execução. Depure o código nos ambientes de desenvolvimento integrado usando o Cloud Code para VS Code e IntelliJ ao usar os recursos integrados de depuração desses ambientes.
  • Conheça as implantações. Visualize recursos subjacentes e metadados para seus clusters do Kubernetes e serviços do Cloud Run. Busque uma descrição, veja registros, gerencie secrets ou insira um terminal diretamente em um pod.
  • Simplifique o desenvolvimento local do Kubernetes. Internamente, o Cloud Code para ambientes de desenvolvimento integrado usa ferramentas conhecidas, como Skaffold, Jib e kubectl, para fornecer feedback contínuo sobre o código em tempo real.

e4e89eea9ff45dff.png

Faça login no Google Cloud

  1. Clique no ícone do Cloud Code e selecione "Fazer login no Google Cloud":

1769afd39be372ff.png

  1. Clique em "Continuar para fazer login".

923bb1c8f63160f9.png

  1. Confira a resposta no terminal e abra o link:

517fdd579c34aa21.png

  1. Faça login com suas credenciais de estudante do Qwiklabs.

db99b345f7a8e72c.png

  1. Selecione "Permitir":

a5376553c430ac84.png

  1. Copie o código de verificação e volte à guia "Estação de trabalho".

6719421277b92eac.png

  1. Cole o código de verificação e pressione Enter.

e9847cfe3fa8a2ce.png

Clique no botão "Permitir" se essa mensagem aparecer para você copiar e colar na estação de trabalho.

58149777e5cc350a.png

4. Criar um novo aplicativo inicial do Python

Nesta seção, você vai criar um novo aplicativo Python.

  1. Abra um novo Terminal.

c31d48f2e4938c38.png

  1. Criar um novo diretório e abri-lo como um espaço de trabalho
mkdir music-service && cd music-service

code-oss-cloud-workstations -r --folder-uri="$PWD"
  1. Crie um arquivo chamado requirements.txt e copie o conteúdo abaixo para ele.

789e8389170bd900.png

Flask
gunicorn
ptvsd==4.3.2
  1. Crie um arquivo chamado app.py e cole o código a seguir nele
import os
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/")
def hello_world():
    message="Hello, World!"
    return message

if __name__ == '__main__':
    server_port = os.environ.get('PORT', '8080')
    app.run(debug=False, port=server_port, host='0.0.0.0')

  1. Crie um arquivo chamado Dockerfile e cole o código a seguir nele
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]

Observação: FLASK_DEBUG=1 permite recarregar automaticamente as alterações de código em um aplicativo flask do Python. Este Dockerfile permite que você transmita esse valor como um argumento de compilação.

Gerar manifestos

No seu terminal, execute o seguinte comando para gerar skaffold.yaml e deployment.yaml padrão

  1. Inicialize o Skaffold com o seguinte comando
skaffold init --generate-manifests

Quando solicitado, use as setas para mover o cursor e a barra de espaço para selecionar as opções.

Opções disponíveis:

  • 8080 para a porta
  • y para salvar a configuração.

Atualizar configurações do Skaffold

  • Alterar o nome padrão do aplicativo
  • Abrir skaffold.yaml
  • Selecione o nome da imagem definido atualmente como dockerfile-image
  • Clique com o botão direito do mouse e escolha "Alterar todas as ocorrências"
  • Digite o novo nome como python-app
  • Edite mais a seção de criação para
  • adicione docker.buildArgs para transmitir FLASK_DEBUG=1
  • Sincronize as configurações para carregar qualquer mudança em arquivos *.py do ambiente de desenvolvimento integrado para o contêiner em execução.

Após as edições, a seção de build no arquivo skaffold.yaml ficará assim:

build:
 artifacts:
 - image: python-app
   docker:
     buildArgs:
       FLASK_DEBUG: "1"
     dockerfile: Dockerfile
   sync:
     infer:
     - '**/*.py'

Modificar o arquivo de configuração do Kubernetes

  1. Alterar o nome padrão
  • Abrir arquivo deployment.yaml
  • Selecione o nome da imagem definido atualmente como dockerfile-image
  • Clique com o botão direito do mouse e escolha "Alterar todas as ocorrências"
  • Digite o novo nome como python-app

5. Orientações sobre o processo de desenvolvimento

Com a lógica de negócios adicionada, agora é possível implantar e testar seu aplicativo. A seção a seguir mostra o uso do plug-in Cloud Code. Entre outras coisas, este plug-in se integra ao skaffold para otimizar seu processo de desenvolvimento. Quando você implantar no GKE nas etapas a seguir, o Cloud Code e o Skaffold vão criar automaticamente sua imagem de contêiner, enviá-la para um Container Registry e implantar o aplicativo your no GKE. Isso acontece nos bastidores abstraindo os detalhes do fluxo do desenvolvedor.

Adicionar cluster do Kubernetes

  1. Adicionar um cluster

62a3b97bdbb427e5.png

  1. Selecione o Google Kubernetes Engine:

9577de423568bbaa.png

  1. Selecione o projeto.

c5202fcbeebcd41c.png

  1. Selecione "python-cluster" que foi criado na configuração inicial.

719c2fc0a7f9e84f.png

  1. O cluster agora aparece na lista de clusters do Kubernetes, em Cloud Code. Navegue e analise o cluster daqui.

7e5f50662d4eea3c.png

Implantar no Kubernetes

  1. No painel da parte de baixo do Editor do Cloud Shell, selecione Cloud Code Envio

d99a88992e15fea9.png

  1. No painel exibido na parte superior, selecione Executar no Kubernetes.

Se solicitado, selecione Sim para usar o contexto atual do Kubernetes.

bfd65e9df6d4a6cb.png

Esse comando inicia um build do código-fonte e executa os testes. O build e os testes levarão alguns minutos para serem executados. Esses testes incluem testes de unidade e uma etapa de validação que verifica as regras definidas para o ambiente de implantação. Essa etapa de validação já está configurada e garante que você receba avisos de problemas de implantação mesmo enquanto estiver trabalhando no ambiente de desenvolvimento.

  1. Na primeira vez que você executar o comando, um prompt vai aparecer na parte de cima da tela perguntando se você quer o contexto atual do Kubernetes. Selecione "Yes" para aceitar e usar o contexto atual.
  2. Em seguida, será exibido um prompt perguntando qual registro de contêiner usar. Pressione "Enter" para aceitar o valor padrão fornecido
  3. Selecione a "Saída" no painel inferior para visualizar o progresso e as notificações. Usando o menu suspenso, selecione "Kubernetes: Run/Debug".

9c87ccbf5d06f50a.png

  1. Selecione "Kubernetes: Run/Debug - Detalhado". no menu suspenso do canal à direita, é possível ver mais detalhes e os registros das transmissões ao vivo dos contêineres.

804abc8833ffd571.png

Quando o build e os testes forem concluídos, os registros da guia "Output" vão mostrar o URL http://localhost:8080 na seção "Kubernetes: Run/Debug" visualização.

  1. No terminal do Cloud Code, passe o cursor sobre o primeiro URL na saída (http://localhost:8080) e, na dica de ferramenta exibida, selecione "Abrir visualização na Web".
  2. Uma nova guia do navegador vai ser aberta e vai mostrar a mensagem: Hello, World!

Fazer recarga automática

  1. Abra o arquivo app.py.
  2. Alterar a mensagem de saudação para Hello from Python

Na janela Output, na visualização Kubernetes: Run/Debug, o inspetor sincroniza os arquivos atualizados com o contêiner no Kubernetes.

Update initiated
Build started for artifact python-app
Build completed for artifact python-app

Deploy started
Deploy completed

Status check started
Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress
Resource deployment/python-app status updated to In Progress
Resource deployment/python-app status completed successfully
Status check succeeded
...
  1. Se você mudar para a visualização Kubernetes: Run/Debug - Detailed, vai perceber que ela reconhece mudanças no arquivo e depois cria e reimplanta o app.
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
  1. Atualize a guia do navegador onde os resultados anteriores eram exibidos para exibir os resultados atualizados.

Depuração

  1. Acesse a Visualização de depuração e interrompa a linha de execução atual 647213126d7a4c7b.png. Se for necessário, faça a limpeza após cada execução.
  2. 70d6bd947d04d1e6.png
  3. Clique em Cloud Code no menu da parte de baixo e selecione Debug on Kubernetes para executar o aplicativo no modo debug.

b9465c6825caf685.png

  • Na visualização Kubernetes Run/Debug - Detailed da janela Output, observe que o skaffold vai implantar esse aplicativo no modo de depuração.
  1. Na primeira vez que isso for executado, um prompt perguntará onde a origem está dentro do contêiner. Esse valor está relacionado aos diretórios no Dockerfile.

Pressione Enter para aceitar o padrão

fccc866f32b5ed86.png

Levará alguns minutos para o aplicativo ser criado e implantado. Se a sessão de depuração estiver desconectada, execute novamente as etapas para "Depurar no Kubernetes". das "Sessões de desenvolvimento" nesta seção.

  1. Quando o processo é concluído. Você notará um depurador anexado, a guia Output (Saída) mostra: Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully. e o URL http://localhost:8080 está listado.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
  1. A barra de status inferior muda de azul para laranja, indicando que está no modo de depuração.

b2abd61a129ed76.png

  1. Na visualização Kubernetes Run/Debug, observe que um contêiner depurável foi iniciado.
**************URLs*****************
Forwarded URL from service python-app: http://localhost:8080
Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default)
Update succeeded
***********************************

Usar pontos de interrupção

  1. Abra o arquivo app.py.
  2. Localize a instrução que diz return message
  3. Adicione um ponto de interrupção a essa linha clicando no espaço em branco à esquerda do número da linha. Um indicador vermelho vai indicar que o ponto de interrupção está definido
  4. Atualize o navegador e observe que o depurador interrompe o processo no ponto de interrupção e permite investigar as variáveis e o estado do aplicativo que está sendo executado remotamente no GKE
  5. Clique para baixo na seção "VARIÁVEIS".
  6. Clique em "Locais" e encontre a variável "message".
  7. Clique duas vezes no nome da variável "message" No pop-up, mude o valor para algo diferente, como "Greetings from Python".
  8. Clique no botão "Continuar" no painel de controle de depuração 607c33934f8d6b39.png.
  9. Revise a resposta no navegador, que agora mostra o valor atualizado que você inseriu.
  10. Parar a "Depuração" pressionando o botão de parada 647213126d7a4c7b.png e remova o ponto de interrupção clicando nele novamente.

6. Limpeza

Parabéns! Neste laboratório, você criou um novo aplicativo Python do zero e o configurou para funcionar efetivamente com contêineres. Em seguida, você implantou e depurou seu aplicativo em um cluster remoto do GKE seguindo o mesmo fluxo de desenvolvedor encontrado nas pilhas de aplicativos tradicionais.

Para fazer a limpeza após a conclusão do laboratório:

  1. Exclua os arquivos usados no laboratório
cd ~ && rm -rf ~/music-service
  1. Exclua o projeto para remover toda a infraestrutura e os recursos relacionados

Última atualização: 22/03/2023