
Note de traduction.: Les services mesh sont devenus une solution pertinente dans les infrastructures modernes pour les applications suivant une architecture de microservices. Bien qu'Istio soit dĂ©jĂ familier Ă de nombreux ingĂ©nieurs DevOps, c'est un produit relativement nouveau qui, en raison de la complexitĂ© des fonctionnalitĂ©s proposĂ©es, peut nĂ©cessiter un temps d'apprentissage considĂ©rable. Rinor Maloku, un ingĂ©nieur allemand responsable des solutions cloud pour de grands clients chez l'opĂ©rateur tĂ©lĂ©com Orange Networks, a Ă©crit un remarquable cycle de matĂ©riaux permettant d'explorer Istio de maniĂšre rapide et approfondie. Il commence par dĂ©crire ce qu'Istio peut faire et comment y jeter un Ćil rapidement.
Istio â Projet Open Source, dĂ©veloppĂ© en collaboration entre les Ă©quipes de Google, IBM et Lyft. Il rĂ©sout les complexitĂ©s qui se prĂ©sentent dans les applications basĂ©es sur des microservices, telles que :
- Gestion du trafic: timeouts, tentatives de répétition, répartition de la charge;
- Sécurité: authentification et autorisation des utilisateurs finaux;
- Observabilité: traçage, surveillance, journalisation.
Tous ces problĂšmes peuvent ĂȘtre rĂ©solus au niveau des applications, mais aprĂšs cela, vos services cesseront d'ĂȘtre « micro ». Tous les efforts supplĂ©mentaires pour rĂ©soudre ces problĂšmes reprĂ©sentent un coĂ»t en ressources pour l'entreprise, qui pourrait ĂȘtre utilisĂ© directement pour des valeurs commerciales. Prenons un exemple :
Chef de projet : Combien de temps pour ajouter la fonctionnalité de retour d'informations ?
Développeur : Deux sprints.Chef de projet : Quoi ?.. C'est juste du CRUD !
DĂ©veloppeur : Faire le CRUD est la partie simple de la tĂąche, mais nous devons Ă©galement authentifier et autoriser les utilisateurs et les services. Ătant donnĂ© que le rĂ©seau est peu fiable, il sera nĂ©cessaire d'implĂ©menter des requĂȘtes rĂ©pĂ©tĂ©es, ainsi que dans les clients. De plus, pour s'assurer que l'ensemble du systĂšme ne tombe pas, des timeouts et des (voir plus sur les deux modĂšles mentionnĂ©s plus loin dans l'article â note de traduction.), et pour dĂ©tecter les problĂšmes, il faudra de la surveillance, du traçage, [âŠ]Chef de projet : Oh, insĂ©rons simplement cette fonctionnalitĂ© dans le service Product.
Je pense que l'idée est claire : le volume d'étapes et d'efforts nécessaires pour ajouter un service est énorme. Dans cet article, nous examinerons comment Istio élimine toutes les complexités mentionnées ci-dessus (qui ne relÚvent pas de la logique métier) des services.

Remarque: L'article suppose que vous avez des connaissances pratiques sur Kubernetes. Sinon, je vous recommande de lire et seulement aprÚs cela de continuer la lecture de ce matériel.
L'idée d'Istio
Dans un monde sans Istio, un service fait des requĂȘtes directes Ă un autre, et en cas d'Ă©chec, le service doit le gĂ©rer lui-mĂȘme : rĂ©essayer, prĂ©voir un dĂ©lai d'attente, ouvrir un circuit breaker, etc.

Le trafic réseau dans Kubernetes
Istio propose une solution spĂ©cialisĂ©e, entiĂšrement dissociĂ©e des services et fonctionnant par intervention dans les interactions rĂ©seau. Ainsi, il met en Ćuvre :
- RĂ©silience: en s'appuyant sur le code d'Ă©tat dans la rĂ©ponse, il comprend si la requĂȘte a Ă©chouĂ©, et la rĂ©exĂ©cute.
- DĂ©ploiements canari: redirige un nombre fixe de requĂȘtes vers la nouvelle version du service.
- Surveillance et métriques: combien de temps le service a-t-il mis à répondre ?
- Traçage et observabilitĂ©: ajoute des en-tĂȘtes spĂ©ciaux Ă chaque requĂȘte et les trace dans le cluster.
- Sécurité: extrait le jeton JWT, authentifie et autorise les utilisateurs.
Ce ne sont là que quelques-unes des capacités (vraiment, seulement quelques-unes !) pour vous intriguer. Maintenant, plongeons dans les détails techniques !
Architecture d'Istio
Istio intercepte tout le trafic rĂ©seau et applique un ensemble de rĂšgles, en insĂ©rant dans chaque pod un proxy intelligent sous forme de conteneur sidecar. Les proxies, qui activent toutes les fonctionnalitĂ©s, forment le Data Plane, et ils peuvent ĂȘtre configurĂ©s dynamiquement Ă l'aide de Control Plane.
le Data Plane
Les proxies insérés dans les pods permettent à Istio d'atteindre facilement les exigences nécessaires. Par exemple, vérifions les fonctionnalités de réessai et de circuit breaker.

Comment les retries et le circuit breaking sont réalisés dans Envoy
En résumé :
- Envoy (il s'agit du proxy situĂ© dans le conteneur sidecar, qui est Ă©galement diffusĂ© comme â n.d.t.) envoie une requĂȘte au premier instance du service B et un Ă©chec se produit.
- Envoy Sidecar tente de réessayer (retry). (1)
- La requĂȘte Ă©chouĂ©e retourne au proxy qui l'a appelĂ©e.
- C'est ainsi que s'ouvre le Circuit Breaker et que le service suivant est appelĂ© pour les requĂȘtes ultĂ©rieures. (2)
Cela signifie que vous n'aurez pas à utiliser une autre bibliothÚque Retry, pas besoin de créer votre propre implémentation de Circuit Breaking et de Service Discovery dans le langage de programmation X, Y ou Z. Tout cela et bien plus est disponible en standard dans Istio et ne nécessite pas aucun changement dans le code.
Génial ! Maintenant, vous pourriez vouloir partir en voyage avec Istio, mais vous avez encore des doutes, des questions ouvertes. Si c'est une solution universelle pour tous les cas, vous pouvez alors avoir un soupçon légitime : aprÚs tout, toutes ces solutions se révÚlent souvent inadaptées à un cas particulier.
Et enfin, vous vous demandez : « Est-ce qu'on peut le configurer ? »
Vous ĂȘtes maintenant prĂȘt pour un voyage en mer â et dĂ©couvrons le Control Plane.
Control Plane
Il se compose de trois composants : Pilot, Mixer et Citadel, qui travaillent ensemble pour configurer les Envoy pour le routage du trafic, appliquer des politiques et collecter des données télémétriques. Schématiquement, cela ressemble à ceci :

Interaction entre Control Plane et Data Plane
Les Envoy (c'est-à -dire le data plane) sont configurés à l'aide de (Custom Resource Definitions), définis par Istio et spécialement conçus à cet effet. Pour vous, cela signifie qu'ils sont présentés comme une ressource supplémentaire dans Kubernetes avec une syntaxe familiÚre. AprÚs création, cette ressource sera récupérée par le control plane et appliquée aux Envoy.
Relation des services avec Istio
Nous avons décrit la relation d'Istio avec les services, mais qu'en est-il de l'inverse : comment les services perçoivent-ils Istio ?
HonnĂȘtement, la prĂ©sence d'Istio est aussi connue pour les services que l'eau pour les poissons, lorsqu'ils se demandent : « Qu'est-ce que l'eau, au juste ? ».

Illustration : â Comment trouvez-vous l'eau ? â Qu'est-ce que l'eau, au juste ?
Ainsi, vous pouvez prendre un cluster opĂ©rationnel et, aprĂšs le dĂ©ploiement des composants d'Istio, les services qui s'y trouvent continueront de fonctionner, et aprĂšs leur suppression, tout ira de nouveau bien. Ăvidemment, vous perdrez alors les fonctionnalitĂ©s offertes par Istio.
Assez de thĂ©orie â mettons ce savoir en pratique !
Istio en pratique
Istio nĂ©cessite un cluster Kubernetes, oĂč au moins 4 vCPU et 8 Go de RAM sont disponibles. Pour crĂ©er rapidement un cluster et suivre les instructions de l'article, je vous recommande d'utiliser Google Cloud Platform, qui propose aux nouveaux utilisateurs .
AprÚs avoir créé le cluster et configuré l'accÚs à Kubernetes via l'outil en ligne de commande, vous pouvez installer Istio via le gestionnaire de packages Helm.
Installation de Helm
Installez le client Helm sur votre ordinateur, comme indiqué dans . Nous l'utiliserons pour générer les modÚles pour l'installation d'Istio dans la section suivante.
Installation d'Istio
TĂ©lĂ©chargez les ressources Istio Ă partir de (le lien d'origine pour la version 1.0.5 a Ă©tĂ© modifiĂ© pour la version actuelle, c'est-Ă -dire 1.0.6 â note du traducteur), extrayez le contenu dans un rĂ©pertoire que je vais appeler [istio-resources].
Pour faciliter l'identification des ressources Istio, créez dans le cluster K8s un espace de noms istio-system:
$ kubectl create namespace istio-systemTerminez l'installation en vous rendant dans le répertoire [istio-resources] et en exécutant la commande :
$ helm template install/kubernetes/helm/istio
--set global.mtls.enabled=false
--set tracing.enabled=true
--set kiali.enabled=true
--set grafana.enabled=true
--namespace istio-system > istio.yamlCette commande produira les composants clés d'Istio dans le fichier istio.yaml. Nous avons modifié le modÚle standard pour nous, en définissant les paramÚtres suivants :
-
global.mtls.enabledest dĂ©fini surfaux(c'est-Ă -dire que l'authentification mTLS est dĂ©sactivĂ©e â note du traducteur), afin de simplifier notre processus d'introduction ; -
tracing.enabledactive la traçabilitĂ© des requĂȘtes avec Jaeger ; -
kiali.enabledinstalle Kiali dans le cluster pour visualiser les services et le trafic ; -
grafana.enabledinstalle Grafana pour visualiser les métriques collectées.
Appliquez les ressources générées avec la commande :
$ kubectl apply -f istio.yamlL'installation d'Istio dans le cluster est terminée ! Attendez que tous les pod dans l'espace de noms istio-system soient en état Running ou Terminé, en exécutant la commande ci-dessous :
$ kubectl get pods -n istio-systemNous sommes maintenant prĂȘts Ă poursuivre dans la section suivante, oĂč nous allons dĂ©ployer et exĂ©cuter l'application.
Architecture de l'application d'analyse de sentiments
Utilisons l'exemple de l'application microservices d'analyse de sentiments, utilisée dans l' . Elle est suffisamment complexe pour démontrer les capacités d'Istio en pratique.
L'application se compose de quatre microservices :
- Service SA-Frontend, qui gĂšre le frontend de l'application sur Reactjs ;
- Service SA-WebApp, qui gĂšre les demandes d'analyse de sentiments ;
- Service SA-Logic, qui exécute le ;
- Service SA-Feedback, qui recueille des retours d'utilisateurs sur la précision de l'analyse effectuée.

Dans ce schĂ©ma, en plus des services, nous voyons Ă©galement l'Ingress Controller, qui dans Kubernetes, route les requĂȘtes entrantes vers les services correspondants. Dans Istio, un concept similaire est utilisĂ© au sein de l'Ingress Gateway, dont les dĂ©tails suivront.
Lancer une application avec le proxy d'Istio
Pour les opérations mentionnées dans cet article, clonez le dépÎt . Il contient l'application et les manifestes pour Kubernetes et Istio.
Insertion des sidecars
L'insertion peut ĂȘtre effectuĂ©e d'appliquer automatiquement ou manuellement. Pour une insertion automatique des conteneurs sidecar, il est nĂ©cessaire d'ajouter un label Ă l'espace de noms istio-injection=enabled, ce qui se fait avec la commande suivante :
$ kubectl label namespace default istio-injection=enabled
namespace/default labeledMaintenant, chaque pod qui sera déployé dans l'espace de noms par défaut (default) recevra son conteneur sidecar. Pour s'en assurer, déployons une application de test en naviguant vers le répertoire racine du dépÎt [istio-mastery] et en exécutant la commande suivante :
$ kubectl apply -f resource-manifests/kube
persistentvolumeclaim/sqlite-pvc created
deployment.extensions/sa-feedback created
service/sa-feedback created
deployment.extensions/sa-frontend created
service/sa-frontend created
deployment.extensions/sa-logic created
service/sa-logic created
deployment.extensions/sa-web-app created
service/sa-web-app createdAprĂšs le dĂ©ploiement des services, vĂ©rifions que les pods ont deux conteneurs (le service lui-mĂȘme et son sidecar) en exĂ©cutant la commande kubectl get pods et en s'assurant que la colonne READY indique la valeur 2/2, symbole signifiant que les deux conteneurs sont en cours d'exĂ©cution :
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sa-feedback-55f5dc4d9c-c9wfv 2/2 Running 0 12m
sa-frontend-558f8986-hhkj9 2/2 Running 0 12m
sa-logic-568498cb4d-2sjwj 2/2 Running 0 12m
sa-logic-568498cb4d-p4f8c 2/2 Running 0 12m
sa-web-app-599cf47c7c-s7cvd 2/2 Running 0 12mVisuellement, cela se présente ainsi :

Proxy Envoy dans l'un des pods
Maintenant que l'application est montée et fonctionne, nous devons autoriser le trafic entrant à entrer dans l'application.
Ingress Gateway
La meilleure pratique pour cela (autoriser le trafic dans le cluster) est via Ingress Gateway dans Istio, qui se trouve à la « frontiÚre » du cluster et permet d'activer pour le trafic entrant des fonctionnalités d'Istio telles que le routage, l'équilibrage de charge, la sécurité et la surveillance.
Le composant Ingress Gateway et le service qui le traverse ont été installés dans le cluster lors de l'installation d'Istio. Pour connaßtre l'adresse IP externe du service, exécutez :
$ kubectl get svc -n istio-system -l istio=ingressgateway
NAME TYPE CLUSTER-IP EXTERNAL-IP
istio-ingressgateway LoadBalancer 10.0.132.127 13.93.30.120Nous allons accéder à l'application via cette IP par la suite (je me référerai à elle comme EXTERNAL-IP), donc pour plus de commodité, notons la valeur dans une variable :
$ EXTERNAL_IP=$(kubectl get svc -n istio-system
-l app=istio-ingressgateway
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')Si vous essayez maintenant d'accéder à cette IP via un navigateur, vous obtiendrez une erreur Service Unavailable, car par défaut, Istio bloque tout le trafic entrant, tant qu'un Gateway n'est pas défini.
Ressource Gateway
Gateway est une CRD (Custom Resource Definition) dans Kubernetes, définie aprÚs l'installation d'Istio dans le cluster et qui active la possibilité d'indiquer les ports, les protocoles et les hÎtes pour lesquels nous souhaitons autoriser le trafic entrant.
Dans notre cas, nous voulons autoriser le trafic HTTP sur le port 80 pour tous les hÎtes. Cette tùche est réalisée avec la définition suivante ():
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: http-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"Cette configuration ne nécessite pas d'explications, sauf pour le sélecteur istio: ingressgateway. Avec ce sélecteur, nous pouvons indiquer à quel Ingress Gateway appliquer la configuration. Dans notre cas, il s'agit du contrÎleur Ingress Gateway qui a été installé par défaut dans Istio.
La configuration est appliquée en appelant la commande suivante :
$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway createdMaintenant, le gateway autorise l'accĂšs au port 80, mais n'a aucune idĂ©e de l'endroit oĂč acheminer les requĂȘtes. Pour cela, nous aurons besoin de Virtual Services.
Ressource VirtualService
VirtualService indique au Ingress Gateway comment router les requĂȘtes qui sont autorisĂ©es Ă l'intĂ©rieur du cluster.
Les requĂȘtes pour notre application, entrant via http-gateway, doivent ĂȘtre envoyĂ©es aux services sa-frontend, sa-web-app et sa-feedback :

Les routes qui doivent ĂȘtre configurĂ©es avec VirtualServices
Examinons les requĂȘtes qui doivent ĂȘtre dirigĂ©es vers SA-Frontend :
- Correspondance exacte par chemin
/doit ĂȘtre envoyĂ©e Ă SA-Frontend pour obtenir index.html ; - Les chemins avec prĂ©fixe
/static/*doivent ĂȘtre envoyĂ©s Ă SA-Frontend pour obtenir des fichiers statiques utilisĂ©s dans le frontend, tels que CSS et JavaScript ; - Les chemins correspondant Ă l'expression rĂ©guliĂšre
'^.*\.(ico|png|jpg)$', doivent ĂȘtre envoyĂ©s Ă SA-Frontend, car ce sont des images affichĂ©es sur la page.
La mise en Ćuvre est obtenue avec la configuration suivante ():
type: VirtualService metadata: nom: sa-external-services spec: hÎtes: - "*" passerelles: - http-gateway # 1 http: - correspondre: - uri: exact: \/ - uri: exact: \/callback - uri: prefix: \/static - uri: regex: '^.*.(ico|png|jpg) Points importants :Remarque: La configuration ci-dessus est stockée dans un fichier
- Ce VirtualService concerne les requĂȘtes arrivant via http-gateway;
- Dans
destinationle service est dĂ©terminĂ© oĂč les requĂȘtes sont envoyĂ©es.sa-virtualservice-external.yaml, qui contient Ă©galement des paramĂštres pour le routage dans SA-WebApp et SA-Feedback, mais a Ă©tĂ© abrĂ©gĂ© ici dans l'article pour concision. Appliquons VirtualService avec l'appel :$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml virtualservice.networking.istio.io/sa-external-services crééRemarque: Lorsque nous appliquons des ressources Istio, le serveur API Kubernetes crĂ©e un Ă©vĂ©nement qui est reçu par le plan de contrĂŽle Istio, et c'est seulement aprĂšs cela que la nouvelle configuration est appliquĂ©e aux serveurs proxy Envoy de chaque pod. Et le contrĂŽleur Ingress Gateway se prĂ©sente comme un autre Envoy configurĂ© dans le plan de contrĂŽle. Tout cela se prĂ©sente de la maniĂšre suivante :
Configuration d'Istio-IngressGateway pour le routage des requĂȘtesL'application d'Analyse de Sentiment est accessible Ă
http://{EXTERNAL-IP}/. Ne vous inquiĂ©tez pas si vous obtenez un statut Not Found : il faut parfois un peu plus de temps pour que la configuration prenne effet et que les caches Envoy se mettent Ă jour.Avant de continuer, travaillez un peu avec l'application pour gĂ©nĂ©rer du trafic (sa prĂ©sence est nĂ©cessaire pour la clartĂ© dans les prochaines actions â note de l'Ă©diteur).
Kiali : observabilité
Pour accéder à l'interface d'administration de Kiali, exécutez la commande suivante :
$ kubectl port-forward $(kubectl get pod -n istio-system -l app=kiali -o jsonpath='{.items[0].metadata.name}') -n istio-system 20001⊠et ouvrez , en vous connectant avec admin/admin. Ici, vous trouverez de nombreuses fonctionnalitĂ©s utiles, par exemple pour vĂ©rifier la configuration des composants Istio, visualiser les services basĂ©s sur les informations recueillies lors de l'interception des requĂȘtes rĂ©seau, obtenir des rĂ©ponses aux questions « Qui contacte qui ? », « Quelle version du service rencontre des Ă©checs ? », etc. En gĂ©nĂ©ral, explorez les fonctionnalitĂ©s de Kiali avant de progresser vers la visualisation des mĂ©triques avec Grafana.
Grafana : visualisation des métriques
Les métriques collectées dans Istio sont envoyées à Prometheus et visualisées avec Grafana. Pour accéder à l'interface d'administration de Grafana, exécutez la commande ci-dessous, puis ouvrez :
$ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath={.items[0].metadata.name}) 3000En cliquant sur le menu Accueil en haut à gauche et en sélectionnant Tableau de bord des services Istio dans le coin supérieur gauche, commencez par le service sa-web-app, pour voir les métriques collectées :
Nous aurons ici une reprĂ©sentation vide et totalement ennuyeuse â la direction ne l'approuvera jamais. CrĂ©ons donc une petite charge avec la commande suivante :
$ while true; do curl -i http://$EXTERNAL_IP/sentiment -H "Content-type: application/json" -d '{"sentence": "J'adore yogobella"}'; sleep .8; doneNous avons maintenant des graphiques beaucoup plus jolis, et en plus des outils remarquables de Prometheus pour la surveillance et Grafana pour la visualisation des métriques, ce qui nous permettra de connaßtre la performance, l'état de santé, les améliorations/dégùts dans le fonctionnement des services au fil du temps.
Enfin, regardons le traçage des requĂȘtes dans les services.
Jaeger : traçage
Le traçage est nécessaire parce que plus nous avons de services, plus il devient difficile d'arriver à la cause d'un échec. Regardons un simple cas dans l'image ci-dessous :
Exemple typique d'une requĂȘte Ă©chouĂ©e alĂ©atoirementLa requĂȘte arrive, Ă©choue â quelle en est la cause ? Premier service ? Ou deuxiĂšme ? Il y a des exceptions dans les deux â examinons les journaux de chacun. Ă quelle frĂ©quence vous ĂȘtes-vous surpris Ă faire cela ? Notre travail ressemble plus Ă celui de dĂ©tectives logiciels qu'Ă celui de dĂ©veloppeursâŠ
C'est un problĂšme courant dans les microservices et il est rĂ©solu par des systĂšmes de traçage distribuĂ©s, oĂč les services passent entre eux un en-tĂȘte unique, puis cette information est redirigĂ©e vers le systĂšme de traçage, oĂč elle est associĂ©e aux donnĂ©es de la requĂȘte. Voici une illustration :
Pour identifier la requĂȘte, on utilise un TraceIdDans Istio, le Jaeger Tracer est utilisĂ©, qui met en Ćuvre un cadre indĂ©pendant du fournisseur de l'API OpenTracing. Pour accĂ©der Ă l'interface utilisateur de Jaeger, vous pouvez utiliser la commande suivante :
$ kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686Maintenant, allez sur et sĂ©lectionnez le service sa-web-app. Si le service n'apparaĂźt pas dans le menu dĂ©roulant, gĂ©nĂ©rez une activitĂ© sur la page et rafraĂźchissez l'interface. AprĂšs cela, cliquez sur le bouton Find Traces, qui affichera les derniĂšres traces â sĂ©lectionnez-en une â des informations dĂ©taillĂ©es sur toutes les traces apparaĂźtront :
Cette trace montre :
- La requĂȘte arrive Ă istio-ingressgateway (c'est la premiĂšre interaction avec l'un des services, et pour la requĂȘte un Trace ID est gĂ©nĂ©rĂ©), aprĂšs quoi le passerelle redirige la requĂȘte vers le service sa-web-app.
- Dans le service sa-web-app la requĂȘte est prise en charge par le sidecar Envoy, un « enfant » est créé dans le span (c'est pourquoi nous le voyons dans les traces) et redirigĂ© vers le conteneur sa-web-app. ( â unitĂ© logique de travail dans Jaeger, portant un nom, une heure de dĂ©but d'opĂ©ration et sa durĂ©e. Les spans peuvent ĂȘtre imbriquĂ©s et ordonnĂ©s. Un graphique orientĂ© acyclique composĂ© de spans forme un trace. â note du traducteur)
- Ici, la requĂȘte est traitĂ©e par la mĂ©thode sentimentAnalysis. Ces traces ont dĂ©jĂ Ă©tĂ© gĂ©nĂ©rĂ©es par l'application, c'est-Ă -dire qu'elles nĂ©cessitaient des modifications dans le code.
- Ă partir de ce moment, une requĂȘte POST est initiĂ©e dans sa-logic. L'ID de la trace doit ĂȘtre transmis depuis sa-web-app.
- âŠ
Remarque: Ă la Ă©tape 4, l'application doit voir les en-tĂȘtes gĂ©nĂ©rĂ©s par Istio et les transmettre dans les requĂȘtes suivantes, comme illustrĂ© dans l'image ci-dessous :
(A) Istio est responsable de la transmission des en-tĂȘtes ; (B) Les en-tĂȘtes sont gĂ©rĂ©s par les servicesIstio effectue le travail principal, car il gĂ©nĂšre des en-tĂȘtes pour les requĂȘtes entrantes, crĂ©e de nouveaux spans dans chaque sidecar et les transmet. Cependant, sans gestion des en-tĂȘtes au sein des services, le chemin complet de traçage de la requĂȘte sera perdu.
Il est nĂ©cessaire de prendre en compte (de transmettre) les en-tĂȘtes suivants :
x-request-id x-b3-traceid x-b3-spanid x-b3-parentspanid x-b3-sampled x-b3-flags x-ot-span-contextCe n'est pas une tĂąche complexe, cependant pour simplifier sa mise en Ćuvre, il existe dĂ©jĂ â par exemple, dans le service sa-web-app, le client RestTemplate transmet ces en-tĂȘtes, simplement en ajoutant les bibliothĂšques Jaeger et OpenTracing dans .
Remarquez que l'application Sentiment Analysis démontre des implémentations sur Flask, Spring et ASP.NET Core.
Maintenant que nous avons clarifié ce que nous recevons de maniÚre standard (ou presque « de maniÚre standard »), examinons les questions de routage finement réglé, de gestion du trafic réseau, de sécurité, etc. !
Note de traduction.: lisez à ce sujet dans la prochaine partie des matériaux sur Istio de Rinor Maloku, dont les traductions suivront bientÎt sur notre blog. UPDATE (14 mars) : est déjà publiée.
P.S. de l'auteur
Lisez aussi dans notre blog :
- « Retour aux microservices avec Istio » : , ;
- «»;
- «»;
- «»;
- «».
Source : habr.com
route :
- destination :
host : sa-frontend # 2
port :
number : 80
Points importants :
- Ce VirtualService concerne les requĂȘtes arrivant via http-gateway;
- Dans
destinationle service est dĂ©terminĂ© oĂč les requĂȘtes sont envoyĂ©es.Remarque: La configuration ci-dessus est stockĂ©e dans un fichier
sa-virtualservice-external.yaml, qui contient également des paramÚtres pour le routage dans SA-WebApp et SA-Feedback, mais a été raccourci ici dans l'article pour la concision.Appliquons le VirtualService en l'appelant :
Remarque: Lorsque nous appliquons des ressources Istio, le serveur API Kubernetes crée un événement qui est reçu par le Plan de ContrÎle Istio, et ensuite la nouvelle configuration est appliquée aux proxys Envoy de chaque pod. Le contrÎleur Ingress Gateway se présente comme un autre Envoy, configuré dans le Plan de ContrÎle. Tout cela se présente comme suit :
Configuration d'Istio-IngressGateway pour le routage des requĂȘtesL'application d'Analyse de Sentiment est accessible Ă
http://{EXTERNAL-IP}/. Ne vous inquiĂ©tez pas si vous obtenez un statut Not Found : il faut parfois un peu plus de temps pour que la configuration prenne effet et que les caches Envoy se mettent Ă jour.Avant de continuer, travaillez un peu avec l'application pour gĂ©nĂ©rer du trafic (sa prĂ©sence est nĂ©cessaire pour la clartĂ© dans les prochaines actions â note de l'Ă©diteur).
Kiali : observabilité
Pour accéder à l'interface d'administration de Kiali, exécutez la commande suivante :
⊠et ouvrez , en vous connectant avec admin/admin. Ici, vous trouverez de nombreuses fonctionnalitĂ©s utiles, par exemple pour vĂ©rifier la configuration des composants Istio, visualiser les services basĂ©s sur les informations recueillies lors de l'interception des requĂȘtes rĂ©seau, obtenir des rĂ©ponses aux questions « Qui contacte qui ? », « Quelle version du service rencontre des Ă©checs ? », etc. En gĂ©nĂ©ral, explorez les fonctionnalitĂ©s de Kiali avant de progresser vers la visualisation des mĂ©triques avec Grafana.
Grafana : visualisation des métriques
Les métriques collectées dans Istio sont envoyées à Prometheus et visualisées avec Grafana. Pour accéder à l'interface d'administration de Grafana, exécutez la commande ci-dessous, puis ouvrez :
En cliquant sur le menu Accueil en haut à gauche et en sélectionnant Tableau de bord des services Istio dans le coin supérieur gauche, commencez par le service sa-web-app, pour voir les métriques collectées :
Nous aurons ici une reprĂ©sentation vide et totalement ennuyeuse â la direction ne l'approuvera jamais. CrĂ©ons donc une petite charge avec la commande suivante :
Nous avons maintenant des graphiques beaucoup plus jolis, et en plus des outils remarquables de Prometheus pour la surveillance et Grafana pour la visualisation des métriques, ce qui nous permettra de connaßtre la performance, l'état de santé, les améliorations/dégùts dans le fonctionnement des services au fil du temps.
Enfin, regardons le traçage des requĂȘtes dans les services.
Jaeger : traçage
Le traçage est nécessaire parce que plus nous avons de services, plus il devient difficile d'arriver à la cause d'un échec. Regardons un simple cas dans l'image ci-dessous :
Exemple typique d'une requĂȘte Ă©chouĂ©e alĂ©atoirementLa requĂȘte arrive, Ă©choue â quelle en est la cause ? Premier service ? Ou deuxiĂšme ? Il y a des exceptions dans les deux â examinons les journaux de chacun. Ă quelle frĂ©quence vous ĂȘtes-vous surpris Ă faire cela ? Notre travail ressemble plus Ă celui de dĂ©tectives logiciels qu'Ă celui de dĂ©veloppeursâŠ
C'est un problĂšme courant dans les microservices et il est rĂ©solu par des systĂšmes de traçage distribuĂ©s, oĂč les services passent entre eux un en-tĂȘte unique, puis cette information est redirigĂ©e vers le systĂšme de traçage, oĂč elle est associĂ©e aux donnĂ©es de la requĂȘte. Voici une illustration :
Pour identifier la requĂȘte, on utilise un TraceIdDans Istio, le Jaeger Tracer est utilisĂ©, qui met en Ćuvre un cadre indĂ©pendant du fournisseur de l'API OpenTracing. Pour accĂ©der Ă l'interface utilisateur de Jaeger, vous pouvez utiliser la commande suivante :
Maintenant, allez sur et sĂ©lectionnez le service sa-web-app. Si le service n'apparaĂźt pas dans le menu dĂ©roulant, gĂ©nĂ©rez une activitĂ© sur la page et rafraĂźchissez l'interface. AprĂšs cela, cliquez sur le bouton Find Traces, qui affichera les derniĂšres traces â sĂ©lectionnez-en une â des informations dĂ©taillĂ©es sur toutes les traces apparaĂźtront :
Cette trace montre :
- La requĂȘte arrive Ă istio-ingressgateway (c'est la premiĂšre interaction avec l'un des services, et pour la requĂȘte un Trace ID est gĂ©nĂ©rĂ©), aprĂšs quoi le passerelle redirige la requĂȘte vers le service sa-web-app.
- Dans le service sa-web-app la requĂȘte est interceptĂ©e par le sidecar Envoy, un « enfant » est créé dans le span (c'est pourquoi nous le voyons dans les traces) et est redirigĂ© vers le conteneur sa-web-app. ( â une unitĂ© logique de travail dans Jaeger, ayant un nom, un temps de dĂ©but d'opĂ©ration et sa durĂ©e. Les spans peuvent ĂȘtre imbriquĂ©s et ordonnĂ©s. Un graphe orientĂ© acyclique de spans forme une trace. â note de traduction.
- Ici, la requĂȘte est traitĂ©e par la mĂ©thode sentimentAnalysis. Ces traces ont dĂ©jĂ Ă©tĂ© gĂ©nĂ©rĂ©es par l'application, c'est-Ă -dire qu'elles nĂ©cessitaient des modifications dans le code.
- Ă partir de ce moment, une requĂȘte POST est initiĂ©e dans sa-logic. L'ID de la trace doit ĂȘtre transmis depuis sa-web-app.
- âŠ
Remarque: Ă la Ă©tape 4, l'application doit voir les en-tĂȘtes gĂ©nĂ©rĂ©s par Istio et les transmettre dans les requĂȘtes suivantes, comme illustrĂ© dans l'image ci-dessous :
(A) Istio est responsable de la transmission des en-tĂȘtes ; (B) Les en-tĂȘtes sont gĂ©rĂ©s par les servicesIstio effectue le travail principal, car il gĂ©nĂšre des en-tĂȘtes pour les requĂȘtes entrantes, crĂ©e de nouveaux spans dans chaque sidecar et les propage. Cependant, sans gestion des en-tĂȘtes Ă l'intĂ©rieur des services, le chemin complet de traçage de la requĂȘte sera perdu.
Il est nĂ©cessaire de prendre en compte (de transmettre) les en-tĂȘtes suivants :
Ce n'est pas une tĂąche complexe, cependant pour simplifier sa mise en Ćuvre, il existe dĂ©jĂ â par exemple, dans le service sa-web-app, le client RestTemplate transmet ces en-tĂȘtes, simplement en ajoutant les bibliothĂšques Jaeger et OpenTracing dans .
Remarquez que l'application Sentiment Analysis démontre des implémentations sur Flask, Spring et ASP.NET Core.
Maintenant que nous avons clarifié ce que nous recevons de maniÚre standard (ou presque « de maniÚre standard »), examinons les questions de routage finement réglé, de gestion du trafic réseau, de sécurité, etc. !
Note de traduction.: lisez à ce sujet dans la prochaine partie des matériaux sur Istio de Rinor Maloku, dont les traductions suivront bientÎt sur notre blog. UPDATE (14 mars) : est déjà publiée.
P.S. de l'auteur
Lisez aussi dans notre blog :
- « Retour aux microservices avec Istio » : , ;
- «»;
- «»;
- «»;
- «».
Source : habr.com







