Depurar aplicativos do Kubernetes com o Cloud Code para VS Code

O Cloud Code permite depurar um aplicativo implantado em um cluster do Google Kubernetes Engine (GKE) usando o skaffold debug.

É possível depurar seu aplicativo em um cluster local (como minikube ou Docker Desktop), GKE ou qualquer outro provedor de nuvem.

Com o suporte à depuração do Cloud Code, não é necessário concluir a configuração manual, como configurar o encaminhamento de portas ou injetar argumentos de depuração específicos da linguagem. A depuração exige um aplicativo do GKE pronto para o Cloud Code que inclua um arquivo de configuração skaffold.yaml e uma configuração de inicialização cloudcode.kubernetes.

Depurar um aplicativo do GKE

Para começar a depurar seu aplicativo do GKE, siga estas etapas:

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

    Nome do projeto ativo na barra de status

  2. No menu "Escolha rápida" que aparece, selecione Depurar no Kubernetes.

  3. Se solicitado, autentique suas credenciais para executar e depurar um aplicativo localmente.

  4. Se o aplicativo não tiver a configuração skaffold.yaml ou cloudcode.kubernetes necessária, o Cloud Code ajuda você a configurar essas opções.

  5. Confirme se você quer usar o contexto do Kubernetes atual para executar o aplicativo (ou alternar para um preferido).

  6. Se você escolheu um cluster remoto como contexto, quando solicitado, escolha um registro de imagem para enviar as imagens.

    Se o projeto tiver a API Artifact Registry ativada e pelo menos um repositório do Artifact Registry, é possível navegar e selecionar um repositório existente do Artifact Registry. de dados.

    Os exemplos a seguir demonstram como especificar onde as imagens de contêiner são armazenadas para alguns registros comuns:

    Artifact Registry REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME
    Docker Hub docker.io/ACCOUNT
    Verifique se você está autenticado corretamente se estiver usando um repositório particular do Docker Hub.
    AWS Container Repository (ECR) AWS_ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/APP
    Azure Container Registry (ACR) ACR_NAME.azurecr.io/APP

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

    Para mais informações, consulte o guia de processamento de registros de imagem.

    O Cloud Code, em seguida, cria os contêineres, os envia para o registro, aplica as configurações do Kubernetes ao cluster e aguarda o lançamento.

    Após a conclusão do lançamento, o Cloud Code encaminha automaticamente todas as portas de contêiner declaradas à sua máquina e exibe os URLs na janela de saída para que seja possível procurar seu aplicativo ativo.

  7. Para cada contêiner depurável no seu aplicativo, confirme ou insira o diretório no contêiner remoto em que o programa que você quer depurar está localizado.

    Se preferir, pressione ESC para pular a depuração do contêiner.

    Comando de root remoto

    O Cloud Code anexa uma sessão de depuração para cada contêiner depurável no aplicativo.

    Agora é possível realizar as mesmas tarefas realizadas ao depurar código local, como definir pontos de interrupção e avançar o código, em um cluster ativo do Kubernetes.

    Por padrão, quando você salva uma alteração no aplicativo, o Cloud Code o implanta novamente e configura uma nova sessão de depuração. Alterne esse recurso com a sinalização watch na configuração de inicialização do seu projeto.

  8. Para inspecionar informações de pilha e variáveis, use a barra lateral de depuração (em inglês). Para interagir com a sessão, use o Console de depuração (em inglês) no depurador do painel inferior.

  9. Depois que a sessão for concluída, use os seguintes comandos do menu de contexto:

    • Abrir registros de implantação:abra os registros de aplicativo de uma implantação específica com a Análise de registros do Cloud Code.
    • Open Service URL: abra o URL do serviço do aplicativo de um serviço específico em um navegador da Web.
  10. Se você desativou o modo de observação na configuração de inicialização e quer fazer mudanças no aplicativo, recriar e reimplantar o aplicativo, no painel "Sessões de desenvolvimento", pause a ação de execução e clique em Ícone "Recriar e reimplantar" Recriar e reimplantar o aplicativo.

  11. Para encerrar a sessão de depuração, clique em Ícone de parada de depuração Stop na barra de ferramentas de depuração.

    Depois que você encerra a sessão de depuração, todos os recursos do Kubernetes implantados são excluídos do cluster.

Detalhes da configuração

O Cloud Code processa automaticamente os seguintes detalhes de configuração para todas as linguagens compatíveis:

  • Faça o encaminhamento de portas de depuração para que o depurador seja anexado.
  • Como anexar um depurador a um ou mais contêineres depuráveis no aplicativo. Se o aplicativo tiver vários contêineres depuráveis (contêineres cuja linguagem é compatível com a depuração do Cloud Code) configurados em skaffold.yaml, um depurador será anexado a cada contêiner depurável.
  • Persistência de definições de mapeamento de origem em várias sessões. É possível personalizar essas definições editando diretamente o arquivo .vscode/launch.json.

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

Node.js

Como reescrever o ponto de entrada para invocar:

node --inspect=localhost:9229

Python

Como instalar o depurador do módulo ptvsd usando um contêiner de inicialização e reescrever o ponto de entrada para invocar:

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

Go

Instalar o depurador dlv usando um contêiner de inicialização e reescrever o ponto de entrada para que a sessão de depuração iniciada seja executada somente com um servidor de depuração (no modo headless) o processo depurado no início, aceita várias conexões de clientes e escuta 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 apropriada do Java Debug Wire (JDWP) para que o agente de depuração JDWP detecte uma conexão de soquete na porta 5005 e permita que a VM comece a ser executada antes do depurador anexado:

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

Para mais detalhes sobre como depurar usando skaffold debug, consulte a documentação.

Configurar o contêiner

Para preparar o contêiner para depuração, siga as instruções referentes à linguagem que você está usando:

Node.js

  • Inicie o aplicativo Node.js com --inspect=<debugPort>, em que debugPort vem da configuração de anexação. Exemplo: CMD ["node", "--inspect=9229", "index.js"]

Python

  • Confira se o módulo ptvsd está instalado na sua máquina e no contêiner.
  • Inicie o aplicativo Python por meio do ptvsd. Corresponda a porta especificada ao campo debugPort na configuração de vinculação. Exemplo:
    CMD ["python", "-m", "ptvsd", "--port", "", "app.py"]

Go

  • Verifique se o pacote dlv está instalado na sua máquina e no contêiner Go.
  • Inicie o aplicativo Go usando dlv debug.

    A porta especificada no comando de inicialização precisa ser a mesma que o valor do atributo debugPort na configuração de anexação. Exemplo:

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

    Dica de solução de problemas: ao depurar um aplicativo em Go, ele travará e aguardará a instalação de um depurador. Anexe um depurador para iniciar o serviço.

Java

  • Verifique se a JVM está instalada na sua máquina.
  • Inicie o aplicativo Java com as opções a seguir, em que debugPort vem da configuração de anexação.

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

    Por exemplo, para iniciar o aplicativo Java no modo de depuração e fazer detecções na porta debugPort para realizar a conexão:

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

.NET Core

  • Verifique se você tem o vsdbg, o depurador de linha de comando do .NET Core da Microsoft, instalado no seu contêiner do Kubernetes.

    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

Configurar a configuração de anexação

Para anexar a um contêiner depurável, é necessário ter uma configuração de anexação do tipo cloudcode.kubernetes.

Adicionar um arquivo .vscode/launch.json

Se o projeto não tiver um arquivo launch.json na pasta .vscode, adicione um usando o painel de depuração.

  1. Para acessar o painel "Depurar", clique em Ícone de depuração Executar e depurar na barra de atividades.

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

  3. Selecione Cloud Code: Kubernetes como o ambiente.

    Como definir o Cloud Code: Kubernetes como o 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 você está usando.

    Isso cria e abre um arquivo launch.json para o projeto, além de criar uma configuração de anexação para você.

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

Adicione uma configuração de anexação ao arquivo .vscode/launch.json

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

  1. Abra o arquivo launch.json.
  2. Para invocar o Intellisense de snippet, clique em Adicionar configuração.
  3. Para adicionar uma configuração de anexação, selecione o snippet Cloud Code: anexar ao pod do Kubernetes para a linguagem que você está usando.
  4. Atualize os atributos na configuração para corresponder aos do seu projeto. Para mais informações sobre atributos de configuração, consulte Atributos de configuração.

Atributos de configuração

Atributo Descrição
debugPort A porta de depuração usada no contêiner.
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 a seguir mostra um podSelector típico:

"podSelector": { "app": <deployment-name> }
localRoot O caminho para o diretório local que contém o programa sendo depurado. O valor padrão é ${workspaceFolder}.
remoteRoot O caminho absoluto para o diretório remoto que contém o programa sendo depurado no contêiner do Kubernetes.

Anexar um depurador ao pod do Kubernetes

O Cloud Code para VS Code permite anexar um depurador a um pod do Kubernetes para Node.js, Python, Go, Java e .NET. Tudo o que você precisa é de um contêiner depurável e uma configuração de anexação do tipo cloudcode.kubernetes.

Para saber como anexar a um pod do Kubernetes difere da depuração de um aplicativo do Kubernetes, consulte Como anexar um depurador a um pod difere da depuração de um aplicativo do Kubernetes.

Para anexar um depurador ao seu pod do Kubernetes, faça o seguinte:

  1. Para acessar o painel "Depurar", clique em Ícone de depuração Executar e depurar na barra de atividades.
  2. Selecione e inicie a configuração pressionando F5.

    • localhost:${debugPort} é encaminhado para debugPort no contêiner durante a depuração.

    A sessão de depuração foi configurada. Você pode realizar as tarefas que normalmente faz ao depurar código local, como definir pontos de interrupção e percorrer o código.

  3. Para inspecionar informações de pilha e variáveis, use a barra lateral de depuração (em inglês). Para interagir com a sessão, use o Console de depuração (em inglês) no depurador do painel inferior.

  4. Para encerrar a sessão de depuração, clique em Ícone de parada de depuração Stop na barra de ferramentas de depuração.

Como anexar um depurador a um pod difere da depuração de um aplicativo do Kubernetes

Anexar a um pod do Kubernetes Depurar um aplicativo do Kubernetes
Depura um único pod do Kubernetes Depura todos os contêineres depuráveis no aplicativo.
O aplicativo precisa estar em execução no pod do Kubernetes antes da depuração. Executa o aplicativo no cluster do Kubernetes e anexa o depurador.
Usa configuração (.vscode/launch.json) do tipo cloudcode.kubernetes e solicita attach. Usa configuração (.vscode/launch.json) do tipo cloudcode.kubernetes e solicita launch.
Para mais informações, consulte Configurações de inicialização x de 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 o aplicativo. Essa configuração pode ser usada para executar ou depurar o aplicativo.
Essa configuração é específica de um idioma Essa configuração não é específica de um idioma.
Nenhum comando dedicado Comando "Debug on Kubernetes"
O modo de exibição não está disponível. Portanto, depois de fazer as alterações, reinicie o depurador manualmente. Com o modo de exibição, o Cloud Code pode reiniciar o depurador depois que você salvar as alterações.

A seguir

Receber suporte

Para enviar feedback, faça uma pergunta no Stack Overflow. Se você for um cliente do Google Cloud, poderá registrar tíquetes pelos canais de suporte padrão do Google Cloud.