Depure aplicações Kubernetes no Cloud Code para o Cloud Shell

O Cloud Code permite depurar uma aplicação implementada num cluster do Google Kubernetes Engine (GKE) através do skaffold debug.

Pode depurar a sua aplicação num cluster local (como o minikube ou o Docker Desktop), no GKE ou em qualquer outro fornecedor de nuvem.

Com o suporte de depuração do Cloud Code, não tem de concluir a configuração manual, como configurar o encaminhamento de portas ou injetar argumentos de depuração específicos do idioma. A depuração requer uma aplicação GKE pronta para o Cloud Code que inclua um skaffold.yamlficheiro de configuração e uma configuração de lançamento cloudcode.kubernetes.

Depure uma aplicação do GKE

Para começar a depurar a sua aplicação GKE, siga estes passos:

  1. Na barra de estado do Cloud Code, clique no nome do projeto ativo.

    Nome do projeto ativo na barra de estado

  2. No menu de seleção rápida apresentado, selecione Depurar no Kubernetes.

  3. Se a sua aplicação não tiver a configuração Skaffold necessária ou a cloudcode.kubernetes configuração de lançamento, o Cloud Code ajuda a configurá-las.

  4. Confirme se quer usar o contexto do Kubernetes atual para executar a app (ou mude para um contexto preferencial).

  5. Se escolheu um cluster remoto como contexto, quando lhe for pedido, escolha um registo de imagens para enviar as imagens.

    Se o seu projeto tiver a API Artifact Registry ativada e, pelo menos, um repositório do Artifact Registry, pode procurar e selecionar um repositório do Artifact Registry existente.

    Os exemplos seguintes demonstram como especificar onde as imagens de contentores são armazenadas para alguns registos comuns:

    Artifact Registry REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME
    Docker Hub docker.io/ACCOUNT
    Certifique-se de que tem autenticação adequada se estiver a usar um repositório privado do Docker Hub.

    Para gerar o nome final do repositório de imagens, o Cloud Code concatena este registo de imagens com o nome da imagem especificado nos manifestos do Kubernetes. Esta escolha é armazenada na sua cloudcode.kubernetes configuração de lançamento (encontrada em .vscode/launch.json).

    Para mais informações, consulte o guia de processamento do registo de imagens.

    O Cloud Code cria os seus contentores, envia-os para o registo, aplica as configurações do Kubernetes ao cluster e aguarda a implementação.

    Após a implementação, o Cloud Code encaminha automaticamente todas as portas de contentores declaradas para a sua máquina e apresenta os URLs na janela de saída para que possa procurar a sua aplicação em direto.

  6. Para cada contentor depurável na sua aplicação, confirme ou introduza o diretório no contentor remoto onde o programa que quer depurar está localizado.

    Em alternativa, pode premir ESC para ignorar a depuração do contentor.

    Comando de acesso root remoto

    O Cloud Code anexa uma sessão de depuração para cada contentor depurável na aplicação.

    Agora, pode realizar as mesmas tarefas que faz normalmente quando depura código local, como definir pontos de interrupção e percorrer o código passo a passo, num cluster Kubernetes em direto.

    Por predefinição, quando uma alteração à sua aplicação é guardada automaticamente, o Cloud Code volta a implementar a aplicação e configura uma nova sessão de depuração. Pode ativar/desativar esta funcionalidade com a flag watch na configuração de lançamento do seu projeto.

  7. Para inspecionar variáveis e informações de pilha, use a barra lateral de depuração. Para interagir com a sessão de depuração, use a consola de depuração no depurador do painel inferior.

  8. Após a conclusão da sessão, pode usar os seguintes comandos do menu de contexto:

    • Abrir registos de implementação: abra os registos da aplicação de uma implementação específica com o explorador de registos do Cloud Code.
    • Abrir URL do serviço: abra o URL do serviço da aplicação de um serviço específico num navegador de Internet
  9. Se tiver desativado o modo de observação na configuração de lançamento e quiser fazer alterações à aplicação, reconstruir e voltar a implementar a aplicação, no painel Sessões de desenvolvimento, pause a ação de execução e, de seguida, clique em Ícone de recompilar e voltar a implementar Reconstruir e voltar a implementar a aplicação.

  10. Para terminar a sessão de depuração, clique em Ícone de paragem de depuração Parar na barra de ferramentas de depuração.

    Depois de terminar a sessão de depuração, todos os recursos do Kubernetes implementados são eliminados do cluster.

Detalhes da configuração

O Cloud Code, com tecnologia Skaffold, processa automaticamente os seguintes detalhes de configuração para todos os idiomas suportados:

  • Encaminhamento de porta da porta de depuração para que o depurador possa ser anexado.
  • Anexar um depurador a um ou mais contentores depuráveis na sua aplicação. Se a sua aplicação tiver vários contentores depuráveis (contentores cuja linguagem é suportada pela depuração do Cloud Code) configurados no skaffold.yaml, é anexado um depurador a cada contentor depurável.
  • Manter as definições de mapeamento de origem entre sessões. Pode personalizar estas definições editando diretamente o ficheiro .vscode/launch.json.

O Cloud Code também processa os seguintes detalhes de configuração específicos do idioma:

Node.js

Reescrever o ponto de entrada para invocar:

node --inspect=localhost:9229

Python

Instalar o módulo ptvsd usando um contentor de inicialização e reescrevendo o ponto de entrada para invocar:

python -m ptvsd --host localhost --port 5678

Go

Instalar o depurador dlv usando um contentor de inicialização e reescrevendo o ponto de entrada de modo que a sessão de depuração iniciada seja executada apenas com um servidor de depuração (no modo sem interface), continua o processo depurado no início, aceita várias ligações de clientes e ouve em localhost:56268:

  dlv exec --headless --continue --accept-multiclient --listen=localhost:56268 --api-version=2, <app> --

Java

Adicionar um ambiente JAVA_TOOLS_OPTIONS com a configuração do protocolo Java Debug Wire (JDWP) adequada, de modo que o agente de depuração JDWP ouça uma ligação de socket na porta 5005 e permita que a VM comece a executar antes de o depurador ser anexado:

  jdwp=transport=dt_socket,server=y,suspend=n,address=5005,quiet=y

Para mais detalhes sobre a depuração com tecnologia Skaffold, consulte a skaffold debug documentação.

Configure o contentor

Para preparar o contentor para a depuração, siga as instruções para o idioma que está a usar:

Node.js

  • Inicie a aplicação Node.js com --inspect=<debugPort> onde debugPort vem da configuração de associação. Por exemplo: CMD ["node", "--inspect=9229", "index.js"]

Python

  • Certifique-se de que tem o módulo ptvsd instalado na sua máquina e no seu contentor.
  • Inicie a aplicação Python através do ptvsd. Faça corresponder a porta especificada ao campo debugPort na configuração de associação. Por exemplo:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]

Go

  • Certifique-se de que tem o pacote dlv instalado na sua máquina e no contentor Go.
  • Inicie a aplicação Go através de dlv debug.

    A porta especificada no comando de início deve ser igual ao valor do atributo debugPort na configuração de associação. Por exemplo:

    CMD ["dlv", "debug", "--headless", "--listen=:<debugPort>", "--log"]

    Sugestão de resolução de problemas: quando depura uma aplicação Go, a aplicação para e aguarda a anexação de um depurador. Anexe um depurador para que o serviço seja iniciado.

Java

  • Certifique-se de que a JVM está instalada na sua máquina.
  • Inicie a aplicação Java com as seguintes opções, em que debugPort vem da configuração de associação.

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=,quiet=y

    Por exemplo, para iniciar a aplicação Java no modo de depuração e ouvir na porta debugPort para ligação:

    ENTRYPOINT ["java","-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=<debugPort>,quiet=y", "-jar", "my-app-1.0.jar"]

.NET Core

  • Certifique-se de que tem o vsdbg, o depurador de linha de comandos do .NET Core da Microsoft, instalado no contentor do Kubernetes.

    Por exemplo:

    RUN apt-get update 
    && apt-get install -y --no-install-recommends unzip
    && apt-get install -y procps
    && rm -rf /var/lib/apt/lists/*
    && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /dbg/netcore/vsdbg

Configure a configuração de associação

Para anexar a um contentor depurável, tem de ter uma configuração de anexação do tipo cloudcode.kubernetes.

Adicione um ficheiro .vscode/launch.json

Se o seu projeto não tiver um ficheiro launch.json na respetiva pasta .vscode, pode adicionar um através do painel de depuração.

  1. Para navegar para o painel de depuração, clique em Ícone de depuração Depurar na barra de atividade.

  2. Selecione Adicionar configuração no menu pendente.

  3. Selecione Cloud Code: Kubernetes como ambiente.

    Configurar o Cloud Code: Kubernetes como ambiente

  4. Selecione a opção Anexar ao pod do Kubernetes.

    Selecione a opção de configuração do Kubernetes

  5. Selecione a linguagem de programação que está a usar.

    Esta ação cria e abre um ficheiro launch.json para o seu projeto e cria uma configuração de anexação para si.

  6. Atualize os atributos de configuração no ficheiro launch.json para corresponder aos do seu projeto. Para mais informações sobre os atributos de configuração, consulte o artigo Atributos de configuração.

Adicione uma configuração de associação ao ficheiro .vscode/launch.json

Para adicionar uma nova configuração de anexação a um ficheiro .vscode/launch.json existente:

  1. Abra o ficheiro launch.json.
  2. Para invocar o Intellisense do fragmento, clique em Adicionar configuração.
  3. Para adicionar uma configuração de associação, selecione o fragmento Cloud Code: Attach to Kubernetes Pod para o idioma que está a usar.
  4. Atualize os atributos na configuração para corresponder aos do seu projeto. Para mais informações sobre os atributos de configuração, consulte o artigo Atributos de configuração.

Atributos de configuração

Atributo Descrição
debugPort Porta de depuração usada no contentor.
podSelector Conjunto de pares de chave-valor usado para selecionar o pod de depuração. Para mais informações, consulte o guia sobre seletores). O exemplo seguinte mostra um podSelector típico:

"podSelector": { "app": <deployment-name> }
localRoot Caminho para o diretório local que contém o programa a ser depurado. A predefinição é ${workspaceFolder}.
remoteRoot Caminho absoluto para o diretório remoto que contém o programa a ser depurado (no contentor do Kubernetes).

Anexe um depurador ao seu pod do Kubernetes

O Cloud Code para o Cloud Shell suporta a associação de um depurador a um pod do Kubernetes para Node.js, Python, Go, Java e .NET. Só precisa de um contentor depurável e de uma configuração de associação do tipo cloudcode.kubernetes.

Para obter informações sobre a diferença entre associar-se a um pod do Kubernetes e depurar uma aplicação Kubernetes, consulte o artigo Como a associação de um depurador a um pod difere da depuração de uma aplicação Kubernetes.

Para anexar um depurador ao seu pod do Kubernetes, execute as seguintes tarefas:

  1. Para navegar para o painel de depuração, clique em Ícone de depuração Depurar na barra de atividade.
  2. Selecione e inicie a configuração premindo F5.

    • localhost:${debugPort} é encaminhado por porta para debugPort no contentor durante a depuração.

    A sessão de depuração foi configurada com êxito. Pode realizar as tarefas que normalmente faz quando depura código local, como definir pontos de interrupção e percorrer o código passo a passo.

  3. Para inspecionar variáveis e informações de pilha, use a barra lateral de depuração. Para interagir com a sessão de depuração, use a consola de depuração no depurador do painel inferior.

  4. Para terminar a sessão de depuração, clique em Ícone de paragem de depuração Parar na barra de ferramentas de depuração.

Como a associação de um depurador a um pod difere da depuração de uma aplicação Kubernetes

Anexe a um pod do Kubernetes Depure uma aplicação Kubernetes
Depura um único pod do Kubernetes. Depura todos os contentores depuráveis na aplicação.
A aplicação tem de estar em execução no pod do Kubernetes antes da depuração. Executa a aplicação no cluster do Kubernetes e anexa o depurador.
Usa a configuração (.vscode/launch.json) do tipo cloudcode.kubernetes e pede attach. Usa a configuração (.vscode/launch.json) do tipo cloudcode.kubernetes e pede launch.
Para mais informações, consulte o artigo Configurações de lançamento versus anexação.
Exemplo de configuração:
{
  "name": "Attach to Kubernetes Pod (NodeJS)",
  "type": "cloudcode.kubernetes",
  "request": "attach",
  "language": "Node",
  "debugPort": 9229,
  "podSelector": {
     "app": "hello-world"
  },
  "localRoot": "${workspaceFolder}",
  "remoteRoot": "/app"
}
Exemplo de configuração:
{
  "name": "Run/Debug on Kubernetes",
  "type": "cloudcode.kubernetes",
  "request": "launch",
  "skaffoldConfig": "${workspaceFolder}/skaffold.yaml",
  "watch": true,
  "cleanUp": true,
  "portForward": true
}
Não é possível usar esta configuração para executar a aplicação. Esta configuração pode ser usada para executar ou depurar a aplicação.
Esta configuração é específica do idioma. Esta configuração não é específica do idioma.
Nenhum comando dedicado. Comando Debug on Kubernetes.

O que se segue?