Suivi distribué dans Istio



Une note de notre rédaction sur les traductions: l'article présenté décrit le produit fermé d'une entreprise particulière et, malheureusement, rien ne prouve qu'il soit envisagé de l'ouvrir - au sens Stallman du terme. Néanmoins, il nous a semblé très important et utile d'examiner comment les gens abordent généralement les problèmes de débogage d'Istio et comment ils optimisent leur travail dans ce domaine. Peut-être que quelqu'un peut tirer quelques idées intéressantes pour lui-même.

À un moment donné, lors du développement de systèmes de production basés sur une architecture de microservices, nous sommes arrivés à la conclusion que la surveillance de chaque élément de notre service n'était pas suffisante pour faire face à de graves problèmes. Au fil du temps, il est nécessaire d'obtenir une image complète de la pile d'appels entière dans l'ensemble de l'application en même temps, avec des informations détaillées sur la topologie de la demande, les retards du réseau et la durée des commandes individuelles. Pour résoudre ce problème, les ingénieurs ont généralement recours au suivi distribué.

Dans cet article, le concept de traçage distribué sera examiné à travers le prisme de l'architecture de microservices: comment tout est intégré et automatisé via Istio , puis l'ensemble du processus est simplifié et traité via Backyards - notre produit de service pour Istio.

Entrée


Plus tôt, nous avons écrit sur la complexité de l'installation et de la configuration d'Istio.Pour simplifier cette situation, nous avons choisi le développement open source de Banzai Cloud Istio . En plus d'Istio, vous pouvez utiliser un certain nombre d'outils pratiques avec Helm ( Prometheus , Grafana , Jaeger , Kiali ), dans tous les cas, la plupart des demandes d' assistance / d'intégration provenaient d'eux. Étant donné que nous pensons que tout le monde choisit un outil à sa guise , nous n'avons pas implémenté ces outils de manière rigide dans Istio, mais uniquement fourni la possibilité d'intégrer facilement ces composants.

En outre, nous voulions fournir à nos utilisateurs un autre outil puissant pour gérer les composants répertoriés dans le cluster (c'est-à-dire autre chose que Istio), nous avons donc également créé Backyards . Avec lui, vous pouvez facilement installer Prometheus, Grafana et Jaeger et, contrairement à Kiali, Backyards n'est pas seulement une interface de surveillance basée sur le Web, mais un outil multifonctionnel complet pour gérer votre réseau de services. Il est compatible avec un ou plusieurs clusters à la fois et contient une puissante interface CLI et GraphQL.

Dans cet article, nous nous concentrerons sur le traçage distribué et Jaeger.

Introduction au suivi distribué


Dans l'architecture des microservices, lorsque plusieurs services s'appellent en même temps, il est souvent difficile de trouver et de déboguer des problèmes. En fait, dans cette déclaration se trouve la principale raison pour laquelle l'efficacité des demandes de service est faible: quel service est devenu un goulot d'étranglement, quelle est la longueur du délai réseau entre les demandes?

Grâce au suivi distribué, vous pouvez visualiser l'arborescence complète des appels, voir quel service a accédé à quel service, combien de temps prend chaque appel et quel est le délai de réponse. C'est la trace distribuée qui permet de déterminer où la panne s'est produite et quel service est hors du temps de réponse.
Le traçage distribué est le processus de suivi des demandes individuelles sur l'ensemble de la pile d'appels du système.


Sans utiliser le traçage distribué, il est vraiment facile de se perdre dans les nombreux appels échangés entre les microservices. Il est également difficile de déboguer des problèmes sans cela, car vous ne devez compter que sur les journaux. Mais grâce au suivi distribué, l'ensemble de la pile d'appels avec toutes les informations nécessaires au diagnostic du problème devient disponible.

Sous le capot d'une trace distribuée


La portée est la plus petite unité d'une trace distribuée. Elle a les étiquettes «début» et «durée». Span a des relations parents-enfants entre eux et forme Trace ensemble.

Il existe trois tâches pour collecter correctement les traces

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

  Étendue des demandes entrantes: 
Lorsqu'une demande arrive à un service, il doit être vérifié pour un en-tête de trace. S'il n'y a pas d'en-tête, il est nécessaire de créer une étendue racine (parent) pour commencer le traçage, si c'est le cas, créez une étendue enfant pour continuer le traçage.

  Étendue des demandes sortantes: 
lorsqu'une demande est envoyée d'un service à un autre, un intervalle est créé en premier, de sorte que la partie qui reçoit la demande continue de tracer, comme décrit ci-dessus.

  Propagation du contexte: 
Les services reçoivent et envoient généralement plusieurs demandes à la fois. Sans apporter de modifications, il est impossible de suivre la connexion entre les demandes entrantes et sortantes. C'est là que vient la meilleure heure pour transmettre le contexte. Pour HTTP, cela peut être fait en passant les en-têtes de trace des appels entrants aux appels sortants de l'application, ce qui vous permettra de créer une trace complète.

En plus de ces tâches, les traces doivent être collectées, groupées et parfaitement visualisées.

Tout cela peut sembler suffisamment compliqué pour être implémenté sur tous les services du système, mais il existe des outils qui vous permettent de résoudre presque toutes les tâches décrites en mode automatique. En conséquence, les développeurs peuvent obtenir le traçage distribué, en fait, hors de la boîte.

Pour plus d'informations sur les principes de base du traçage distribué, je recommanderais de lire cet excellent article de Nike .

Suivi distribué dans Istio


Dans Istio, les mandataires Envoy font le sale boulot du traçage distribué . Il y a une injection de side-car dans Istio, grâce à laquelle toutes les demandes entrantes et sortantes vers / depuis le service passent d'abord par le serveur proxy Envoy. C'est à ce stade que les traces parent et fille sont générées, qui sont les deux premières des trois conditions nécessaires à la création d'une trace distribuée.

La troisième condition - le transfert de contexte - doit être réalisée par un changement de logique d'application. Dans Istio Bookinfo, cela est déjà implémenté au niveau de chaque microservice, de sorte que des traces complètes peuvent être obtenues immédiatement après l'installation. Lorsque vous utilisez le traçage distribué dans vos propres services, vous devez implémenter vous-même la propagation du contexte .

Contrairement à certaines idées fausses courantes, il convient de noter que la prise en charge complète du traçage distribué avec propagation de contexte, même au niveau d'une grille de service standard, ne peut être créée qu'en modifiant la logique de l'application. Un bon exemple est fourni dans la mise en garde 1 .

Le site Web d'Istio contient une documentation sur les en-têtes à utiliser. Tous sont compatibles avec le format d'en-tête Zipkin .
Veuillez noter qu'en plus du suivi basé sur l'Envoy décrit ci-dessus, Istio a également un suivi basé sur le mélangeur qui utilise le composant mélangeur plus activement. Il est probable que dans les futures versions, Mixer sera abandonné, donc je ne décrirai pas de travailler avec lui en détail. Il suffit de dire que la télémétrie du mélangeur peut être ressentie par l'opérateur.
Avec Envoy et la distribution des en-têtes de trace dont nous avons besoin, nous pouvons obtenir les traces dont nous avons besoin. Pour collecter et visualiser ces informations, Istio est fourni avec des outils tels que Jaeger , Zipkin , Lightstep et Datadog . Par défaut, Jaeger est utilisé, c'est aussi l'outil le plus populaire de tous les listés.

Nous pouvons également ajuster le taux d'échantillonnage, c'est-à-dire le pourcentage de toutes les demandes qui seront présentées sous forme de traces. La valeur par défaut est 1% du nombre total de demandes. La fréquence peut être modifiée ici dans ce champ de l'opérateur Istio.

Comment ça marche à Istio


Résumons comment faire le traçage distribué avec Jaeger (plus tard, nous le comparerons avec le même processus dans Backyards):

  1. Avec Istio, vous obtenez Jaeger avec tous les services et le déploiement nécessaires.
  2. L'adresse du service de trace est définie par défaut par la configuration des proxys Envoy et à travers eux, les rapports Span et les services sidecar fonctionnent.
  3. Bookinfo peut être installé avant que tous les services distribuent leurs en-têtes d'en-tête aux traces.
  4. Les traces deviendront disponibles une fois que suffisamment d'informations auront été collectées.
  5. Le panneau de configuration Jaeger peut être redirigé pour ouvrir la partie utilisateur via un navigateur.

Trace distribuée dans les arrière-cours


Dans Backyards, installer, configurer Jaeger, installer une application de démonstration avec des en-têtes de trace distribués automatiquement et envoyer des charges à tout cela - tout se fait avec une seule commande! Et après avoir lié les services entre eux avec les pistes, tout cela devient disponible à partir de l'interface utilisateur.

Maintenant regarde!

Créer un cluster
Eh bien, pour commencer, nous avons besoin d'un cluster dans Kubernetes. J'ai élevé le cluster Kubernetes sur GKE via la version gratuite de Pipeline pour les développeurs. Si vous souhaitez faire de même, créez votre cluster via Pipeline sur l'un des cinq fournisseurs de cloud que nous prenons en charge. Sinon, augmentez votre cluster Kubernetes ailleurs.

Comment ça marche chez Backyards
Plus tôt, nous avons résumé le résultat intermédiaire selon lequel Jaeger peut être utilisé conjointement avec Istio. Comparons maintenant comment tout se passe dans Backyards.

Désormais, la façon la plus simple d'installer Istio, Backyards et l'application de démonstration sur un nouveau cluster consiste à utiliser l'interface de ligne de commande Backyards .

Vous devez entrer une seule commande (sur votre cluster doit être
  KUBECONFIG): 


 $backyards install –a –run-demo 

  1. En utilisant cette commande, Jaeger est automatiquement installé (au lieu de notre opérateur open source Istio et des composants Backyards).
  2. Comme mentionné précédemment, Istio est prêt à être intégré à d'autres composants comme Prometheus, Grafana ou Jaeger. Lorsque Jaeger est installé, son adresse de service est définie dans la fenêtre utilisateur de l'opérateur. À l'avenir, cette adresse est écrite à chaque endroit où elle est nécessaire pour contrôler les composants Istio et le flux de données.
  3. L'application de démonstration est également installée par défaut. Il utilise des services golang déjà configurés pour distribuer les en-têtes de trace nécessaires.
  4. Le chargement automatique de l'application de démonstration commence (d'où l' indicateur --run-demo ), vous pouvez donc immédiatement commencer à suivre les pistes.
  5. Jaeger s'ouvre via la passerelle d'entrée, il est lié à l'interface utilisateur et est automatiquement disponible à la fois sous forme de schéma et sous forme de liste.

C'est littéralement aussi simple que d'écrire à une équipe pour créer un nouveau cluster Kubernetes, alors essayez- le si vous le souhaitez!

Voici ce que vous verrez:

Jaeger lié au régime:



Et voici une liste:



Interface utilisateur Jaeger pour l'application de démonstration:





Dans l'interface utilisateur, vous pouvez voir l'intégralité de la pile d'appels dans votre système de microservices. Vous pouvez maintenant suivre exactement quand la demande racine a été lancée et combien de temps chaque demande a pris. Ou, par exemple, vous pouvez voir que le service analytique a passé la plupart du temps certaines requêtes, car il est occupé par des calculs réels (par exemple, il calcule les valeurs de Pi).

Le nettoyage
Pour supprimer l'application de démonstration, Backyards et Istio de votre cluster, vous n'avez besoin que d'une seule équipe. Elle se chargera de retirer tous les composants dans le bon ordre:

 $ backyards uninstall -a 

Résumé


Le traçage distribué est nécessaire principalement pour les systèmes distribués existants dans lesquels des difficultés ou des problèmes doivent être résolus. Notre opérateur, Istio, se concentre uniquement sur la gestion, alors que Backyards contient de nombreux autres composants qui peuvent être utilisés dans le travail. Par exemple, il s'agit de Jaeger, qui, prêt à l'emploi, permet d'effectuer un traçage distribué.

Dans ce cas, Jaeger est installé à l'aide de Backyards, et ce dernier affiche tous les liens et traces de Jaeger dans le système directement dans l'interface!

Ayez une belle trace!

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


All Articles