Rastreamento distribuído no Istio



Uma observação da nossa equipe editorial das traduções: o artigo apresentado descreve o produto fechado de uma empresa em particular e, infelizmente, não há evidências de que algum dia seja planejado abri-lo - no sentido Stallman da palavra. No entanto, pareceu-nos muito importante e útil considerar como as pessoas geralmente abordam os problemas de depuração do Istio e como otimizam seu trabalho neste campo. Talvez alguém possa desenhar algumas idéias interessantes para si.

Em algum momento, ao desenvolver sistemas de produção baseados na arquitetura de microsserviços, chegamos à conclusão de que o monitoramento de todos os elementos de nosso serviço não é suficiente para lidar com problemas sérios. Com o tempo, é necessário obter uma imagem completa de toda a pilha de chamadas em todo o aplicativo ao mesmo tempo, com informações detalhadas sobre a topologia da solicitação, atrasos na rede e a duração de comandos individuais. Para resolver esse problema, os engenheiros geralmente recorrem ao rastreamento distribuído.

Neste post, o conceito de rastreamento distribuído será examinado pelo prisma da arquitetura de microsserviços: como tudo se integra e automatiza através do Istio , e então todo o processo é simplificado e processado através de Backyards - nosso produto de serviço para o Istio.

Entrada


Anteriormente, escrevemos sobre o quão complicado pode ser apenas instalar e configurar o Istio; portanto, para simplificar essa situação, escolhemos o desenvolvimento de código aberto do Banzai Cloud Istio . Além do Istio, você pode usar várias ferramentas convenientes com o Helm ( Prometheus , Grafana , Jaeger , Kiali ); em qualquer caso, a maioria dos pedidos de suporte / integração vieram deles. Como acreditamos que todo mundo escolhe uma ferramenta ao seu gosto , não implementamos rigidamente as ferramentas listadas no Istio, mas apenas fornecemos a capacidade de integrar facilmente esses componentes.

Além disso, queríamos fornecer aos nossos usuários outra ferramenta poderosa para gerenciar os componentes listados no cluster (ou seja, algo diferente do Istio), por isso também criamos Backyards . Com ele, você pode instalar facilmente o Prometheus, Grafana e Jaeger e, ao contrário do Kiali, o Backyards não é apenas uma interface de monitoramento baseada na Web, mas uma ferramenta multifuncional completa para gerenciar sua rede de serviços. É compatível com um ou vários clusters de uma só vez e contém uma poderosa API CLI e GraphQL.

Neste post, focaremos no rastreamento distribuído e no Jaeger.

Introdução ao rastreamento distribuído


Na arquitetura dos microsserviços, quando vários serviços se chamam ao mesmo tempo, geralmente é difícil encontrar e depurar problemas. Na verdade, nesta declaração está a principal razão pela qual a eficiência das solicitações de serviço é baixa: qual serviço se tornou um gargalo, qual o tamanho do atraso da rede entre as solicitações?

Graças ao rastreamento distribuído, você pode visualizar a árvore de chamadas completa, ver qual serviço acessou qual serviço, quanto tempo leva cada chamada e qual é o atraso no atendimento. É o rastreamento distribuído que ajuda a determinar onde ocorreu a falha e qual serviço está sem tempo de resposta.
O rastreamento distribuído é o processo de rastreamento de solicitações individuais em toda a pilha de chamadas no sistema.


Sem usar o rastreamento distribuído, é realmente fácil se perder nas muitas chamadas trocadas entre microsserviços. Também é difícil depurar problemas sem ele, pois você precisa confiar apenas em logs. Porém, graças ao rastreamento distribuído, toda a pilha de chamadas com todas as informações necessárias para diagnosticar o problema fica disponível para você.

Sob o capô de um rastreamento distribuído


Span é a menor unidade em um rastreamento distribuído. Ela tem os rótulos "início" e "duração". Span têm relacionamentos pai-filho e formam juntos o Trace.

Existem três tarefas nas quais coletar corretamente rastreamentos

1. Incoming request spans 2. Outgoing request spans 3. Context propagation 

  Intervalo de pedidos recebidos: 
quando uma solicitação chega a um serviço, ela deve ser verificada quanto a um cabeçalho de rastreamento. Se não houver cabeçalho, é necessário criar um período raiz (pai) para iniciar o rastreamento; nesse caso, crie um período filho para continuar o rastreamento.

  Intervalo de solicitação de saída: 
quando uma solicitação é enviada de um serviço para outro, um intervalo é criado primeiro, para que a parte que recebe a solicitação continue rastreando, conforme descrito acima.

  Propagação de contexto: 
Os serviços geralmente recebem e enviam várias solicitações ao mesmo tempo. Sem fazer alterações, é impossível rastrear a conexão entre solicitações recebidas e enviadas. É aqui que chega a melhor hora para transmitir o contexto. Para HTTP, isso pode ser feito passando os cabeçalhos de rastreamento das chamadas recebidas para as chamadas de saída do aplicativo, o que permitirá criar um rastreamento completo.

Além dessas tarefas, os rastreamentos devem ser coletados, agrupados e perfeitamente visualizados.

Tudo isso pode parecer complicado o suficiente para ser implementado em todos os serviços do sistema, mas existem ferramentas que permitem resolver quase todas as tarefas descritas no modo automático. Como resultado, os desenvolvedores podem obter o rastreamento distribuído, de fato, pronto para uso.

Para obter mais informações sobre os princípios básicos do rastreamento distribuído, recomendo a leitura deste ótimo post da Nike .

Rastreamento distribuído no Istio


No Istio, os proxies Envoy fazem o trabalho sujo do rastreamento distribuído . Há uma injeção lateral no Istio, graças à qual todas as solicitações de entrada e saída de / para o serviço passam primeiro pelo servidor proxy Envoy. É nesse estágio que os rastreamentos pai e filha são gerados, que são as duas primeiras das três condições necessárias para criar um rastreamento distribuído.

A terceira condição - a transferência de contexto - deve ser realizada através de uma alteração na lógica do aplicativo. No Istio Bookinfo, isso já está implementado no nível de cada microsserviço, para que rastreamentos completos possam ser obtidos imediatamente após a instalação. Ao usar o rastreamento distribuído em seus próprios serviços, você precisa implementar a propagação de contexto .

Ao contrário de alguns equívocos comuns, vale a pena notar que o suporte completo ao rastreamento distribuído com propagação de contexto, mesmo no nível de uma grade de serviço regular, só pode ser criado alterando a lógica do aplicativo. Um bom exemplo é fornecido no Aviso 1 .

O site do Istio possui documentação sobre quais cabeçalhos usar. Todos são compatíveis com o formato de cabeçalho Zipkin .
Observe que, além do rastreamento baseado no Envoy descrito acima, o Istio também possui um rastreamento baseado no Mixer que usa o componente Mixer mais ativamente. É provável que em versões futuras o Mixer seja descontinuado, portanto não descreverei o trabalho com ele em detalhes. Basta dizer que a telemetria do misturador pode ser sentida através do operador.
Com o Envoy e distribuindo os cabeçalhos de rastreamento necessários, podemos obter os rastreamentos necessários. Para coletar e visualizar essas informações, o Istio vem com ferramentas como Jaeger , Zipkin , Lightstep e Datadog . Por padrão, o Jaeger é usado, também é a ferramenta mais popular de todas as listadas.

Também podemos ajustar a taxa de amostragem, ou seja, qual porcentagem de todas as solicitações será apresentada na forma de rastreios. O valor padrão é 1% do número total de solicitações. A frequência pode ser alterada aqui neste campo do operador Istio.

Como funciona no Istio


Vamos resumir como fazer o rastreamento distribuído com o Jaeger (mais tarde comparamos isso com o mesmo processo nos quintais):

  1. Juntamente com o Istio, você obtém o Jaeger com todos os serviços e implantação necessários.
  2. O endereço do serviço de rastreamento é definido por padrão pela configuração dos proxies Envoy e, através deles, os relatórios Span e os serviços de side-car funcionam.
  3. O Bookinfo pode ser instalado antes de todos os serviços distribuírem seus cabeçalhos em rastreamentos.
  4. Os rastreamentos ficarão disponíveis após a coleta de informações suficientes.
  5. O painel de controle do Jaeger pode ser redirecionado para abrir a parte do usuário através de um navegador.

Rastreio distribuído nos quintais


Nos quintais, instalando, configurando o Jaeger, instalando um aplicativo de demonstração com cabeçalhos de rastreio distribuídos automaticamente e enviando cargas para tudo isso - tudo é feito com um simples comando! E depois de vincular os serviços uns aos outros com as faixas, tudo isso fica disponível na interface do usuário.

Agora olha!

Crie um cluster
Bem, para começar, precisamos de um cluster no Kubernetes. Eu criei o cluster Kubernetes no GKE através da versão gratuita do Pipeline para desenvolvedores. Se você quiser fazer o mesmo, crie seu cluster através do Pipeline em qualquer um dos cinco provedores de nuvem aos quais oferecemos suporte. Caso contrário, aumente o cluster do Kubernetes para outro lugar.

Como funciona no quintal
Anteriormente, resumimos o resultado intermediário de que o Jaeger pode ser usado em conjunto com o Istio. Agora vamos comparar como tudo acontece nos quintais.

Agora, a maneira mais fácil de instalar o Istio, o Backyards e o aplicativo de demonstração em um novo cluster é usar a interface da linha de comandos do Backyards .

Você precisa digitar apenas um comando (no seu cluster deve ser
  KUBECONFIG): 


 $backyards install –a –run-demo 

  1. Usando este comando, o Jaeger é instalado automaticamente (em vez de com o nosso operador de código aberto Istio e os componentes de Backyards).
  2. Como mencionado anteriormente, o Istio está pronto para ser integrado com outros componentes, como Prometheus, Grafana ou Jaeger. Quando o Jaeger é instalado, seu endereço de serviço é definido na janela do usuário do operador. No futuro, esse endereço será escrito em todos os lugares em que for necessário controlar os componentes do Istio e o fluxo de dados.
  3. O aplicativo de demonstração também é instalado por padrão. Ele usa serviços golang que já estão configurados para distribuir os cabeçalhos de rastreamento necessários.
  4. O carregamento automático do aplicativo de demonstração é iniciado (daí o sinalizador --run-demo ), para que você possa iniciar imediatamente o rastreamento de faixas.
  5. O Jaeger é aberto através do gateway de entrada, está vinculado à interface do usuário e está automaticamente disponível na forma de um esquema e como uma lista.

É literalmente tão simples quanto escrever uma equipe para criar um novo cluster Kubernetes, então tente se quiser!

Aqui está o que você verá:

Jaeger vinculado ao esquema:



E aqui está uma lista:



UI do Jaeger para aplicativo de demonstração:





Na interface do usuário, você pode ver toda a pilha de chamadas em seu sistema de microsserviço. Agora você pode acompanhar exatamente quando a solicitação raiz foi iniciada e quanto tempo cada solicitação levou. Ou, por exemplo, você pode ver que o serviço analítico passou a maior parte do tempo em determinadas consultas, pois está ocupado com cálculos reais (por exemplo, calcula os valores de Pi).

Limpeza
Para remover o aplicativo de demonstração, Backyards e Istio do seu cluster, você precisa apenas de uma equipe. Ela cuidará de remover todos os componentes na ordem correta:

 $ backyards uninstall -a 

Sumário


O rastreamento distribuído é necessário principalmente para sistemas distribuídos existentes nos quais quaisquer dificuldades ou problemas precisam ser corrigidos. Nosso operador, Istio, se concentra exclusivamente no gerenciamento, onde o Backyards contém muitos outros componentes que podem ser usados ​​no trabalho. Por exemplo, este é Jaeger, que pronto para uso fornece a capacidade de conduzir rastreios distribuídos.

Nesse caso, o Jaeger é instalado usando Backyards, e este exibe todos os links e rastreamentos do Jaeger no sistema diretamente na interface!

Tenha um bom traço!

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


All Articles