{"id":55700,"date":"2020-01-26T00:00:00","date_gmt":"2020-01-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti"},"modified":"2020-02-18T14:03:50","modified_gmt":"2020-02-18T11:03:50","slug":"trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","title":{"rendered":"Tra\u00e7age et surveillance dans Istio : microservices et principe d'incertitude","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Le principe d'incertitude d'Heisenberg stipule qu'il est impossible de mesurer simultan\u00e9ment la position d'un objet et sa vitesse. Si un objet est en mouvement, il n'a pas de position. Et si une position existe, cela signifie qu'il n'a pas de vitesse.<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/617ace5f892b62652b404b24585537b0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nConcernant les microservices sur la plateforme Red Hat OpenShift (et g\u00e9r\u00e9s par Kubernetes), gr\u00e2ce aux logiciels open source appropri\u00e9s, ils peuvent simultan\u00e9ment rapporter leurs performances ainsi que leur bon fonctionnement. Cela ne contredit pas le vieux Heisenberg, mais \u00e9limine l'incertitude lors du travail avec des applications cloud. Istio permet d'organiser facilement le suivi et la surveillance de ces applications, afin de garder le contr\u00f4le sur tout.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>D\u00e9finissons la terminologie<\/h3>\n<p>\nSous <b>suivi<\/b> (Tracing) nous entendons l'enregistrement de l'activit\u00e9 syst\u00e9mique. Cela semble assez g\u00e9n\u00e9ral, mais en r\u00e9alit\u00e9, l'une des r\u00e8gles principales ici est de d\u00e9verser les donn\u00e9es de suivi dans le stockage appropri\u00e9, sans se soucier de leur formatage. Tout le travail de recherche et d'analyse des donn\u00e9es est confi\u00e9 \u00e0 leur consommateur. Dans Istio, le syst\u00e8me de suivi Jaeger est utilis\u00e9, mettant en \u0153uvre le mod\u00e8le de donn\u00e9es OpenTracing.<\/p>\n<p><b>Traces<\/b> (Traces, et le mot \u00ab traces \u00bb est utilis\u00e9 ici dans le sens de \u00ab pistes \u00bb, comme par exemple en expertise balistique) nous allons appeler les donn\u00e9es qui d\u00e9crivent enti\u00e8rement le passage d'une requ\u00eate ou d'une unit\u00e9 de travail, en d'autres termes, \u00ab de A \u00e0 Z \u00bb. Par exemple, tout ce qui se passe d\u00e8s que l'utilisateur appuie sur un bouton sur une page web, jusqu'au retour des donn\u00e9es, en incluant tous les microservices impliqu\u00e9s. On peut dire qu'une trace d\u00e9crit compl\u00e8tement (ou mod\u00e9lise) le passage d'une requ\u00eate aller-retour. Dans l'interface de Jaeger, les traces sont d\u00e9compos\u00e9es en \u00e9l\u00e9ments le long d'un axe temporel, un peu comme une cha\u00eene peut \u00eatre d\u00e9compos\u00e9e en maillons distincts. Sauf qu'au lieu de maillons, une trace est compos\u00e9e de ce qu'on appelle des spans.<\/p>\n<p><b>Span<\/b> \u2013 est l'intervalle entre le d\u00e9but de l'ex\u00e9cution d'une unit\u00e9 de travail et son ach\u00e8vement. En continuant l'analogie, on peut dire que chaque span repr\u00e9sente un maillon distinct de la cha\u00eene. Un span peut avoir (ou ne pas avoir) un ou plusieurs spans enfants. En cons\u00e9quence, le span de plus haut niveau (root span) aura la m\u00eame dur\u00e9e totale que la trace \u00e0 laquelle il se rapporte.<\/p>\n<p><b>Surveillance<\/b> \u2013 il s'agit en fait de l'observation de votre syst\u00e8me \u2013 \u00e0 travers l'interface utilisateur ou par des moyens d'automatisation. La base du monitoring r\u00e9side dans les donn\u00e9es de tra\u00e7age. Dans Istio, le monitoring est impl\u00e9ment\u00e9 via Prometheus et dispose d'une interface utilisateur correspondante. Prometheus prend en charge le monitoring automatique avec des alertes Alerts et Alert Managers.<\/p>\n<h3>Nous faisons des marques<\/h3>\n<p>\nPour que la tra\u00e7abilit\u00e9 soit possible, l'application doit cr\u00e9er un ensemble de spans. Ensuite, il faut les exporter vers Jaeger, afin que ce dernier puisse cr\u00e9er une repr\u00e9sentation visuelle de la tra\u00e7abilit\u00e9. Parmi d'autres choses, ces spans marquent le nom de l'op\u00e9ration ainsi que les horodatages de son d\u00e9but et de sa fin. Le transfert des spans se fait par une redirection des en-t\u00eates HTTP destin\u00e9s \u00e0 Jaeger des requ\u00eates entrantes vers les requ\u00eates sortantes. Selon le langage de programmation utilis\u00e9, un l\u00e9ger ajustement du code source des applications peut \u00eatre n\u00e9cessaire. Voici un exemple de code en Java (en utilisant le framework Spring Boot) qui ajoute les en-t\u00eates B3 (style Zipkin) \u00e0 votre requ\u00eate dans la classe de configuration Spring :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/2314e2d156dc9b9fdb299af2dac01f66.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLes param\u00e8tres d'en-t\u00eates suivants sont utilis\u00e9s :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/18f0a13af27665ec2d154ff4cff48157.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSi vous utilisez Java, vous n'avez pas besoin de modifier le code, mais il suffit d'ajouter quelques lignes dans le fichier POM de Maven et de d\u00e9finir des variables d'environnement. Voici les lignes \u00e0 ajouter dans le fichier POM.XML pour int\u00e9grer Jaeger Tracer Resolver :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/a63a634c2c22fc09a237cafc4873855d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLes variables d'environnement correspondantes sont d\u00e9finies dans le Dockerfile :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/7fe9046242d7e628342a6266e4a2f743.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nC'est tout, maintenant tout est configur\u00e9 et nos microservices commenceront \u00e0 g\u00e9n\u00e9rer des donn\u00e9es de tra\u00e7age.<\/p>\n<h3>Regardons dans les grandes lignes<\/h3>\n<p>\nIstio comprend un tableau de bord simple bas\u00e9 sur Grafana. Lorsque tout est configur\u00e9 et fonctionne sur la plateforme Red Hat OpenShift PaaS (dans notre exemple, Red Hat OpenShift et Kubernetes sont d\u00e9ploy\u00e9s sur minishift), ce tableau de bord se lance avec la commande suivante :<\/p>\n<pre><code class=\"plaintext\">ouvrir \"$(minishift openshift service grafana -u)\/d\/1\/istio-dashboard?refresh=5&amp;ord;Id=1\"\n<\/code><\/pre>\n<p>\nLe tableau de bord Grafana permet d'\u00e9valuer rapidement le fonctionnement du syst\u00e8me. Un extrait de ce tableau de bord est montr\u00e9 sur l'image ci-dessous :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/2c10cd23fd5166f437c2b3c1d50c6a18.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIci, nous pouvons voir que le microservice customer appelle le microservice preference v1, qui, \u00e0 son tour, appelle les microservices recommendation v1 et v2. Sur le tableau de bord Grafana, il y a un bloc Dashboard Row pour les m\u00e9triques de haut niveau, telles que le nombre total de requ\u00eates (Global Request Volume), le taux de r\u00e9ussite (success rates) et les erreurs 4xx. En outre, il y a une vue Server Mesh avec des graphiques pour chaque service et un bloc Services Row pour voir les d\u00e9tails de chaque conteneur pour chaque service.<\/p>\n<h3>Explorons maintenant plus en profondeur<\/h3>\n<p>\nAvec une tra\u00e7abilit\u00e9 Istio correctement configur\u00e9e, on peut dire qu'elle permet d'analyser la performance du syst\u00e8me presque \u00ab out of the box \u00bb. Dans l'interface utilisateur de Jaeger, vous pouvez visualiser les traces et voir \u00e0 quel point elles sont \u00e9tendues et profondes, ainsi que localiser visuellement les goulets d'\u00e9tranglement de performance. Lors de l'utilisation de Red Hat OpenShift sur la plateforme minishift, vous lancez l'interface Jaeger avec la commande suivante :<\/p>\n<pre><code class=\"plaintext\">minishift openshift service jaeger-query --in-browser\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/074fea646ad191f819a9a67a3f311c8f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nQue peut-on dire sur la tra\u00e7abilit\u00e9 sur cette capture d'\u00e9cran :<\/p>\n<ul>\n<li>Elle se divise en 7 spans.<\/li>\n<li>Le temps d'ex\u00e9cution total est de 6,99 ms.<\/li>\n<li>Le microservice recommendation, qui est le dernier de la cha\u00eene, consomme 0,69 ms.<\/li>\n<\/ul>\n<p>\nDes diagrammes de ce type permettent de comprendre rapidement une situation o\u00f9 un service fonctionnant mal nuit \u00e0 la performance de tout le syst\u00e8me.<\/p>\n<p>Et maintenant, compliquons la t\u00e2che et lan\u00e7ons deux instances du microservice recommendation:v2 avec la commande oc scale \u2014replicas=2 deployment\/recommendation-v2. Voici les pods que nous aurons apr\u00e8s cela :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/0ecb8d78d6967d0392de67be6553b870.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSi nous revenons maintenant \u00e0 Jaeger et d\u00e9veloppons le span pour le service recommendation, nous verrons sur quel pod les requ\u00eates sont rout\u00e9es. Ainsi, nous pouvons facilement localiser les ralentissements au niveau d'un pod sp\u00e9cifique. Il faut regarder le champ node_id :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/474da66c581692cd11070a1732ac5458.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>O\u00f9 et comment tout cela se d\u00e9place<\/h3>\n<p>\nNous passons maintenant \u00e0 l'interface Prometheus et, comme pr\u00e9vu, nous constatons que les requ\u00eates entre la deuxi\u00e8me et la premi\u00e8re version du service recommendation sont partag\u00e9es dans un rapport de 2:1, strictement selon le nombre de pods en fonctionnement. De plus, ce graphique changera dynamiquement lors de l'augmentation ou de la diminution des pods, ce qui sera particuli\u00e8rement utile lors d'un d\u00e9ploiement Canary (nous aborderons cette m\u00e9thode de d\u00e9ploiement plus en d\u00e9tail la prochaine fois).<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/c080fffd2398b0a2eac3e63665bdb0a7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Tout ne fait que commencer<\/h3>\n<p>\nAujourd'hui, nous avons \u00e0 peine effleur\u00e9 la mine d'informations utiles sur Jaeger, Grafana et Prometheus. C'\u00e9tait en r\u00e9alit\u00e9 notre objectif : vous orienter dans la bonne direction et vous ouvrir des perspectives sur Istio.<\/p>\n<p>Et rappelez-vous, tout cela est d\u00e9j\u00e0 int\u00e9gr\u00e9 dans Istio. Si vous utilisez certains langages de programmation (comme Java) et des frameworks (comme Spring Boot), vous pouvez tout mettre en \u0153uvre sans toucher au code des applications. Oui, le code devra \u00eatre l\u00e9g\u00e8rement modifi\u00e9 si vous utilisez d'autres langages, notamment Node.js ou C#. Mais \u00e9tant donn\u00e9 que le tra\u00e7age est l'une des exigences essentielles pour cr\u00e9er des syst\u00e8mes cloud fiables, vous devrez donc de toute fa\u00e7on ajuster le code, que vous ayez Istio ou non. Alors pourquoi ne pas d\u00e9ployer vos efforts de mani\u00e8re plus judicieuse ?<\/p>\n<p>Ne serait-ce que pour pouvoir r\u00e9pondre aux questions 'o\u00f9 ?' et '\u00e0 quelle vitesse ?' avec une certitude de 100%.<\/p>\n<h3>Ing\u00e9nierie du chaos dans Istio : c'\u00e9tait l'id\u00e9e originale<\/h3>\n<p><\/p>\n<h3>Savoir casser les choses aide \u00e0 faire en sorte qu'elles ne se cassent pas.<\/h3>\n<p>\nLe test de logiciel est \u00e0 la fois complexe et essentiel. D'un c\u00f4t\u00e9, tester la fonctionnalit\u00e9 (par exemple, si une fonction retourne le bon r\u00e9sultat) est une chose, mais tester en conditions de r\u00e9seau peu fiable est une tout autre affaire (on suppose souvent que le r\u00e9seau fonctionne sans interruption, et c'est l'une des plus grandes illusions concernant le calcul distribu\u00e9). L'un des d\u00e9fis dans cette t\u00e2che est de simuler des pannes dans le syst\u00e8me ou de les introduire intentionnellement, en pratiquant ce qu'on appelle l'injection de fautes. Cela peut se faire en modifiant le code source de l'application elle-m\u00eame. Mais alors, vous ne testerez pas votre code initial, mais une version con\u00e7ue pour simuler des \u00e9checs. Cela vous expose au risque de tomber dans les griffes mortelles de l'injection de fautes et d'\u00eatre confront\u00e9 aux geizenbugs \u2013 des bogues qui disparaissent lorsqu'on essaie de les d\u00e9tecter.<\/p>\n<p>Nous allons maintenant montrer comment Istio aide \u00e0 surmonter ces difficult\u00e9s facilement.<\/p>\n<h3>\u00c0 quoi cela ressemble quand tout fonctionne parfaitement.<\/h3>\n<p>\nConsid\u00e9rons le sc\u00e9nario suivant : nous avons deux pods pour notre microservice de recommandation, que nous avons pris dans un tutoriel sur Istio. Un pod est marqu\u00e9 comme v1 et l'autre comme v2. Comme vous pouvez le voir, tout fonctionne parfaitement pour l'instant :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/c50387b7cfd12298cfab8123f13b2ca4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Au fait, le chiffre \u00e0 droite est simplement un compteur d'appels pour chaque pod.)<\/p>\n<p>Mais ce n'est pas ce dont nous avons vraiment besoin, n'est-ce pas ? Eh bien, essayons de tout casser sans toucher au code source.<\/p>\n<h3>Nous provoquons des interruptions dans le service du microservice<\/h3>\n<p>\nVoici un fichier yaml pour une r\u00e8gle de routage Istio, qui \u00e9chouera dans la moiti\u00e9 des cas (erreur <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/fr\/server\/dts-los-angeles\/\"   title=\"de serveurs\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3597\">de serveurs<\/a> 503):<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/8fb3ed7f16ed7fd1a57b27dfc3bfd2da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNotez que nous sp\u00e9cifions explicitement qu'une erreur 503 doit \u00eatre retourn\u00e9e dans la moiti\u00e9 des cas.<\/p>\n<p>Voici \u00e0 quoi ressemblera la capture d'\u00e9cran de la commande curl ex\u00e9cut\u00e9e en boucle apr\u00e8s avoir activ\u00e9 cette r\u00e8gle pour simuler des \u00e9checs. Comme nous le voyons, la moiti\u00e9 des requ\u00eates retourne une erreur 503, quelle que soit la pod \u2013 v1 ou v2 \u2013 vers laquelle elles sont envoy\u00e9es :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/3d9760cf5abc7480ad3aab826c274766.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPour restaurer le fonctionnement normal, il suffit de supprimer cette r\u00e8gle, dans notre cas avec la commande istioctl delete routerule recommendation-503 -n tutorial. Ici, Tutorial est le nom du projet Red Hat OpenShift dans lequel se d\u00e9roule notre tutoriel sur Istio.<\/p>\n<h3>Nous introduisons des d\u00e9lais artificiels<\/h3>\n<p>\nLes erreurs 503 artificielles aident \u00e0 tester la r\u00e9silience du syst\u00e8me face aux pannes, mais la capacit\u00e9 \u00e0 pr\u00e9voir et \u00e0 g\u00e9rer les d\u00e9lais devrait vous impressionner encore plus. En effet, les d\u00e9lais surviennent plus fr\u00e9quemment dans la vie r\u00e9elle que les pannes. Un microservice qui fonctionne lentement est un fardeau qui affecte l'ensemble du syst\u00e8me. Gr\u00e2ce \u00e0 Istio, vous pouvez tester le code relatif \u00e0 la gestion des d\u00e9lais sans le modifier. Pour commencer, nous allons montrer comment proc\u00e9der en cas de d\u00e9lais r\u00e9seau introduits artificiellement.<\/p>\n<p>Notez qu'apr\u00e8s un tel test, vous pourriez avoir besoin (ou envie) d'am\u00e9liorer votre code. La bonne nouvelle ici, c'est que, dans ce cas, vous agirez de mani\u00e8re proactive, plut\u00f4t que r\u00e9active. Voil\u00e0 comment devrait se construire le cycle de d\u00e9veloppement : codage - test - feedback - codage - test\u2026<\/p>\n<p>Voici \u00e0 quoi ressemble la r\u00e8gle qui\u2026 Mais vous savez quoi ? Istio est si simple, et ce fichier yaml est si compr\u00e9hensible, que tout dans cet exemple parle de lui-m\u00eame, jetez juste un \u0153il :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/e077e891cbccc66ebc4d4c7b67a0f1ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDans la moiti\u00e9 des cas, nous aurons un d\u00e9lai de 7 secondes. Et ce n'est pas du tout la m\u00eame chose que si nous avions ins\u00e9r\u00e9 une commande sleep dans le code source, car Istio retarde r\u00e9ellement la requ\u00eate de 7 secondes. \u00c9tant donn\u00e9 qu'Istio prend en charge le suivi Jaeger, ce d\u00e9lai est clairement observable dans l'interface utilisateur de Jaeger, comme le montre l'\u00e9cran ci-dessous. Notez la longue requ\u00eate dans le coin sup\u00e9rieur droit du graphique \u2013 sa dur\u00e9e est de 7,02 secondes :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/97a7b33fb7e0455973c7fd1b2aefadf3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCe sc\u00e9nario permet de tester le code dans des conditions de latence r\u00e9seau. Et il est \u00e9vident qu'en supprimant cette r\u00e8gle, nous \u00e9liminerons la latence artificielle. R\u00e9p\u00e9tons, mais nous avons encore fait tout cela sans toucher au code source.<\/p>\n<h3>Ne pas reculer et ne pas abandonner<\/h3>\n<p>\nUne autre fonctionnalit\u00e9 utile pour l'ing\u00e9nierie du chaos d'Istio est la possibilit\u00e9 de r\u00e9essayer d'appeler le service un nombre sp\u00e9cifi\u00e9 de fois. L'id\u00e9e ici est de ne pas cesser les tentatives lorsque la premi\u00e8re requ\u00eate \u00e9choue avec une erreur 503 \u2013 et peut-\u00eatre qu'\u00e0 la N-\u00e8me tentative, nous aurons de la chance. Peut-\u00eatre que le service \u00e9tait juste \u00e0 plat pour une raison ou une autre. Oui, il faudrait d\u00e9couvrir et r\u00e9soudre cette raison. Mais c'est pour plus tard, pour l'instant essayons de faire en sorte que le syst\u00e8me continue de fonctionner.<\/p>\n<p>Donc, nous voulons que le service g\u00e9n\u00e8re de temps en temps une erreur 503, et qu'Istio essaie alors de se reconnecter. Il est clairement n\u00e9cessaire de trouver un moyen de g\u00e9n\u00e9rer une erreur 503 sans toucher au code m\u00eame...<\/p>\n<p>Stop, attendez ! Nous venons juste de le faire.<\/p>\n<p>Ce fichier fera en sorte que le service recommendation-v2 g\u00e9n\u00e8re une erreur 503 dans la moiti\u00e9 des cas :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/f446528f9c968e40cc2cf318cf0acde9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl est \u00e9vident qu'une partie des requ\u00eates \u00e9chouera :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/f998513746604beda241b8d6de2ed727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEt maintenant, utilisons la fonction Retry d'Istio :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/32e210b6ecbf4c1ecf121ee73e64ba35.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCette r\u00e8gle de routage effectue trois tentatives avec un intervalle de deux secondes et devrait r\u00e9duire (id\u00e9alement supprimer compl\u00e8tement) les erreurs 503 :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/7f9711c52949072b823399e59141cb64.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEn r\u00e9sum\u00e9 : nous avons fait en sorte qu'Istio, d'une part, g\u00e9n\u00e8re une erreur 503 pour la moiti\u00e9 des requ\u00eates. Et d'autre part, le m\u00eame Istio effectue trois tentatives pour se reconnecter au service en cas d'erreur 503. En cons\u00e9quence, tout fonctionne tr\u00e8s bien. Ainsi, en utilisant la fonction Retry, nous avons tenu notre promesse de ne pas reculer et de ne pas abandonner.<\/p>\n<p>Et oui, nous l'avons encore fait, sans toucher au code. Tout ce dont nous avions besoin, ce sont deux r\u00e8gles de routage d'Istio :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/c21a1cfd2d78ae4145a57d1cefcc6c59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Comment ne pas faire attendre l'utilisateur ou sept personnes ne pas attendre un autre<\/h3>\n<p>\nEt maintenant, retournons la situation et examinons le sc\u00e9nario o\u00f9 il est n\u00e9cessaire de ne pas reculer ni abandonner, mais seulement pendant un certain temps fixe. Ensuite, il faut simplement cesser d'essayer de traiter la demande, pour ne pas faire attendre tout le monde \u00e0 cause d'un service qui ralentit. En d'autres termes, nous ne prot\u00e9gerons pas une position perdue, mais nous reculerons vers un point de repli pour ne pas d\u00e9cevoir l'utilisateur du site et ne pas le forcer \u00e0 rester dans l'incertitude.<\/p>\n<p>Dans Istio, vous pouvez d\u00e9finir un timeout pour l'ex\u00e9cution d'une demande. Si le service d\u00e9passe ce timeout, une erreur 504 (Gateway Timeout) est renvoy\u00e9e \u2013 encore une fois, tout cela se fait via la configuration d'Istio. Mais nous devrons ajouter une commande sleep dans le code source du service (et ensuite, bien s\u00fbr, effectuer un rebuild et un redeploy), afin d'imiter un fonctionnement lent du service. Malheureusement, c'est la seule solution.<\/p>\n<p>Donc, nous avons ins\u00e9r\u00e9 un sleep de trois secondes dans le code du service recommendation v2, recompil\u00e9 l'image correspondante et effectu\u00e9 le redeploy du conteneur, et maintenant ajoutons un timeout \u00e0 l'aide de la r\u00e8gle de routage Istio suivante :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/c03fc452b98dd875a8a7d3ac561893ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDans l'\u00e9cran ci-dessus, on voit que nous abandonnons la tentative de contact avec le service recommendation si nous ne recevons pas de r\u00e9ponse dans un d\u00e9lai d'une seconde, c'est-\u00e0-dire avant m\u00eame que l'erreur 504 ne se produise. Apr\u00e8s l'application de cette r\u00e8gle de routage (et l'ajout du sleep de trois secondes dans le code du service recommendation:v2), nous obtenons ce qui suit :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age et surveillance dans Istio : microservices et principe d&#039;incertitude\" src=\"\/wp-content\/uploads\/2020\/01\/ed6e80052c67254718b1fde2bd873e71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEncore une fois, nous le r\u00e9p\u00e9tons, mais le timeout peut \u00eatre d\u00e9fini sans toucher au code source. Un bonus suppl\u00e9mentaire ici est que vous pouvez d\u00e9sormais modifier votre code pour qu'il r\u00e9agisse au timeout, et tester facilement ces am\u00e9liorations avec Istio.<\/p>\n<h3>Et maintenant, tout ensemble<\/h3>\n<p>\nIntroduire un peu de chaos avec Istio est un excellent moyen de tester votre code et la fiabilit\u00e9 de votre syst\u00e8me dans son ensemble. Les mod\u00e8les de fallback, de bulkhead et de circuit breaker, les m\u00e9canismes de cr\u00e9ation de pannes et de d\u00e9lais artificiels, ainsi que les appels r\u00e9p\u00e9t\u00e9s et les timeouts seront tr\u00e8s utiles lors de la cr\u00e9ation de syst\u00e8mes cloud r\u00e9silients. En combinaison avec Kubernetes et Red Hat OpenShift, ces outils vous aideront \u00e0 accueillir l'avenir avec confiance.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/485136\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0410 \u0435\u0441\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Red Hat OpenShift (\u0438 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Kubernetes), \u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u043e\u0444\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u043f\u043e\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55700","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 Istio: \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:50+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Tra\u00e7age et monitoring dans Istio : microservices et principe d'incertitude | ProHoster","description":"Le principe d'incertitude de Heisenberg stipule qu'il est impossible de mesurer simultan\u00e9ment la position d'un objet et sa vitesse. Si l'objet se d\u00e9place, il n'a pas de position d\u00e9finie.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 Istio: \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 | ProHoster","og:description":"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55700","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:38:32","updated":"2026-02-22 15:29:16","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=55700"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55700\/revisions"}],"predecessor-version":[{"id":162124,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55700\/revisions\/162124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=55700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=55700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=55700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}