Ferramentas para desenvolvedores de aplicações em execução no Kubernetes

Ferramentas para desenvolvedores de aplicações em execução no Kubernetes

Uma abordagem moderna às operações resolve muitos problemas urgentes de negócios. Contêineres e orquestradores facilitam o dimensionamento de projetos de qualquer complexidade, simplificam o lançamento de novas versões, tornam-nos mais confiáveis, mas ao mesmo tempo criam problemas adicionais para os desenvolvedores. O programador, antes de tudo, se preocupa com seu código: arquitetura, qualidade, desempenho, elegância - e não como ele funcionará no Kubernetes e como testá-lo e depurá-lo depois de fazer alterações mínimas. Portanto, também é bastante natural que ferramentas para Kubernetes estejam sendo desenvolvidas ativamente, ajudando a resolver os problemas até dos desenvolvedores mais “arcaicos” e permitindo que eles se concentrem no principal.

Esta revisão fornece breves informações sobre algumas das ferramentas que facilitam a vida de um programador cujo código é executado no pod'ax de um cluster Kubernetes.

Ajudantes simples

Depuração Kubectl

  • A linha inferior: adicione seu contêiner a um pod e veja o que acontece nele.
  • GitHub.
  • Breves estatísticas do GH: 715 estrelas, 54 commits, 9 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Este plugin para kubectl permite criar um contêiner adicional dentro do pod de interesse, que compartilhará o namespace do processo com outros contêineres. Nele você pode depurar o funcionamento do pod: verificar a rede, ouvir o tráfego da rede, fazer um rastreamento do processo de interesse, etc.

Você também pode mudar para o contêiner do processo executando chroot /proc/PID/root - isso pode ser muito conveniente quando você precisa obter um shell root em um contêiner para o qual ele está definido no manifesto securityContext.runAs.

A ferramenta é simples e eficaz, por isso pode ser útil para todos os desenvolvedores. Escrevemos mais sobre isso em artigo separado.

Telepresença

  • A linha inferior: transfira o aplicativo para o seu computador. Desenvolva e depure localmente.
  • site; GitHub.
  • Breves estatísticas de GH: 2131 estrelas, 2712 commits, 33 colaboradores.
  • Linguagem: Python.
  • Licença: Licença Apache 2.0.

A ideia desse snap-in é iniciar um contêiner com o aplicativo no computador do usuário local e fazer proxy de todo o tráfego do cluster para ele e vice-versa. Essa abordagem permite que você desenvolva localmente simplesmente editando arquivos em seu IDE favorito: os resultados estarão disponíveis imediatamente.

As vantagens de rodar localmente são a comodidade das edições e resultados instantâneos, a capacidade de depurar o aplicativo da maneira usual. A desvantagem é que ele exige velocidade de conexão, o que é especialmente perceptível quando você precisa trabalhar com um aplicativo com RPS e tráfego bastante altos. Além disso, a Telepresença apresenta problemas com montagens de volume no Windows, o que pode ser uma limitação decisiva para desenvolvedores acostumados com este SO.

Já compartilhamos nossa experiência de uso de Telepresença aqui.

Ksync

  • A linha inferior: sincronização quase instantânea de código com o contêiner no cluster.
  • GitHub.
  • Breves estatísticas do GH: 555 estrelas, 362 commits, 11 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

O utilitário permite sincronizar o conteúdo de um diretório local com o diretório de um contêiner em execução no cluster. Essa ferramenta é perfeita para desenvolvedores de linguagens de programação de script, cujo principal problema é entregar código a um contêiner em execução. O Ksync foi projetado para aliviar essa dor de cabeça.

Quando inicializado uma vez pelo comando ksync init um DaemonSet é criado no cluster, que é usado para monitorar o estado do sistema de arquivos do contêiner selecionado. Em seu computador local, o desenvolvedor executa o comando ksync watch, que monitora configurações e executa syncthing, que sincroniza diretamente os arquivos com o cluster.

Tudo o que resta é instruir o ksync sobre o que sincronizar com o quê. Por exemplo, este comando:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

...criará um observador chamado myprojectque irá procurar um pod com um rótulo app=backend e tente sincronizar o diretório local /home/user/myproject/ com catálogo /var/www/myproject/ no contêiner chamado php.

Problemas e notas sobre o ksync da nossa experiência:

  • Deve ser usado em nós de cluster Kubernetes overlay2 como driver de armazenamento para Docker. O utilitário não funcionará com nenhum outro.
  • Ao usar o Windows como sistema operacional cliente, o observador do sistema de arquivos pode não funcionar corretamente. Esse bug foi percebido ao trabalhar com diretórios grandes - com um grande número de arquivos e diretórios aninhados. Nós criamos questão relevante no projeto de sincronização, mas ainda não há progresso (desde o início de julho).
  • Usar arquivo .stignore para especificar caminhos ou padrões de arquivos que não precisam ser sincronizados (por exemplo, diretórios app/cache и .git).
  • Por padrão, o ksync irá reiniciar o contêiner sempre que os arquivos forem alterados. Para Node.js isso é conveniente, mas para PHP é completamente desnecessário. É melhor desligar o opcache e usar o sinalizador --reload=false.
  • A configuração sempre pode ser corrigida em $HOME/.ksync/ksync.yaml.

abóbora

  • A linha inferior: depurar processos diretamente no cluster.
  • GitHub.
  • Breves estatísticas do GH: 1154 estrelas, 279 commits, 23 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Esta ferramenta foi projetada para depurar processos diretamente em pods. O utilitário é simples e interativo permite que você selecione o depurador desejado (veja abaixo) e namespace + pod, no processo em que você precisa intervir. Atualmente suportado:

  • mergulhar - para aplicativos Go;
  • GDB - via destino remoto + encaminhamento de porta;
  • Encaminhamento de porta JDWP para depuração de aplicativos Java.

Do lado do IDE, o suporte está disponível apenas no VScode (usando extensões), no entanto, os planos para o ano atual (2019) incluem Eclipse e Intellij.

Para depurar processos, o Squash executa um contêiner privilegiado nos nós do cluster, portanto, você deve primeiro se familiarizar com os recursos modo de segurança para evitar problemas de segurança.

Soluções completas

Vamos passar para a artilharia pesada - mais projetos de “grande escala” projetados para atender imediatamente a muitas das necessidades dos desenvolvedores.

NB: Nesta lista, é claro, há um lugar para nosso utilitário Open Source bem (anteriormente conhecido como dapp). Porém, já escrevemos e falamos sobre isso mais de uma vez e por isso decidimos não incluí-lo na revisão. Para quem deseja se familiarizar mais com suas capacidades, recomendamos a leitura/escuta do relatório “werf é nossa ferramenta para CI/CD no Kubernetes".

DevSpace

  • A linha inferior: para quem quer começar a trabalhar no Kubernetes, mas não quer se aprofundar em sua selva.
  • GitHub.
  • Breves estatísticas do GH: 630 estrelas, 1912 commits, 13 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Solução da empresa de mesmo nome, que fornece clusters gerenciados com Kubernetes para desenvolvimento de equipes. O utilitário foi criado para clusters comerciais, mas funciona muito bem com qualquer outro.

Ao executar o comando devspace init no catálogo do projeto você será oferecido (interativamente):

  • selecione um cluster Kubernetes funcional,
  • usar existente Dockerfile (ou gerar um novo) para criar um contêiner baseado nele,
  • selecione um repositório para armazenar imagens de contêiner, etc.

Após todas essas etapas preparatórias, você pode iniciar o desenvolvimento executando o comando devspace dev. Ele construirá o contêiner, fará upload dele para o repositório, implementará a implantação no cluster e iniciará o encaminhamento de porta e a sincronização do contêiner com o diretório local.

Opcionalmente, você será solicitado a mover o terminal para o contêiner. Você não deve recusar, porque na realidade o contêiner inicia com o comando sleep e, para testes reais, o aplicativo precisa ser iniciado manualmente.

Finalmente, a equipe devspace deploy implementa o aplicativo e a infraestrutura associada no cluster, após o qual tudo começa a funcionar em modo de combate.

Toda a configuração do projeto é armazenada em um arquivo devspace.yaml. Além das configurações do ambiente de desenvolvimento, você também pode encontrar uma descrição da infraestrutura nele, semelhante aos manifestos padrão do Kubernetes, só que bastante simplificada.

Ferramentas para desenvolvedores de aplicações em execução no Kubernetes
Arquitetura e principais etapas de trabalho com DevSpace

Além disso, é fácil adicionar um componente predefinido (por exemplo, um DBMS MySQL) ou um gráfico Helm ao projeto. Leia mais em documentação - não é complicado.

Andaime

  • site; GitHub.
  • Breves estatísticas de GH: 7423 estrelas, 4173 commits, 136 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Este utilitário do Google afirma cobrir todas as necessidades de um desenvolvedor cujo código será executado de alguma forma em um cluster Kubernetes. Começar a usá-lo não é tão fácil quanto o devspace: sem interatividade, detecção de idioma e criação automática Dockerfile eles não vão oferecer isso a você aqui.

No entanto, se isso não te assusta, aqui está o que o Skaffold permite que você faça:

  • Rastreie alterações no código-fonte.
  • Sincronize-o com o contêiner de pod se não exigir montagem.
  • Colete contêineres com código, se a linguagem for interpretada, ou compile artefatos e empacote-os em contêineres.
  • As imagens resultantes são verificadas automaticamente usando teste de estrutura de contêiner.
  • Marcação e upload de imagens para o Docker Registry.
  • Implante um aplicativo em um cluster usando kubectl, Helm ou kustomize.
  • Execute o encaminhamento de porta.
  • Depure aplicativos escritos em Java, Node.js, Python.

O fluxo de trabalho em diversas variações é descrito declarativamente no arquivo skaffold.yaml. Para um projeto, você também pode definir vários perfis nos quais pode alterar parcial ou totalmente as etapas de montagem e implantação. Por exemplo, para desenvolvimento, especifique uma imagem base conveniente para o desenvolvedor, e para teste e produção - uma imagem mínima (+ uso securityContext contêineres ou redefinir o cluster no qual o aplicativo será implantado).

Os contêineres Docker podem ser construídos local ou remotamente: em Compilação do Google Cloud ou em um cluster usando Kaniko. Bazel e Jib Maven/Gradle também são suportados. Para marcação, o Skaffold suporta muitas estratégias: por git commit hash, data/hora, soma sha256 de fontes, etc.

Separadamente, vale destacar a possibilidade de testar containers. A já mencionada estrutura de teste de estrutura de contêiner oferece os seguintes métodos de verificação:

  • Execução de comandos no contexto de um contêiner com rastreamento de status de saída e verificação da saída de texto do comando.
  • Verificando a presença de arquivos no contêiner e correspondendo aos atributos especificados.
  • Controle do conteúdo do arquivo usando expressões regulares.
  • Verificação de metadados de imagem (ENV, ENTRYPOINT, VOLUMES etc.)
  • Verificando a compatibilidade da licença.

A sincronização de arquivos com o contêiner não é realizada da maneira ideal: o Skaffold simplesmente cria um arquivo com as fontes, copia-o e descompacta-o no contêiner (o tar deve estar instalado). Portanto, se sua tarefa principal é a sincronização de código, é melhor procurar uma solução especializada (ksync).

Ferramentas para desenvolvedores de aplicações em execução no Kubernetes
Principais etapas da operação do Skaffold

Em geral, a ferramenta não permite abstrair manifestos do Kubernetes e não possui interatividade, por isso pode parecer difícil de dominar. Mas esta é também a sua vantagem - maior liberdade de ação.

Garden

  • site; GitHub.
  • Breves estatísticas do GH: 1063 estrelas, 1927 commits, 17 colaboradores.
  • Linguagem: TypeScript (está previsto dividir o projeto em vários componentes, alguns dos quais estarão em Go, e também fazer um SDK para criação de add-ons em TypeScript/JavaScript e Go).
  • Licença: Licença Apache 2.0.

Assim como o Skaffold, o Garden visa automatizar os processos de entrega do código do aplicativo ao cluster K8s. Para fazer isso, primeiro você precisa descrever a estrutura do projeto em um arquivo YAML e, em seguida, executar o comando garden dev. Ela fará toda a mágica:

  • Colete contêineres com diversas partes do projeto.
  • Conduz integração e testes unitários, se algum tiver sido descrito.
  • Distribui todos os componentes do projeto no cluster.
  • Se o código-fonte for alterado, todo o pipeline será reiniciado.

O foco principal do uso desta ferramenta é compartilhar um cluster remoto com uma equipe de desenvolvimento. Neste caso, se algumas das etapas de construção e teste já tiverem sido realizadas, isso irá acelerar significativamente todo o processo, uma vez que o Garden poderá utilizar os resultados armazenados em cache.

Um módulo de projeto pode ser um contêiner, um contêiner Maven, um gráfico Helm, um manifesto para kubectl apply ou mesmo uma função OpenFaaS. Além disso, qualquer um dos módulos pode ser extraído de um repositório Git remoto. Um módulo pode ou não definir serviços, tarefas e testes. Serviços e tarefas podem ter dependências, para que você possa determinar a sequência de implantação de um determinado serviço e organizar o lançamento de tarefas e testes.

Garden fornece ao usuário um lindo painel (atualmente em estado experimental), que exibe o gráfico do projeto: componentes, sequência de montagem, execução de tarefas e testes, suas conexões e dependências. Diretamente no navegador, você pode visualizar os logs de todos os componentes do projeto e verificar o que um componente específico gera via HTTP (se, é claro, um recurso de entrada for declarado para ele).

Ferramentas para desenvolvedores de aplicações em execução no Kubernetes
Painel para Jardim

Essa ferramenta também possui um modo de recarga a quente, que simplesmente sincroniza as alterações do script com o contêiner no cluster, acelerando bastante o processo de depuração do aplicativo. Jardim tem uma boa a documentação e não é ruim conjunto de exemplos, permitindo que você se acostume rapidamente e comece a usá-lo. A propósito, recentemente publicamos tradução do artigo de seus autores.

Conclusão

Claro, esta lista de ferramentas para desenvolver e depurar aplicativos no Kubernetes não se limita a. Existem muitos outros utilitários muito úteis e práticos que merecem, se não um artigo separado, pelo menos uma menção. Conte-nos o que você usa, quais problemas encontrou e como os resolveu!

PS

Leia também em nosso blog:

Fonte: habr.com

Adicionar um comentário