Traçage et surveillance dans Istio : les microservices et le principe d'incertitude

Le principe d’incertitude de Heisenberg stipule qu’on ne peut pas mesurer simultanĂ©ment la position d’un objet et sa vitesse. Si un objet bouge, alors il n’a aucun emplacement. Et s’il y a un emplacement, c’est qu’il n’a pas de vitesse.

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude

Quant aux microservices sur la plateforme Red Hat OpenShift (et exécutant Kubernetes), grùce au logiciel open source approprié, ils peuvent rendre compte simultanément de leurs performances et de leur état de santé. Bien entendu, cela ne réfute pas le vieux Heisenberg, mais cela élimine l'incertitude liée au travail avec des applications cloud. Istio facilite le suivi et la surveillance de ces applications pour tout garder sous contrÎle.

Décider de la terminologie

sous tracĂ© (Traçage) nous comprenons la journalisation de l'activitĂ© du systĂšme. Cela semble assez gĂ©nĂ©ral, mais en fait, l'une des rĂšgles de base ici est de vider les donnĂ©es de trace dans le stockage appropriĂ© sans se soucier de leur formatage. Et tout le travail de recherche et d’analyse des donnĂ©es incombe au consommateur. Istio utilise le systĂšme de traçage Jaeger, qui implĂ©mente le modĂšle de donnĂ©es OpenTracing.

Sur les sentiers (Traces, et le mot « traces » est utilisĂ© ici dans le sens de « traces », comme par exemple dans l'examen balistique) nous appellerons des donnĂ©es qui dĂ©crivent complĂštement le passage d'une demande ou d'une unitĂ© de travail, comme on dit, «de et vers». Par exemple, tout ce qui se passe depuis le moment oĂč un utilisateur clique sur un bouton d'une page Web jusqu'au retour des donnĂ©es, y compris tous les microservices impliquĂ©s. On peut dire qu'une trace dĂ©crit (ou modĂ©lise) complĂštement l'aller-retour d'une requĂȘte. Dans l'interface Jaeger, les traces sont dĂ©composĂ©es en composants le long de l'axe du temps, de la mĂȘme maniĂšre qu'une chaĂźne peut ĂȘtre dĂ©composĂ©e en maillons individuels. Seulement, au lieu de liens, l'itinĂ©raire est constituĂ© de ce qu'on appelle des travĂ©es.

Envergure est l'intervalle entre le dĂ©but d'une unitĂ© de travail et son achĂšvement. Poursuivant l'analogie, nous pouvons dire que chaque travĂ©e reprĂ©sente un maillon distinct de la chaĂźne. Un Span peut (ou non) avoir un ou plusieurs spans enfants. Par consĂ©quent, le span le plus haut (span racine) aura la mĂȘme durĂ©e totale que la trace Ă  laquelle il appartient.

Surveillance - c'est en fait l'observation mĂȘme de votre systĂšme - avec vos yeux, via l'interface utilisateur ou les outils d'automatisation. La surveillance est basĂ©e sur les donnĂ©es de trace. Dans Istio, la surveillance est implĂ©mentĂ©e Ă  l'aide de Prometheus et dispose d'une interface utilisateur appropriĂ©e. Prometheus prend en charge la surveillance automatisĂ©e Ă  l'aide d'alertes et de gestionnaires d'alertes.

Nous laissons des traces

Pour que le traçage soit possible, l'application doit crĂ©er une collection d'Ă©tendues. Ensuite, ils doivent ĂȘtre exportĂ©s vers Jaeger, afin que celui-ci crĂ©e Ă  son tour une reprĂ©sentation visuelle de la trace. Entre autres choses, ces plages marquent le nom de l’opĂ©ration, ainsi que ses horodatages de dĂ©but et de fin. La transmission des spans s'effectue en transmettant les en-tĂȘtes de requĂȘte HTTP spĂ©cifiques Ă  Jaeger des requĂȘtes entrantes vers les requĂȘtes sortantes. Selon le langage de programmation utilisĂ©, cela peut nĂ©cessiter des modifications mineures du code source de l'application. Vous trouverez ci-dessous un exemple de code en Java (utilisant le framework Spring Boot) qui ajoute des en-tĂȘtes B3 (style Zipkin) Ă  votre requĂȘte dans la classe de configuration Spring :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Les paramĂštres d'en-tĂȘte suivants sont utilisĂ©s :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Si vous utilisez Java, vous pouvez laisser le code seul et simplement ajouter quelques lignes au fichier Maven POM et dĂ©finir les variables d'environnement. Voici les lignes que vous devez ajouter Ă  votre fichier POM.XML pour implĂ©menter Jaeger Tracer Resolver :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Et les variables d'environnement correspondantes sont dĂ©finies dans le Dockerfile :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Voilà, maintenant tout est configuré et nos microservices vont commencer à générer des données de trace.

Voyons en termes généraux

Istio comprend un panneau de contrÎle simple basé sur Grafana. Une fois que tout est configuré et exécuté sur la plateforme Red Hat OpenShift PaaS (dans notre exemple, Red Hat OpenShift et Kubernetes sont déployés sur minishift), ce panel est lancé avec la commande suivante :

open "$(minishift openshift service grafana -u)/d/1/istio-dashboard?refresh=5⩝Id=1"

Le panneau Grafana vous permet d'Ă©valuer rapidement les performances du systĂšme. Un fragment de ce panneau est prĂ©sentĂ© dans la figure ci-dessous :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Ici, vous pouvez voir que le microservice client appelle le microservice de prĂ©fĂ©rence v1, qui Ă  son tour appelle les microservices de recommandation v1 et v2. Le panneau Grafana dispose d'un bloc Dashboard Row pour les mĂ©triques de haut niveau, telles que le nombre total de requĂȘtes (volume global de requĂȘtes), les taux de rĂ©ussite et les erreurs 4xx. De plus, il existe une vue Server Mesh avec des graphiques pour chaque service et un bloc Services Row pour afficher des informations dĂ©taillĂ©es sur chaque conteneur pour chaque service.

Maintenant, creusons plus profondément

Avec un traçage correctement configurĂ©, Istio, comme on dit, vous permet dĂšs la sortie de la boĂźte d'approfondir l'analyse des performances du systĂšme. Dans l'interface utilisateur de Jaeger, vous pouvez visualiser les traces et voir jusqu'oĂč elles vont, ainsi que localiser visuellement les goulots d'Ă©tranglement en matiĂšre de performances. Lorsque vous utilisez Red Hat OpenShift sur la plateforme minishift, lancez Jaeger UI avec la commande suivante :

minishift openshift service jaeger-query --in-browser

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Que pouvez-vous dire du traçage sur cet Ă©cran :

  • Il est divisĂ© en 7 travĂ©es.
  • Le temps d'exĂ©cution total est de 6.99 ms.
  • Le microservice de recommandation, qui est le dernier de la chaĂźne, passe 0.69 ms.

Les diagrammes de ce type vous permettent de comprendre rapidement la situation oĂč, en raison d'un mauvais fonctionnement d'un service, les performances de l'ensemble du systĂšme en souffrent.

Compliquons maintenant la tĂąche et lançons deux instances du microservice recommendation:v2 avec la commande oc scale —replicas=2 dĂ©ployer/recommendation-v2. Voici les pods que nous aurons aprĂšs cela :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Si nous revenons maintenant Ă  Jaeger et Ă©largissons la portĂ©e du service de recommandation, nous pouvons voir vers quel pod les demandes sont acheminĂ©es. Ainsi, on peut facilement localiser les freins au niveau d'un pod spĂ©cifique. Dans ce cas, vous devez regarder le champ node_id :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude

OĂč et comment tout se passe

Passons maintenant Ă  l'interface Prometheus et, comme on pouvait s'y attendre, nous y voyons que les requĂȘtes entre la deuxiĂšme et la premiĂšre version du service de recommandation sont divisĂ©es dans un rapport de 2:1, strictement en fonction du nombre de pods fonctionnels. De plus, ce graphique changera dynamiquement Ă  mesure que les pods augmentent et diminuent, ce qui sera particuliĂšrement utile pour le dĂ©ploiement Canary (nous examinerons de plus prĂšs ce schĂ©ma de dĂ©ploiement la prochaine fois).

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude

Tout commence

En fait, aujourd’hui, comme on dit, nous n’avons fait qu’effleurer la richesse des informations utiles sur Jaeger, Grafana et Prometheus. En gĂ©nĂ©ral, tel Ă©tait notre objectif : vous orienter dans la bonne direction et ouvrir des perspectives pour Istio.

Et rappelez-vous, tout cela est dĂ©jĂ  intĂ©grĂ© Ă  Istio. Lors de l'utilisation de certains langages de programmation (par exemple Java) et frameworks (par exemple Spring Boot), tout cela peut ĂȘtre implĂ©mentĂ© sans toucher du tout au code de l'application lui-mĂȘme. Oui, le code devra ĂȘtre lĂ©gĂšrement modifiĂ© si vous utilisez d'autres langages, c'est-Ă -dire principalement Nodejs ou C#. Mais comme la traçabilitĂ© (lire : « tracing ») est l’une des conditions prĂ©alables Ă  la crĂ©ation de systĂšmes cloud fiables, vous devrez quand mĂȘme Ă©diter le code, que vous ayez Istio ou non. Alors pourquoi ne pas mieux utiliser vos efforts ?

Au moins pour toujours rĂ©pondre aux questions « oĂč ? et "Ă  quelle vitesse?" avec 100% de certitude.

IngĂ©nierie du chaos dans Istio : c'est comme ça que cela Ă©tait prĂ©vu

La capacitĂ© de casser des objets permet d’éviter qu’ils ne se brisent.

Les tests logiciels sont non seulement difficiles, mais aussi importants. Dans le mĂȘme temps, tester l'exactitude (par exemple, si une fonction renvoie le rĂ©sultat correct) est une chose, mais tester dans un rĂ©seau peu fiable est une tĂąche complĂštement diffĂ©rente (on suppose souvent que le rĂ©seau fonctionne toujours sans panne, et cela est la premiĂšre des huit idĂ©es fausses sur les calculs distribuĂ©s). L'une des difficultĂ©s pour rĂ©soudre ce problĂšme est de savoir comment simuler des pannes dans le systĂšme ou les introduire intentionnellement, en effectuant ce que l'on appelle l'injection de fautes. Cela peut ĂȘtre fait en modifiant le code source de l'application elle-mĂȘme. Mais vous ne testerez alors plus votre code original, mais une version de celui-ci qui simule spĂ©cifiquement les Ă©checs. En consĂ©quence, vous risquez de tomber dans l’étreinte mortelle de l’injection de fautes et de rencontrer des Heisenbugs – des pannes qui disparaissent lorsque vous essayez de les dĂ©tecter.

Nous allons maintenant vous montrer comment Istio vous aide à gérer ces complexités en un seul morceau.

À quoi ressemble tout quand tout va bien ?

ConsidĂ©rez le scĂ©nario suivant : nous disposons de deux pods pour notre microservice de recommandation, que nous avons extraits du didacticiel Istio. Un pod est Ă©tiquetĂ© v1 et l’autre est Ă©tiquetĂ© v2. Comme vous pouvez le constater, tout fonctionne bien jusqu'Ă  prĂ©sent :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
(D'ailleurs, le numéro à droite n'est que le compteur d'appels de chaque pod)

Mais ce n’est pas ce dont nous avons besoin, n’est-ce pas ? Eh bien, essayons de tout casser sans toucher du tout au code source.

Nous organisons des interruptions dans le fonctionnement du microservice

Ci-dessous se trouve le fichier yaml d'une rÚgle de routage Istio qui échouera (erreur) la moitié du temps. serveur 503):

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Veuillez noter que nous indiquons explicitement qu'une erreur 503 doit ĂȘtre renvoyĂ©e dans la moitiĂ© des cas.

Et voici Ă  quoi ressemblera une capture d'Ă©cran d'une commande curl exĂ©cutĂ©e en boucle aprĂšs avoir activĂ© cette rĂšgle pour simuler des Ă©checs. Comme vous pouvez le constater, la moitiĂ© des requĂȘtes renvoient l'erreur 503, quel que soit le pod (v1 ou v2) auquel elles sont destinĂ©es :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Pour rétablir un fonctionnement normal, il suffit de supprimer cette rÚgle, dans notre cas avec la commande istioctl delete routerule recommendation-503 -n tutoriel. Ici, Tutorial est le nom du projet Red Hat OpenShift qui exécute notre didacticiel Istio.

Introduire des délais artificiels

Les fausses erreurs 503 aident Ă  tester la rĂ©silience d'un systĂšme aux pannes, mais la capacitĂ© Ă  prĂ©dire et Ă  gĂ©rer les retards devrait vous impressionner encore plus. Et dans la vraie vie, les retards se produisent plus souvent que les Ă©checs. Un microservice lent est un poison qui affecte l’ensemble du systĂšme. Avec Istio, vous pouvez tester votre code liĂ© au dĂ©lai sans le modifier d'aucune façon. Tout d’abord, nous montrerons comment procĂ©der dans le cas de retards de rĂ©seau introduits artificiellement.

Veuillez noter qu'aprĂšs avoir testĂ© de cette façon, vous devrez peut-ĂȘtre (ou souhaiterez) modifier votre code. La bonne nouvelle ici est que dans ce cas, vous serez proactif plutĂŽt que rĂ©actif. C'est exactement ainsi que le cycle de dĂ©veloppement doit ĂȘtre structurĂ© : codage-test-feedback-codage-test...

VoilĂ  Ă  quoi ressemble la rĂšgle... Mais vous savez quoi ? Istio est si simple et ce fichier yaml est si clair que tout dans cet exemple parle de lui-mĂȘme, il suffit d'y jeter un Ɠil :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
La moitiĂ© du temps, nous connaĂźtrons un retard de 7 secondes. Et ce n'est pas du tout la mĂȘme chose que si l'on insĂ©rait une commande sleep dans le code source, puisqu'Istio retarde en rĂ©alitĂ© la requĂȘte de 7 secondes. Étant donnĂ© qu'Istio prend en charge le traçage Jaeger, ce retard est perceptible dans l'interface utilisateur de Jaeger, comme le montre la capture d'Ă©cran ci-dessous. Faites attention Ă  la longue requĂȘte dans le coin supĂ©rieur droit du diagramme - sa durĂ©e est de 7.02 secondes :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Ce script vous permet de tester votre code dans des conditions de latence rĂ©seau. Et il est clair qu’en supprimant cette rĂšgle, on supprimera le dĂ©lai artificiel. Nous le rĂ©pĂ©tons, mais encore une fois, nous avons fait tout cela sans toucher en aucune façon au code source.

Ne recule pas et n'abandonne pas

Une autre fonctionnalitĂ© utile d'Istio pour l'ingĂ©nierie du chaos rĂ©side dans les appels rĂ©pĂ©tĂ©s au service un nombre de fois spĂ©cifiĂ©. Le but ici est de continuer Ă  essayer lorsque la premiĂšre requĂȘte se termine par une erreur 503 - et peut-ĂȘtre que la N-onziĂšme fois, nous aurons de la chance. Peut-ĂȘtre que le service a Ă©tĂ© interrompu pendant un certain temps pour une raison ou une autre. Oui, cette raison devrait ĂȘtre dĂ©terrĂ©e et Ă©liminĂ©e. Mais cela viendra plus tard, mais pour l’instant nous allons essayer de nous assurer que le systĂšme continue de fonctionner.

Nous voulons donc que le service gĂ©nĂšre une erreur 503 de temps en temps, puis Istio essaiera de le contacter Ă  nouveau. Et ici, nous avons clairement besoin d'un moyen de gĂ©nĂ©rer une erreur 503 sans toucher au code lui-mĂȘme...

ArrĂȘtez, attendez ! Nous venons de le faire.

Ce fichier fera en sorte que le service recommendation-v2 Ă©mette une erreur 503 la moitiĂ© du temps :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Évidemment, certaines requĂȘtes Ă©choueront :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Utilisons maintenant la fonction Istio Retry :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Cette rĂšgle de routage se rĂ©pĂšte trois fois Ă  deux secondes d'intervalle et devrait rĂ©duire (et idĂ©alement supprimer du radar) les erreurs 503 :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Pour rĂ©sumer : nous avons fait en sorte qu'Istio, dans un premier temps, gĂ©nĂšre une erreur 503 pour la moitiĂ© des requĂȘtes. Et deuxiĂšmement, le mĂȘme Istio fait trois tentatives pour recontacter le service lorsqu'une erreur 503 se produit. En consĂ©quence, tout fonctionne parfaitement. Ainsi, en utilisant la fonction RĂ©essayer, nous avons tenu notre promesse de ne pas abandonner et de ne pas abandonner.

Et oui, nous avons recommencĂ© sans toucher du tout au code. Tout ce dont nous avions besoin, c'Ă©tait de deux rĂšgles de routage Istio :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude

Comment ne pas décevoir l'utilisateur ou sept, n'en attendez pas un

Renversons maintenant la situation et envisageons un scĂ©nario dans lequel la seule chose que vous devez faire est de ne pas battre en retraite ou d’abandonner pendant une durĂ©e dĂ©terminĂ©e. Et puis il vous suffit d'arrĂȘter d'essayer de traiter la demande, afin de ne pas forcer tout le monde Ă  attendre un service lent. En d’autres termes, nous ne dĂ©fendrons pas une position perdue, mais nous nous replierons sur une ligne de rĂ©serve afin de ne pas dĂ©cevoir l’utilisateur du site et de ne pas le faire croupir dans l’ignorance.

Dans Istio, vous pouvez dĂ©finir un dĂ©lai d'expiration d'exĂ©cution des requĂȘtes. Si le service dĂ©passe ce dĂ©lai, une erreur 504 (Gateway Timeout) est renvoyĂ©e. Encore une fois, tout cela se fait via la configuration d'Istio. Mais nous devrons ajouter une commande sleep au code source du service (puis, bien sĂ»r, effectuer une reconstruction et un redĂ©ploiement) pour simuler le fonctionnement lent du service. HĂ©las, cela ne fonctionnera pas autrement.

Nous avons donc insĂ©rĂ© une veille de trois secondes dans le code du service de recommandation v2, reconstruit l'image correspondante et redĂ©ployĂ© le conteneur, et maintenant nous allons ajouter un dĂ©lai d'attente en utilisant la rĂšgle de routage Istio suivante :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Dans la capture d'Ă©cran ci-dessus, vous pouvez voir que nous renonçons Ă  essayer de contacter le service de recommandation si nous ne recevons pas de rĂ©ponse dans la seconde, c'est-Ă -dire avant que l'erreur 504 ne se produise. AprĂšs avoir appliquĂ© cette rĂšgle de routage (et ajoutĂ© un dĂ©lai de veille de trois secondes au code du service de recommandation :v2), nous obtenons ceci :

Traçage et surveillance dans Istio : les microservices et le principe d'incertitude
Nous rĂ©pĂ©tons encore, mais le dĂ©lai d'attente peut ĂȘtre dĂ©fini sans toucher en aucune façon au code source. Et le bonus supplĂ©mentaire ici est que vous pouvez dĂ©sormais modifier votre code pour rĂ©pondre au dĂ©lai d'attente et tester facilement ces modifications Ă  l'aide d'Istio.

Et maintenant tout est ensemble

Injecter un peu de chaos avec Istio est un excellent moyen de tester votre code et la fiabilité de votre systÚme dans son ensemble. Les modÚles de repli, de cloison et de disjoncteur, les mécanismes permettant de créer des pannes et des retards artificiels, ainsi que les nouvelles tentatives d'appel et les délais d'attente seront trÚs utiles lors de la création de systÚmes cloud tolérants aux pannes. Associés à Kubernetes et Red Hat OpenShift, ces outils vous aideront à affronter l'avenir en toute confiance.

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster