Terug naar microservices met Istio. Deel 1

Terug naar microservices met Istio. Deel 1

Opmerking. vert.: Service meshes zijn zeker een relevante oplossing geworden in de moderne infrastructuur voor applicaties die een microservice-architectuur volgen. Hoewel Istio misschien op de radar staat van veel DevOps-ingenieurs, is het een vrij nieuw product dat, hoewel uitgebreid in termen van functies die het biedt, mogelijk een aanzienlijke leercurve vereist. De Duitse ingenieur Rinor Maloku, verantwoordelijk voor cloud computing voor grote klanten bij telecommunicatiebedrijf Orange Networks, heeft een prachtige reeks materialen geschreven waarmee je snel en diep in Istio kunt duiken. Hij begint zijn verhaal met wat Istio in het algemeen kan doen en hoe je dat snel met eigen ogen kunt zien.

Istio β€” Een Open Source-project ontwikkeld in samenwerking met teams van Google, IBM en Lyft. Het lost de complexiteit op die zich voordoet in op microservices gebaseerde applicaties, zoals:

  • Verkeersmanagement: time-outs, nieuwe pogingen, taakverdeling;
  • veiligheid: authenticatie en autorisatie van eindgebruikers;
  • Waarneembaarheid: traceren, monitoren, loggen.

Dit alles kan op applicatieniveau worden opgelost, maar daarna is uw dienstverlening niet langer β€˜micro’. Alle extra inspanningen om deze problemen op te lossen zijn een verspilling van bedrijfsmiddelen die direct voor bedrijfswaarde kunnen worden gebruikt. Laten we eens kijken naar een voorbeeld:

Projectmanager: Hoe lang duurt het om een ​​feedbackfunctie toe te voegen?
Ontwikkelaar: Twee sprints.

MP: Wat?.. Het is gewoon RUW!
R: CRUD doen is het makkelijke gedeelte, maar we moeten nog steeds gebruikers en services authenticeren en autoriseren. Omdat het netwerk onbetrouwbaar is, moet u herhaalde verzoeken implementeren, evenals patroon van stroomonderbrekers bij klanten. Om ervoor te zorgen dat het hele systeem niet crasht, hebt u ook time-outs nodig schotten (voor meer details over beide genoemde patronen, zie verderop in het artikel - ca. vert.), en om problemen op te sporen, monitoring, tracering, […]

MP: Oh, laten we deze functie dan gewoon in de Productservice invoegen.

Ik denk dat het idee duidelijk is: het aantal stappen en moeite dat nodig is om één dienst toe te voegen is enorm. In dit artikel zullen we bekijken hoe Istio alle hierboven genoemde complexiteit (die niet als bedrijfslogica is bedoeld) uit services verwijdert.

Terug naar microservices met Istio. Deel 1

Noot: In dit artikel wordt ervan uitgegaan dat u praktische kennis van Kubernetes heeft. Anders raad ik aan om te lezen mijn kennismaking met Kubernetes en pas daarna verder met het lezen van dit materiaal.

Istio-idee

In een wereld zonder Istio doet de ene dienst directe verzoeken aan de andere, en in geval van een storing moet de dienst dit zelf afhandelen: een nieuwe poging doen, een time-out voorzien, een stroomonderbreker openen, enz.

Terug naar microservices met Istio. Deel 1
Netwerkverkeer in Kubernetes

Istio biedt een gespecialiseerde oplossing, volledig gescheiden van services en functionerend door de netwerkcommunicatie te verstoren. En zo implementeert het:

  • fout tolerantie: Op basis van de statuscode in het antwoord begrijpt het of het verzoek is mislukt en voert het het opnieuw uit.
  • Kanarie-uitrol: stuurt slechts een vast percentage van de verzoeken door naar de nieuwe versie van de service.
  • Monitoring en statistieken: Hoe lang duurde het voordat de service reageerde?
  • Tracering en waarneembaarheid: Voegt speciale headers toe aan elke aanvraag en traceert deze door het hele cluster.
  • veiligheid: Haalt JWT-token op, authenticeert en autoriseert gebruikers.

Dit zijn slechts enkele van de mogelijkheden (eigenlijk maar een paar!) om je te intrigeren. Laten we nu eens in de technische details duiken!

Istio-architectuur

Istio onderschept al het netwerkverkeer en past er een reeks regels op toe, waarbij een slimme proxy in de vorm van een zijspancontainer in elke pod wordt geplaatst. Proxy's die alle mogelijkheden activeren, vormen een Gegevensvlak, en ze kunnen dynamisch worden geconfigureerd met behulp van Controle vliegtuig.

Gegevensvlak

Door proxy's in pods te plaatsen, kan Istio gemakkelijk aan de vereisten voldoen die we nodig hebben. Laten we bijvoorbeeld de functies voor opnieuw proberen en de stroomonderbreker controleren.

Terug naar microservices met Istio. Deel 1
Hoe nieuwe pogingen en circuitonderbreking worden geΓ―mplementeerd in Envoy

Samenvattend:

  1. Gezant (we hebben het over een proxy die zich in een zijspancontainer bevindt, die wordt gedistribueerd als afzonderlijk produkt β€” ca. vert.) verzendt een verzoek naar het eerste exemplaar van service B en mislukt.
  2. Gezant Zijspan probeert het opnieuw (opnieuw proberen). (1)
  3. Het verzoek mislukt en wordt teruggestuurd naar de proxy die het heeft aangeroepen.
  4. Hierdoor wordt Circuit Breaker geopend en wordt de volgende service gebeld voor volgende verzoeken. (2)

Dit betekent dat u geen andere Retry-bibliotheek hoeft te gebruiken, dat u geen eigen implementatie van Circuit Breaking en Service Discovery in programmeertaal X, Y of Z hoeft te maken. Dit alles en nog veel meer is out-of-the-box beschikbaar in Istio en vereist niet geen wijzigingen in de code.

Geweldig! Nu wil je misschien met Istio op reis gaan, maar je hebt nog wat twijfels, open vragen. Als dit een universele oplossing is voor alle gelegenheden in het leven, dan heb je een natuurlijk vermoeden: al dergelijke oplossingen blijken immers in werkelijkheid voor elk geval ongeschikt te zijn.

En uiteindelijk vraag je: β€œIs het aanpasbaar?”

Nu je klaar bent voor de zeereis, laten we kennis maken met het Control Plane.

Controle vliegtuig

Het bestaat uit drie componenten: Piloot, Menger ΠΈ Citadel, die samenwerken om Envoys te configureren om verkeer te routeren, beleid af te dwingen en telemetriegegevens te verzamelen. Schematisch ziet het er allemaal zo uit:

Terug naar microservices met Istio. Deel 1
Interactie van besturingsvlak met datavlak

Envoys (dat wil zeggen datavlak) worden geconfigureerd met behulp van Kubernetes CRD (Aangepaste resourcedefinities) gedefinieerd door Istio en specifiek bedoeld voor dit doel. Wat dit voor u betekent, is dat ze gewoon een andere bron in Kubernetes lijken te zijn met een bekende syntaxis. Eenmaal aangemaakt, wordt deze hulpbron opgepikt door het controlevlak en toegepast op de gezanten.

Relatie van diensten met Istio

We hebben de relatie van Istio met diensten beschreven, maar niet andersom: hoe verhouden diensten zich tot Istio?

Eerlijk gezegd zijn de diensten zich net zo bewust van Istio's aanwezigheid als vissen van water als ze zich afvragen: "Wat is water eigenlijk?"

Terug naar microservices met Istio. Deel 1
illustratie Victoria Dimitrakopoulos: - Hoe vind je het water? - Wat is water eigenlijk?

U kunt dus een werkend cluster nemen en na het implementeren van de Istio-componenten zullen de services die zich daarin bevinden blijven werken, en na het verwijderen van deze componenten zal alles weer in orde zijn. Het is duidelijk dat u in dit geval de mogelijkheden van Istio verliest.

Genoeg theorie - laten we deze kennis in de praktijk brengen!

Istio in de praktijk

Istio vereist een Kubernetes-cluster met minimaal 4 vCPU's en 8 GB RAM beschikbaar. Om snel een cluster op te zetten en de instructies uit het artikel te volgen, raad ik aan Google Cloud Platform te gebruiken, dat nieuwe gebruikers biedt gratis $ 300.

Nadat u een cluster hebt gemaakt en de toegang tot Kubernetes hebt geconfigureerd via het consolehulpprogramma, kunt u Istio installeren via Helm-pakketbeheer.

Helm installatie

Installeer de Helm-client op uw computer, zoals beschreven in officiΓ«le documentatie. We zullen dit gebruiken om sjablonen te genereren voor het installeren van Istio in de volgende sectie.

Istio installeren

Download Istio-bronnen van nieuwste uitgave (de originele auteurslink naar versie 1.0.5 is gewijzigd naar de huidige, d.w.z. 1.0.6 - ca. vert.), extraheer de inhoud in één map, die ik voortaan zal noemen [istio-resources].

Om Istio-bronnen gemakkelijk te identificeren, maakt u een naamruimte in het K8s-cluster istio-system:

$ kubectl create namespace istio-system

Voltooi de installatie door naar de map te gaan [istio-resources] en voer het commando uit:

$ 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.yaml

Met deze opdracht worden de belangrijkste componenten van Istio naar een bestand uitgevoerd istio.yaml. We hebben de standaardsjabloon naar eigen wens aangepast, met de volgende parameters:

  • global.mtls.enabled geΓ―nstalleerd false (d.w.z. mTLS-authenticatie is uitgeschakeld - ongeveer)om ons dateringsproces te vereenvoudigen;
  • tracing.enabled omvat het traceren van verzoeken met behulp van Jaeger;
  • kiali.enabled installeert Kiali in een cluster om services en verkeer te visualiseren;
  • grafana.enabled installeert Grafana om verzamelde statistieken te visualiseren.

Laten we de gegenereerde bronnen gebruiken met de opdracht:

$ kubectl apply -f istio.yaml

De installatie van Istio op het cluster is voltooid! Wacht totdat alle peulen zich in de naamruimte bevinden istio-system zal kunnen Running of Completeddoor de onderstaande opdracht uit te voeren:

$ kubectl get pods -n istio-system

Nu zijn we klaar om verder te gaan in de volgende sectie, waar we de applicatie in gebruik zullen nemen.

Architectuur van de Sentimentanalyse-applicatie

Laten we het voorbeeld gebruiken van de Sentiment Analysis-microservicetoepassing die in het reeds genoemde wordt gebruikt Introductieartikel over Kubernetes. Het is complex genoeg om de capaciteiten van Istio in de praktijk te laten zien.

De applicatie bestaat uit vier microservices:

  1. Dienst SA-frontend, dat de frontend van een Reactjs-applicatie bedient;
  2. Dienst SA-WebApp, dat Sentimentanalyse-query's bedient;
  3. Dienst SA-logica, die zichzelf uitvoert sentiment analyse;
  4. Dienst SA-feedback, die feedback ontvangt van gebruikers over de nauwkeurigheid van de analyse.

Terug naar microservices met Istio. Deel 1

In dit diagram zien we naast services ook de Ingress Controller, die in Kubernetes binnenkomende verzoeken routeert naar de juiste services. Istio gebruikt een soortgelijk concept binnen zijn Ingress Gateway, waarover meer details volgen.

Een applicatie uitvoeren met een proxy van Istio

Voor verdere bewerkingen die in het artikel worden genoemd, kloont u uw repository istio-meesterschap. Het bevat de applicatie en manifesten voor Kubernetes en Istio.

Zijspannen inbrengen

Inbrengen kan automatisch of handmatig. Om zijspancontainers automatisch in te voegen, moet u een label aan de naamruimte toevoegen istio-injection=enabled, wat gedaan wordt met het volgende commando:

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

Nu wordt elke pod die in de standaardnaamruimte wordt geΓ―mplementeerd (default) krijgt zijn zijspancontainer. Om dit te verifiΓ«ren, gaan we de testapplicatie implementeren door naar de hoofdmap van de repository te gaan [istio-mastery] en voer het volgende commando uit:

$ 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 created

Nadat we de services hebben geΓ―mplementeerd, gaan we controleren of de pods twee containers hebben (met de service zelf en zijn zijspan) door de opdracht uit te voeren kubectl get pods en zorg ervoor dat dit onder de kolom staat READY opgegeven waarde 2/2, wat symboliseert dat beide containers actief zijn:

$ 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          12m

Visueel ziet het er als volgt uit:

Terug naar microservices met Istio. Deel 1
Gezant-proxy in een van de pods

Nu de applicatie actief is, moeten we inkomend verkeer in de applicatie laten binnenkomen.

Toegangsgateway

De best practice om dit te bereiken (verkeer in het cluster toestaan) is voltooid Toegangsgateway in Istio, dat zich aan de β€˜rand’ van het cluster bevindt en waarmee u Istio-functies kunt inschakelen, zoals routering, taakverdeling, beveiliging en monitoring van inkomend verkeer.

Het Ingress Gateway-onderdeel en de service die het extern doorstuurt, zijn tijdens de Istio-installatie in het cluster geΓ―nstalleerd. Voer het volgende uit om het externe IP-adres van de service te achterhalen:

$ 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.120

We blijven toegang krijgen tot de applicatie met behulp van dit IP-adres (ik zal het EXTERNAL-IP noemen), dus voor het gemak zullen we de waarde in een variabele schrijven:

$ EXTERNAL_IP=$(kubectl get svc -n istio-system 
  -l app=istio-ingressgateway 
  -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

Als u nu via een browser toegang probeert te krijgen tot dit IP-adres, ontvangt u de foutmelding Service Unavailable, omdat standaard blokkeert Istio al het binnenkomende verkeer, Gateway is nog niet gedefinieerd.

Gateway-bron

Gateway is een CRD (Custom Resource Definition) in Kubernetes, gedefinieerd na het installeren van Istio in het cluster en het mogelijk maken van de mogelijkheid om de poorten, het protocol en de hosts te specificeren waarvoor we inkomend verkeer willen toestaan.

In ons geval willen we HTTP-verkeer op poort 80 toestaan ​​voor alle hosts. De taak wordt geΓ―mplementeerd volgens de volgende definitie (http-gateway.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
- "*"

Deze configuratie behoeft geen uitleg behalve de selector istio: ingressgateway. Met deze selector kunnen we opgeven op welke Ingress Gateway de configuratie moet worden toegepast. In ons geval is dit de Ingress Gateway-controller, die standaard in Istio werd geΓ―nstalleerd.

De configuratie wordt toegepast door de volgende opdracht aan te roepen:

$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created

De gateway geeft nu toegang tot poort 80, maar heeft geen idee waar de verzoeken naartoe moeten worden gerouteerd. Hiervoor heb je nodig virtuele diensten.

VirtualService-bron

De VirtualService vertelt de Ingress Gateway hoe aanvragen moeten worden gerouteerd die binnen het cluster zijn toegestaan.

Verzoeken aan onze applicatie die via http-gateway binnenkomen, moeten naar de sa-frontend-, sa-web-app- en sa-feedback-services worden gestuurd:

Terug naar microservices met Istio. Deel 1
Routes die moeten worden geconfigureerd met VirtualServices

Laten we eens kijken naar de verzoeken die naar SA-Frontend moeten worden verzonden:

  • Exacte match onderweg / moet naar SA-Frontend worden gestuurd om index.html op te halen;
  • Vooraf ingestelde paden /static/* moet naar SA-Frontend worden verzonden om statische bestanden te ontvangen die in de frontend worden gebruikt, zoals CSS en JavaScript;
  • Paden die overeenkomen met reguliere expressies '^.*.(ico|png|jpg)$', moet naar SA-Frontend worden gestuurd, omdat Dit zijn de afbeeldingen die op de pagina worden weergegeven.

De implementatie wordt bereikt door de volgende configuratie (sa-virtualservice-external.yaml):

kind: VirtualService
metadata:
  name: sa-external-services
spec:
  hosts:
  - "*"
  gateways:
  - http-gateway                      # 1
  http:
  - match:
    - uri:
        exact: /
    - uri:
        exact: /callback
    - uri:
        prefix: /static
    - uri:
        regex: '^.*.(ico|png|jpg)

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

  1. Π­Ρ‚ΠΎΡ‚ VirtualService относится ΠΊ запросам, приходящим Ρ‡Π΅Ρ€Π΅Π· http-gateway;
  2. Π’ destination опрСдСляСтся сСрвис, ΠΊΡƒΠ΄Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ запросы.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π²Ρ‹ΡˆΠ΅ хранится Π² Ρ„Π°ΠΉΠ»Π΅ sa-virtualservice-external.yaml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ содСрТит настройки для ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² SA-WebApp ΠΈ SA-Feedback, Π½ΠΎ Π±Ρ‹Π» сокращён здСсь Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ для лаконичности. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ VirtualService Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Когда ΠΌΡ‹ примСняСм рСсурсы Istio, Kubernetes API Server создаёт событиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Istio Control Plane, ΠΈ ΡƒΠΆΠ΅ послС этого новая конфигурация примСняСтся ΠΊ прокси-сСрвСрам Envoy ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ pod'Π°. А ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Ingress Gateway прСдставляСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ Envoy, сконфигурированным Π² Control Plane. Всё это Π½Π° схСмС выглядит Ρ‚Π°ΠΊ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Istio-IngressGateway для ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ запросов

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Sentiment Analysis стало доступным ΠΏΠΎ http://{EXTERNAL-IP}/. НС ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅, Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ статус Not Found: ΠΈΠ½ΠΎΠ³Π΄Π° трСбуСтся Ρ‡ΡƒΡ‚ΡŒ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ конфигурация вступила Π² силу ΠΈ кэши Envoy обновились.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ, ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ (Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для наглядности Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… дСйствиях β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².).

Kialiβ€Š: Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² административный интСрфСйс Kiali, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ kubectl port-forward 
    $(kubectl get pod -n istio-system -l app=kiali 
    -o jsonpath='{.items[0].metadata.name}') 
    -n istio-system 20001

… ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ http://localhost:20001/, залогинившись ΠΏΠΎΠ΄ admin/admin. Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… возмоТностСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Istio, Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвисов ΠΏΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, собранной ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сСтСвых запросов, получСния ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° вопросы Β«ΠšΡ‚ΠΎ ΠΊ ΠΊΠΎΠΌΡƒ обращаСтся?Β», Β«Π£ ΠΊΠ°ΠΊΠΎΠΉ вСрсии сСрвиса Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ сбои?Β» ΠΈ Ρ‚.ΠΏ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ возмоТности Kiali ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС β€” ΠΊ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ с Grafana.

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1

Grafana: визуализация ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ

Π‘ΠΎΠ±Ρ€Π°Π½Π½Ρ‹Π΅ Π² Istio ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Prometheus ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с Grafana. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² административный интСрфСйс Grafana, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½ΠΈΠΆΠ΅, послС Ρ‡Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ http://localhost:3000/:

$ kubectl -n istio-system port-forward 
    $(kubectl -n istio-system get pod -l app=grafana 
    -o jsonpath={.items[0].metadata.name}) 3000

ΠšΠ»ΠΈΠΊΠ½ΡƒΠ² Π½Π° мСню Home слСва свСрху ΠΈ Π²Ρ‹Π±Ρ€Π°Π² Istio Service Dashboard Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с сСрвиса sa-web-app, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° собранныС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1

Π—Π΄Π΅ΡΡŒ нас ΠΆΠ΄Ρ‘Ρ‚ пустоС ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ скучноС прСдставлСниС β€” руководство Π½ΠΈΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠ΅ Π½Π΅ ΠΎΠ΄ΠΎΠ±Ρ€ΠΈΡ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ создадим Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ while true; do 
    curl -i http://$EXTERNAL_IP/sentiment 
    -H "Content-type: application/json" 
    -d '{"sentence": "I love yogobella"}'; 
    sleep .8; done

Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ симпатичныС Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Π° Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈΠΌ β€” Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструмСнты Prometheus для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ Grafana для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ, Ρ‡Ρ‚ΠΎ позволят Π½Π°ΠΌ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, состоянии Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΡ…/Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ сСрвисов Π½Π° протяТСнии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

НаконСц, посмотрим Π½Π° трассировку запросов Π² сСрвисах.

Jaegerβ€Š: трассировка

Врассировка Π½Π°ΠΌ потрСбуСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ большС Ρƒ нас сСрвисов, Ρ‚Π΅ΠΌ слоТнСС Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ сбоя. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° простой случай ΠΈΠ· ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½ΠΈΠΆΠ΅:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
Π’ΠΈΠΏΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ случайного Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ запроса

Запрос ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚, ΠΏΠ°Π΄Π°Π΅Ρ‚ β€” Π² Ρ‡Ρ‘ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°? ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сСрвис? Или Π²Ρ‚ΠΎΡ€ΠΎΠΉ? Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Π² ΠΎΠ±ΠΎΠΈΡ… β€” Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π»ΠΎΠ³ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ. Как часто Π²Ρ‹ Π»ΠΎΠ²ΠΈΠ»ΠΈ сСбя Π·Π° Ρ‚Π°ΠΊΠΈΠΌ занятиСм? Наша Ρ€Π°Π±ΠΎΡ‚Π° большС ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π° Π½Π΅ разработчиков…

Π­Ρ‚ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространённая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² микросСрвисах ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ½Π° распрСдСлёнными систСмами трассировки, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сСрвисы ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, послС Ρ‡Π΅Π³ΠΎ эта информация пСрСнаправляСтся Π² систСму трассировки, Π³Π΄Π΅ ΠΎΠ½Π° сопоставляСтся с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ запроса. Π’ΠΎΡ‚ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
Для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ запроса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ TraceId

Π’ Istio ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Jaeger Tracer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ нСзависимый ΠΎΡ‚ Π²Π΅Π½Π΄ΠΎΡ€ΠΎΠ² Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ OpenTracing API. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйсу Jaeger ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ kubectl port-forward -n istio-system 
    $(kubectl get pod -n istio-system -l app=jaeger 
    -o jsonpath='{.items[0].metadata.name}') 16686

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° http://localhost:16686/ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ сСрвис sa-web-app. Если сСрвис Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню β€” проявитС/сгСнСрируйтС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π½Π° страницС ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ интСрфСйс. ПослС этого Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Find Traces, которая ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ самыС послСдниС трСйсы β€” Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ любой β€” покаТСтся дСтализированная информация ΠΏΠΎ всСм трСйсам:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1

Π­Ρ‚ΠΎΡ‚ трСйс ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚:

  1. Запрос ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² istio-ingressgateway (это ΠΏΠ΅Ρ€Π²ΠΎΠ΅ взаимодСйствиС с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· сСрвисов, ΠΈ для запроса гСнСрируСтся Trace ID), послС Ρ‡Π΅Π³ΠΎ шлюз направляСт запрос Π² сСрвис sa-web-app.
  2. Π’ сСрвисС sa-web-app запрос подхватываСтся Envoy sidecar'ΠΎΠΌ, создаётся Β«Ρ€Π΅Π±Ρ‘Π½ΠΎΠΊΒ» Π² span'Π΅ (поэтому ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π² трСйсах) ΠΈ пСрСнаправляСтся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ sa-web-app. (Span β€” логичСская Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Jaeger, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, врСмя Π½Π°Ρ‡Π°Π»ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π΅Ρ‘ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Span'Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ упорядочСнными. ΠžΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ацикличСский Π³Ρ€Π°Ρ„ ΠΈΠ· span'ΠΎΠ² ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ trace. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².)
  3. Π—Π΄Π΅ΡΡŒ запрос обрабатываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ sentimentAnalysis. Π­Ρ‚ΠΈ трСйсы ΡƒΠΆΠ΅ сгСнСрированы ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚.Π΅. для Π½ΠΈΡ… ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ измСнСния Π² ΠΊΠΎΠ΄Π΅.
  4. Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° инициируСтся POST-запрос Π² sa-logic. Trace ID Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Ρ€ΠΎΡˆΠ΅Π½ ΠΈΠ· sa-web-app.
  5. …

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: На 4 шагС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, сгСнСрированныС Istio, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ запросы, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
(A) Π—Π° проброс Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Istio; (B) Π—Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ сСрвисы

Istio Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‚.ΠΊ. Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ для входящих запросов, создаёт Π½ΠΎΠ²Ρ‹Π΅ span'Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ sidecare'Π΅ ΠΈ пробрасываСт ΠΈΡ…. Однако Π±Π΅Π· Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвисов ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ трассировки запроса Π±ΡƒΠ΄Π΅Ρ‚ утСрян.

НСобходимо ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ (ΠΏΡ€ΠΎΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ:

x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context

Π­Ρ‚ΠΎ нСслоТная Π·Π°Π΄Π°Ρ‡Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ для упрощСния Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ сущСствуСт мноТСство Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² сСрвисС sa-web-app ΠΊΠ»ΠΈΠ΅Π½Ρ‚ RestTemplate пробрасываСт эти Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Ссли просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Jaeger ΠΈ OpenTracing Π² Π΅Π³ΠΎ зависимости.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Sentiment Analysis дСмонстрируСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Flask, Spring ΠΈ ASP.NET Core.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° стало ясно, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ (ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ»), рассмотрим вопросы Ρ‚ΠΎΠ½ΠΊΠΎ настраиваСмой ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, управлСния сСтСвым Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ, бСзопасности ΠΈ Ρ‚.ΠΏ.!

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠΎΠ± этом Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΏΠΎ Istio ΠΎΡ‚ Rinor Maloku, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π² нашСм Π±Π»ΠΎΠ³Π΅ Π² блиТайшСС врСмя. UPDATE (14 ΠΌΠ°Ρ€Ρ‚Π°): Вторая Ρ‡Π°ΡΡ‚ΡŒ ΡƒΠΆΠ΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π°.

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

route:
- destination:
host: sa-frontend # 2
port:
number: 80

Belangrijke punten:

  1. Deze VirtualService verwijst naar aanvragen die binnenkomen http-gateway;
  2. Π’ destination Er wordt bepaald naar welke dienst verzoeken worden verzonden.

Noot: De bovenstaande configuratie wordt opgeslagen in een bestand sa-virtualservice-external.yaml, dat ook instellingen bevat voor routing in SA-WebApp en SA-Feedback, maar hier in het artikel kortheidshalve is ingekort.

Laten we VirtualService toepassen door te bellen:


Noot: Wanneer we Istio-bronnen verbruiken, creΓ«ert de Kubernetes API Server een gebeurtenis die wordt ontvangen door het Istio Control Plane, en daarna wordt de nieuwe configuratie toegepast op de Envoy-proxy's van elke pod. En de Ingress Gateway-controller lijkt een andere Envoy te zijn die is geconfigureerd in het besturingsvlak. In het diagram ziet dit er allemaal zo uit:

Terug naar microservices met Istio. Deel 1
Istio-IngressGateway-configuratie voor aanvraagroutering

De applicatie Sentimentanalyse is nu beschikbaar op http://{EXTERNAL-IP}/. Maak je geen zorgen als je de status Niet gevonden krijgt: Soms duurt het iets langer voordat de configuratie van kracht wordt en de Envoy-caches worden bijgewerkt.

Voordat u doorgaat, speelt u een beetje met de app om verkeer te genereren. (de aanwezigheid ervan is noodzakelijk voor de duidelijkheid bij volgende acties - ca. vert.).

Kiali: waarneembaarheid

Om naar de Kiali-beheerinterface te gaan, voert u de volgende opdracht uit:


... en geopend http://localhost:20001/, inloggen als admin/admin. Hier vindt u veel handige functies, bijvoorbeeld om de configuratie van Istio-componenten te controleren, services te visualiseren met behulp van informatie verzameld door het onderscheppen van netwerkverzoeken, antwoorden te krijgen op de vragen "Wie neemt contact op met wie?", "Welke versie van de service ervaart mislukkingen?” enzovoort. Ontdek in het algemeen de mogelijkheden van Kiali voordat u doorgaat met het visualiseren van statistieken met Grafana.

Terug naar microservices met Istio. Deel 1

Grafana: visualisatie van metrische gegevens

Metrieken verzameld in Istio gaan naar Prometheus en worden gevisualiseerd met Grafana. Om naar de administratieve interface van Grafana te gaan, voert u de onderstaande opdracht uit en opent u vervolgens http://localhost:3000/:


Door op het menu te klikken Home linksboven en selecteren Istio-servicedashboard in de linkerbovenhoek, begin met service sa-web-appom de verzamelde statistieken te bekijken:

Terug naar microservices met Istio. Deel 1

Wat ons hier te wachten staat is een lege en volkomen saaie voorstelling - het management zal dit nooit goedkeuren. Laten we een kleine belasting maken met de volgende opdracht:


Nu hebben we veel mooiere grafieken, en daarnaast prachtige Prometheus-tools voor monitoring en Grafana voor het visualiseren van statistieken waarmee we in de loop van de tijd meer kunnen leren over de prestaties, de gezondheid en de verbeteringen/degradatie van services.

Laten we tot slot eens kijken naar het traceren van verzoeken in services.

Jaeger: traceren

We zullen tracering nodig hebben, want hoe meer diensten we hebben, hoe moeilijker het is om de oorzaak van de storing te achterhalen. Laten we een eenvoudig geval bekijken op de onderstaande afbeelding:

Terug naar microservices met Istio. Deel 1
Typisch voorbeeld van een willekeurig mislukt verzoek

Het verzoek komt, valt - wat is de reden? Eerste dienst? Of de tweede? Er zijn uitzonderingen in beide - laten we naar de logs van beide kijken. Hoe vaak heb je jezelf erop betrapt dat je dit doet? Ons werk lijkt meer op softwaredetectives dan op ontwikkelaars...

Dit is een veelvoorkomend probleem bij microservices en wordt opgelost door gedistribueerde traceringssystemen, waarbij services een unieke header aan elkaar doorgeven, waarna deze informatie wordt doorgestuurd naar het traceringssysteem, waar deze wordt vergeleken met de aanvraaggegevens. Hier is een illustratie:

Terug naar microservices met Istio. Deel 1
TraceId wordt gebruikt om het verzoek te identificeren

Istio maakt gebruik van Jaeger Tracer, dat het leveranciersonafhankelijke OpenTracing API-framework implementeert. U krijgt toegang tot de Jaeger-gebruikersinterface met het volgende commando:


Ga nu naar http://localhost:16686/ en selecteer een dienst sa-web-app. Als de service niet in het vervolgkeuzemenu wordt weergegeven, toon/genereer dan activiteit op de pagina en update de interface. Klik daarna op de knop Vind sporen, die de nieuwste sporen zal tonen - selecteer er een - gedetailleerde informatie over alle sporen zal verschijnen:

Terug naar microservices met Istio. Deel 1

Dit spoor laat zien:

  1. Het verzoek komt binnen istio-ingangsgateway (dit is de eerste interactie met een van de diensten, en voor het verzoek wordt een Trace ID gegenereerd), waarna de gateway het verzoek naar de dienst stuurt sa-web-app.
  2. In dienst sa-web-app het verzoek wordt opgepikt door de Envoy-zijspan, er wordt een β€œkind” aangemaakt in de spanwijdte (daarom zien we het in de sporen) en doorgestuurd naar de container sa-web-app. (Span - een logische werkeenheid in Jaeger, die een naam, starttijd van de operatie en de duur ervan heeft. Overspanningen kunnen worden genest en geordend. Een gerichte acyclische grafiek van overspanningen vormt een spoor. β€” ca. vert.)
  3. Hier wordt het verzoek verwerkt door de methode sentiment analyse. Deze sporen worden al door de applicatie gegenereerd, d.w.z. ze hadden codewijzigingen nodig.
  4. Vanaf dit moment wordt er een POST-verzoek geΓ―nitieerd sa-logica. Trace-ID moet worden doorgestuurd van sa-web-app.
  5. ...

Noot: In stap 4 zou de applicatie de door Istio gegenereerde headers moeten zien en deze doorgeven aan volgende verzoeken, zoals weergegeven in de onderstaande afbeelding:

Terug naar microservices met Istio. Deel 1
(A) Istio is verantwoordelijk voor het doorsturen van headers; (B) Services zijn verantwoordelijk voor headers

Istio doet het meeste werk omdat... genereert headers voor inkomende verzoeken, creΓ«ert nieuwe spans in elke sidecare en stuurt deze door. Als u echter niet met headers binnen services werkt, gaat het volledige traceringspad van de aanvraag verloren.

Er moet rekening worden gehouden met de volgende headers:


Dit is geen moeilijke taak, maar om de implementatie ervan te vereenvoudigen is er al veel bibliotheken - In de sa-web-app-service stuurt de RestTemplate-client deze headers bijvoorbeeld door als u eenvoudigweg de Jaeger- en OpenTracing-bibliotheken toevoegt aan zijn verslavingen.

Merk op dat de toepassing Sentimentanalyse implementaties in Flask, Spring en ASP.NET Core demonstreert.

Nu het duidelijk is wat we out-of-the-box (of bijna out-of-the-box) krijgen, gaan we eens kijken naar verfijnde routing, netwerkverkeersbeheer, beveiliging, enz.!

Opmerking. vert.: Lees hierover in het volgende deel van materiaal over Istio van Rinor Maloku, waarvan vertalingen in de nabije toekomst op onze blog zullen volgen. UPDATE (14 maart): Het tweede deel is al gepubliceerd.

PS van vertaler

Lees ook op onze blog:

Bron: www.habr.com