1. Visão geral
Este laboratório demonstra recursos e funcionalidades projetados para simplificar o fluxo de trabalho de desenvolvimento de engenheiros de software encarregados de desenvolver aplicativos Python em um ambiente conteinerizado. O desenvolvimento típico de contêineres exige que o usuário entenda os detalhes dos contêineres e do processo de build deles. Além disso, os desenvolvedores geralmente precisam interromper o fluxo de trabalho, 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 de forma eficaz com aplicativos contêinerizados sem sair do ambiente de desenvolvimento integrado.

O que são os Cloud Workstations?
O Cloud Workstations oferece ambientes de desenvolvimento gerenciados no Google Cloud com segurança integrada e ambientes de desenvolvimento pré-configurados, mas personalizáveis. Acesse o Cloud Workstations por um ambiente de desenvolvimento integrado baseado em navegador, por vários editores de código locais (como VSCode ou ambientes de desenvolvimento integrado do JetBrains, como IntelliJ IDEA Ultimate e PyCharm Professional) ou por SSH.
O Cloud Workstations usa os seguintes recursos:
- Os administradores criam clusters de estações de trabalho
- Em cada cluster de estação de trabalho, os administradores criam uma ou mais configurações de estação de trabalho que atuam como modelos para as estações de trabalho.
- Os desenvolvedores podem criar estações de trabalho que definem ambientes de desenvolvimento com 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 disso, os desenvolvedores podem acessar ambientes com configurações consistentes e ferramentas personalizáveis.
O Cloud Workstations ajuda a mudar a segurança para a esquerda, melhorando a postura de segurança dos seus ambientes de desenvolvimento de aplicativos. Ele tem recursos de segurança, como VPC Service Controls, entrada ou saída particulares, atualização forçada de imagens e políticas de acesso do gerenciamento de identidade e acesso.
O que é o Cloud Code?
O Cloud Code oferece suporte de ambiente de desenvolvimento integrado para o ciclo de desenvolvimento completo dos aplicativos do Kubernetes e do Cloud Run, da criação e personalização de um novo aplicativo com base em modelos à execução do aplicativo finalizado. O Cloud Code também oferece suporte ao longo do tempo, com amostras prontas, snippets de configuração prontos e uma experiência de depuração personalizada, facilitando muito o desenvolvimento com o Kubernetes e o Cloud Run .
Confira alguns recursos do Cloud Code:
- Criar e executar aplicativos continuamente
- Suporte para depuração de aplicativos 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ê vai aprender métodos para desenvolver com contêineres no GCP, incluindo:
- Analisar o Cloud Workstations
- Iniciar estação de trabalho
- Analisar o Cloud Code
- Depurar no Kubernetes
2. Configuração e requisitos
Configuração de ambiente personalizada
- 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.



- 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 É possível atualizar o local 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. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- 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 desligar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou 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ódigo no GKE. Você também vai usar o Cloud Workstations como ambiente de desenvolvimento integrado.
O script de configuração abaixo prepara essa infraestrutura para você.
- Faça o download do 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
- Abra o arquivo
setup_with_cw.she edite os valores das senhas que estão definidas como CHANGEME. - Execute o script de configuração para criar um cluster do GKE que será usado neste laboratório. Essa configuração leva cerca de 20 minutos.
./setup_with_cw.sh &
- Abra o Cloud Workstations no Console do Cloud. Aguarde até que o cluster esteja no status
READYantes de prosseguir para as próximas etapas. - Se a sessão do Cloud Shell foi desconectada, clique em "Reconectar" e execute o comando da CLI gcloud para definir o ID do projeto. Substitua o ID do projeto de exemplo abaixo pelo ID do seu projeto do Qwiklabs antes de executar o comando.
gcloud config set project qwiklabs-gcp-project-id
- 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.

Verifique o status das configurações atuais.

Crie uma estação de trabalho.

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

Iniciar estação de trabalho
- Inicie e abra a estação de trabalho. A inicialização da estação de trabalho leva alguns minutos.

- Para permitir cookies de terceiros, clique no ícone na barra de endereço.


- Clique em "Site indisponível?".

- Clique em "Permitir cookies".

- Quando a estação de trabalho for iniciada, o ambiente de desenvolvimento integrado do Code OSS vai aparecer.
Clique em "Marcar como concluído" na página "Como começar" do ambiente de desenvolvimento integrado da estação de trabalho.

3. Visão geral do Cloud Code
Revise 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 com base em seu ambiente de desenvolvimento integrado. Crie e gerencie clusters diretamente no ambiente de desenvolvimento integrado.
- Depure aplicativos em execução. Depure o código nos ambientes de desenvolvimento integrados com o Cloud Code para VS Code e IntelliJ ao usar os recursos de depuração integrados desses ambientes.
- Explore as implantações. Visualize recursos subjacentes e metadados para seus clusters do Kubernetes e serviços do Cloud Run. É possível buscar uma descrição, visualizar registros, gerenciar secrets ou abrir um terminal diretamente em um pod.
- Simplifique o desenvolvimento local no Kubernetes. Nos bastidores, o Cloud Code para ambientes de desenvolvimento integrado usa ferramentas conhecidas, como Skaffold, Jib e kubectl, para oferecer feedback contínuo sobre seu código em tempo real.

Faça login no Google Cloud
- Clique no ícone do Cloud Code e selecione "Fazer login no Google Cloud":

- Clique em "Prosseguir com login".

- Confira a saída no terminal e abra o link:

- Faça login com as credenciais de estudante do Qwiklabs.

- Selecione "Permitir":

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

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

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

4. Criar um novo aplicativo inicial em Python
Nesta seção, você vai criar um novo aplicativo Python.
- Abra um novo terminal.

- Criar um 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"
- Crie um arquivo chamado
requirements.txte copie o conteúdo a seguir nele:

Flask
gunicorn
ptvsd==4.3.2
- Crie um arquivo chamado
app.pye cole o seguinte código 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')
- Crie um arquivo chamado
Dockerfilee cole o seguinte 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 mudanças de código em um app Python Flask. Esse Dockerfile permite transmitir esse valor como um argumento de build.
Gerar manifestos
No terminal, execute o comando a seguir para gerar um skaffold.yaml e um deployment.yaml padrão.
- 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:
8080para a portaypara salvar a configuração
Atualizar configurações do Skaffold
- Mudar o nome do aplicativo padrão
- Abrir
skaffold.yaml - Selecione o nome da imagem definido como
dockerfile-image. - Clique com o botão direito do mouse e escolha "Mudar todas as ocorrências".
- Digite o novo nome como
python-app - Edite ainda mais a seção de build para
- adicionar
docker.buildArgsao cartãoFLASK_DEBUG=1 - Sincronize as configurações para carregar as mudanças nos arquivos
*.pydo 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 ficaria assim:
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: "1"
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
Modificar o arquivo de configuração do Kubernetes
- Mudar o nome padrão
- Abrir arquivo
deployment.yaml - Selecione o nome da imagem definido como
dockerfile-image. - Clique com o botão direito do mouse e escolha "Mudar todas as ocorrências".
- Digite o novo nome como
python-app
5. Como percorrer o processo de desenvolvimento
Com a lógica de negócios adicionada, agora você pode implantar e testar seu aplicativo. A seção a seguir mostra o uso do plug-in do Cloud Code. Entre outras coisas, esse plug-in se integra ao skaffold para simplificar o processo de desenvolvimento. Ao implantar no GKE nas etapas a seguir, o Cloud Code e o Skaffold vão criar automaticamente a imagem do contêiner, enviá-la por push 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
- Adicionar um cluster

- Selecione Google Kubernetes Engine:

- Selecione o projeto.

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

- O cluster agora aparece na lista de clusters do Kubernetes em "Cloud Code". Navegue e explore o cluster aqui.

Implantar no Kubernetes
- No painel na parte de baixo do editor do Cloud Shell, selecione Cloud Code 

- No painel que aparece na parte de cima, selecione Executar no Kubernetes.
Se solicitado, selecione "Sim" para usar o contexto atual do Kubernetes.

Esse comando inicia um build do código-fonte e executa os testes. A criação e os testes vão levar alguns minutos para serem executados. Eles 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 sobre problemas de implantação enquanto ainda está trabalhando no ambiente de desenvolvimento.
- Na primeira vez que você executar o comando, uma solicitação vai aparecer na parte de cima da tela perguntando se você quer o contexto atual do Kubernetes. Selecione "Sim" para aceitar e usar o contexto atual.
- Em seguida, uma solicitação vai aparecer perguntando qual registro de contêiner usar. Pressione "Enter" para aceitar o valor padrão fornecido.
- Selecione a guia "Saída" no painel de baixo para conferir o progresso e as notificações. Use o menu suspenso e selecione "Kubernetes: Run/Debug".

- Selecione "Kubernetes: Run/Debug - Detailed" no menu suspenso do canal à direita para conferir mais detalhes e registros transmitidos ao vivo dos contêineres.

Quando o build e os testes forem concluídos, os registros da guia "Saída" terão o URL http://localhost:8080 listado na visualização "Kubernetes: Run/Debug".
- No terminal do Cloud Code, passe o cursor sobre o primeiro URL na saída (http://localhost:8080) e, na dica de ferramenta que aparece, selecione "Abrir visualização na Web".
- Uma nova guia do navegador será aberta e vai mostrar a mensagem:
Hello, World!
Recarga automática
- Abra o arquivo
app.py. - Mude a mensagem de saudação para
Hello from Python
Na janela Output, na visualização Kubernetes: Run/Debug, o observador 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 ...
- Se você mudar para a visualização
Kubernetes: Run/Debug - Detailed, vai notar que ela reconhece as mudanças no arquivo, 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
- Atualize a guia do navegador em que você viu os resultados anteriores para conferir os resultados atualizados.
Depuração
- Acesse a visualização de depuração e pare a linha de execução atual
. Se for solicitado, você pode liberar espaço após cada execução. 
- Clique em
Cloud Codeno menu da parte de baixo e selecioneDebug on Kubernetespara executar o aplicativo no mododebug.

- Na visualização
Kubernetes Run/Debug - Detailedda janelaOutput, observe que o Skaffold vai implantar esse aplicativo no modo de depuração.
- Na primeira vez que isso for executado, uma solicitação vai 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

A criação e a implantação do aplicativo levam alguns minutos. Se a sessão de depuração for desconectada, repita as etapas para "Depurar no Kubernetes" na seção "Sessões de desenvolvimento".
- Quando o processo for concluído. Você vai notar um depurador anexado e a guia "Saída" vai mostrar:
Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully., e o URL http://localhost:8080 vai aparecer.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- A barra de status na parte de baixo muda de azul para laranja, indicando que está no modo de depuração.

- Na visualização
Kubernetes Run/Debug, observe que um contêiner depurável é 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
- Abra o arquivo
app.py. - Localize a instrução que diz
return message. - 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 aparecer para mostrar que o ponto de interrupção foi definido.
- Recarregue 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.
- Clique na seção "VARIÁVEIS".
- Clique em "Locais" para encontrar a variável
"message". - Clique duas vezes no nome da variável "message" e, no pop-up, mude o valor para algo diferente, como
"Greetings from Python". - Clique no botão "Continuar" no painel de controle de depuração
. - Revise a resposta no navegador, que agora mostra o valor atualizado que você acabou de inserir.
- Pare o modo "Debug" pressionando o botão de parada
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 de maneira eficaz com contêineres. Em seguida, você implantou e depurou o aplicativo em um cluster do GKE remoto seguindo o mesmo fluxo de desenvolvedor encontrado em stacks de aplicativos tradicionais.
Para fazer a limpeza depois de concluir o laboratório:
- Excluir os arquivos usados no laboratório
cd ~ && rm -rf ~/music-service
- Exclua o projeto para remover toda a infraestrutura e os recursos relacionados.
—
Última atualização: 22/03/23