Kubernetes lança ferramentas de desenvolvedor de aplicativos



Uma abordagem moderna da operação resolve muitos problemas de negócios prementes. Contêineres e orquestradores facilitam a escala de projetos de qualquer complexidade, simplificam o lançamento de novas versões, as tornam mais confiáveis, mas ao mesmo tempo criam problemas adicionais para os desenvolvedores. O programador, em primeiro lugar, se preocupa com seu código: arquitetura, qualidade, desempenho, elegância, e não como ele irá para o Kubernetes e como testá-lo e depurá-lo depois de fazer as menores alterações. Portanto, é lógico que as ferramentas para o Kubernetes estejam se desenvolvendo ativamente, ajudando a resolver os problemas dos desenvolvedores mais "arcaicos" e permitindo que eles se concentrem no principal.

Esta revisão fornece um resumo de algumas ferramentas que facilitam a vida de um programador cujo código gira no cluster pod'ax Kubernetes.

Ajudantes simples


Kubectl-debug


  • A linha inferior: adicione seu contêiner ao Pod e veja o que acontece nele .
  • Github
  • Breves estatísticas do GH: 715 estrelas, 54 confirmações e 9 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Este plug-in para o kubectl permite criar um contêiner adicional dentro do pod que lhe interessa, que compartilhará o espaço de nome do processo com o restante dos contêineres. É possível depurar o trabalho do pod nele: verificar a rede, ouvir o tráfego da rede, rastrear o processo de interesse, etc.

Você também pode alternar para o contêiner do processo executando chroot /proc/PID/root - isso é muito conveniente quando você precisa obter o shell raiz no contêiner para o qual securityContext.runAs definido no manifesto.

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

Telepresença


  • A linha inferior: transfira o aplicativo para o seu computador. Desenvolva e depure localmente .
  • Site ; Github
  • Breves estatísticas GH: 2131 estrelas, 2712 confirmações, 33 colaboradores.
  • Idioma: Python.
  • Licença: Licença Apache 2.0.

A idéia desse snap-in é iniciar o contêiner com o aplicativo no computador do usuário local e proxy todo o tráfego do cluster para ele e vice-versa. Essa abordagem permite que você conduza o desenvolvimento localmente, simplesmente alterando os arquivos no seu IDE favorito: os resultados estarão disponíveis imediatamente.

As vantagens do lançamento local são a conveniência da edição e resultados instantâneos, a capacidade de depurar o aplicativo da maneira usual. Uma das desvantagens é a velocidade exigente da conexão, que é especialmente perceptível quando você precisa trabalhar com um aplicativo com um RPS e tráfego razoavelmente altos. Além disso, a Telepresença tem problemas com montagens de volume no Windows, o que pode ser um limitador decisivo para desenvolvedores acostumados a esse SO.

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

Ksync


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

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

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

Resta instruir o ksync com o que sincronizar e com o que. Por exemplo, um comando como este:

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

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

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

  • Nos nós do cluster Kubernetes, overlay2 deve ser usado como o driver de armazenamento do Docker. O utilitário não funcionará com nenhum outro.
  • Ao usar o Windows como um sistema operacional cliente, o sistema de arquivos do observador pode não funcionar corretamente. Esse bug foi percebido ao trabalhar com diretórios grandes - com um grande número de anexos e diretórios de arquivos. Criamos um problema correspondente no projeto de sincronização, mas até agora não houve nenhum progresso nele (desde o início de julho).
  • Use o arquivo .stignore para especificar caminhos ou modelos de arquivo que não precisam ser sincronizados (por exemplo, os .git app/cache e .git ).
  • Por padrão, o ksync recarregará o contêiner toda vez que os arquivos forem modificados. Isso é conveniente para o Node.js, mas completamente redundante para o PHP. É melhor desativar o opcache e usar a bandeira --reload=false .
  • A configuração sempre pode ser corrigida em $HOME/.ksync/ksync.yaml .

Squash


  • A linha inferior: processos de depuração diretamente no cluster .
  • Github
  • Breves estatísticas do GH: 1154 estrelas, 279 confirmações, 23 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Esta ferramenta destina-se a processos de depuração diretamente em pods. O utilitário é simples e interativamente permite selecionar o depurador desejado (veja abaixo) e o namespace + pod, nos quais você precisa intervir. Atualmente suportado:

  • delve - para aplicativos em movimento;
  • GDB - através do 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 (com a ajuda de uma extensão ), 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 se familiarizar com os recursos do modo de segurança para evitar problemas de segurança.

Soluções Integradas


Nos voltamos para a artilharia pesada - mais projetos de "larga escala" projetados para fechar imediatamente muitas das necessidades dos desenvolvedores.

NB : Nossa lista certamente tem um lugar em nosso utilitário werf Open Source (anteriormente conhecido como dapp). No entanto, escrevemos e conversamos sobre isso mais de uma vez e, portanto, decidimos não incluí-lo na revisão. Para aqueles que desejam se familiarizar com seus recursos, 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 na Kubernetes, mas não quer se aprofundar em sua selva .
  • Github
  • Breves estatísticas do GH: 630 estrelas, 1912 confirmações, 13 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

A solução é de uma empresa com o mesmo nome que fornece clusters gerenciados com o Kubernetes para o desenvolvimento da equipe. O utilitário foi criado para clusters comerciais, mas funciona muito bem com outros.

Quando você executa o comando devspace init do devspace init no diretório com o projeto, eles oferecem (no modo interativo):

  • selecione um cluster Kubernetes em funcionamento,
  • use o Dockerfile existente (ou gere um novo) para criar um contêiner com base nele,
  • escolha um repositório para armazenar imagens de contêineres etc.

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

Será opcionalmente oferecido para ir ao contêiner pelo terminal. 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.

Por fim, o comando devspace deploy lança o aplicativo e sua infraestrutura associada no cluster, após o qual tudo começa a funcionar no modo de combate.

Toda a configuração do projeto é armazenada no arquivo devspace.yaml . Além das configurações de ambiente para desenvolvimento, você pode encontrar uma descrição da infraestrutura, semelhante aos manifestos padrão do Kubernetes, apenas bastante simplificada.


Arquitetura e marcos com o DevSpace

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

Skaffold


  • Site ; Github
  • Breves estatísticas do GH: 7423 estrelas, 4173 confirmações e 136 colaboradores.
  • Idioma: Vá.
  • Licença: Licença Apache 2.0.

Este utilitário do Google pretende 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 simples quanto o devspace: você não terá interatividade, definição de idioma ou Dockerfile automática Dockerfile .

No entanto, se não assustar, eis o que o Skaffold permite:

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

O fluxo de trabalho em várias variações é descrito declarativamente no arquivo skaffold.yaml . Para um projeto, você também pode definir vários perfis nos quais alterar parcial ou completamente os estágios de montagem e implantação. Por exemplo, para desenvolvimento, especifique uma imagem básica que seja conveniente para o desenvolvedor e para preparo e produção - o mínimo (+ use securityContext para contêineres ou redefina o cluster no qual o aplicativo será implantado).

Os contêineres do Docker podem ser criados local ou remotamente: no Google Cloud Build ou em um cluster usando o 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, sha256 soma de fontes, etc.

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

  • Execução de comandos no contexto do contêiner com rastreamento de status de saída e verificação do texto "escape" do comando.
  • Verificando a presença de arquivos no contêiner e os atributos correspondentes especificados.
  • Controle de expressão regular do conteúdo do arquivo.
  • Verificação dos metadados da imagem ( ENV , ENTRYPOINT , VOLUMES , etc.).
  • Verifique a compatibilidade da licença.

Os arquivos não são sincronizados com o contêiner da melhor maneira possível: o Skaffold simplesmente cria um arquivo com as fontes, copia e descompacta no contêiner (o tar deve ser instalado). Portanto, se sua tarefa principal é sincronizar o código, é melhor procurar uma solução especializada (ksync).


Marcos na Skaffold

Em geral, a ferramenta não permite abstrações dos manifestos do Kubernetes e não possui interatividade, por isso pode parecer difícil de dominar. Mas essa também é a sua vantagem - uma grande liberdade de ação.

Jardim


  • Site ; Github
  • Breves estatísticas GH: 1063 estrelas, 1927 confirma, 17 colaboradores.
  • Idioma: TypeScript (está planejado dividir o projeto em vários componentes, alguns dos quais estarão no Go, além de criar um SDK para a criação de complementos no TypeScript / JavaScript e Go) .
  • Licença: Licença Apache 2.0.

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

  • Irá coletar contêineres com várias partes do projeto.
  • Realizará testes de integração e unidade, se houver algum descrito.
  • Distribui todos os componentes do projeto para o cluster.
  • Se o código fonte for alterado, ele reiniciará todo o pipeline.

O foco principal ao usar esta ferramenta está no compartilhamento de um cluster remoto por uma equipe de desenvolvedores. Nesse caso, se algumas etapas de montagem e teste já tiverem sido feitas, isso acelerará significativamente todo o processo, pois o Garden poderá usar 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 o kubectl apply ou mesmo uma função OpenFaaS. E qualquer um dos módulos pode ser extraído de um repositório Git remoto. Um módulo pode determinar (ou talvez não) 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 serviço, organizar o lançamento de tarefas e testes.

O Garden fornece ao usuário um belo painel (ainda em estado experimental ) no qual o gráfico do projeto é exibido: componentes, sequência de montagem, tarefas e testes, seus relacionamentos e dependências. Diretamente no navegador, você também pode visualizar os logs de todos os componentes do projeto, verificar o que esse ou aquele componente exibe via HTTP (a menos que, é claro, o recurso de entrada seja declarado para ele).


Painel para Jardim

Essa ferramenta também possui um modo de recarga a quente, que simplesmente sincroniza as alterações de script com o contêiner no cluster, acelerando bastante o processo de depuração do aplicativo. O Garden possui uma boa documentação e um bom conjunto de exemplos para começar e começar a usar rapidamente. Aliás, mais recentemente, publicamos uma tradução do artigo de seus autores.

Conclusão


Obviamente, a lista de ferramentas para desenvolvimento e depuração de aplicativos no Kubernetes não é limitada. Existem muitos utilitários mais úteis e práticos dignos, se não um artigo separado, então - pelo menos - mencionar. Diga-nos o que você usa, quais problemas você encontrou e como os resolveu!

PS


Leia também em nosso blog:

Source: https://habr.com/ru/post/pt462707/


All Articles