Let wel. vertaal.: Diensnetwerke het beslis 'n warm onderwerp geword in vandag se infrastruktuur vir toepassings wat mikrodiensargitektuur volg. Alhoewel Istio dalk op die radar van baie DevOps-ingenieurs is, is dit 'n taamlik nuwe produk wat, hoewel kompleks in terme van kenmerke wat dit bied, 'n aansienlike hoeveelheid tyd kan neem om te leer ken. Die Duitse ingenieur Rinor Maloku, wat in beheer is van wolkrekenaars vir groot kliΓ«nte by die telekommunikasiemaatskappy Orange Networks, het 'n wonderlike reeks materiaal geskryf wat jou toelaat om vinnig en diep in Istio te duik. Hy begin sy storie met wat Istio kan doen en hoe jy dit vinnig met jou eie oΓ« kan sien.
Istio β Open Source-projek, ontwikkel in samewerking met spanne van Google, IBM en Lyft. Dit los die kompleksiteite op wat ontstaan ββin toepassings gebaseer op mikrodienste, byvoorbeeld, soos:
sekuriteit: eindgebruiker-verifikasie en magtiging;
waarneembaarheid: opsporing, monitering, logging.
Almal van hulle kan op toepassingsvlak opgelos word, maar daarna sal u dienste nie meer "mikro" wees nie. Al die ekstra moeite om hierdie kwessies aan te spreek is 'n vermorsing van maatskappyhulpbronne wat direk vir besigheidswaarde gebruik kan word. Oorweeg 'n voorbeeld:
Projekbestuurder: Hoe lank neem dit om 'n terugvoerfunksie by te voeg?
Ontwikkelaar: Twee naellope.
MP: Wat?.. Dis net CRUD!
R: Om CRUD te doen is die maklike deel van die taak, maar ons moet steeds gebruikers en dienste verifieer en magtig. Aangesien die netwerk onbetroubaar is, sal jy herhaalde versoeke moet implementeer, asook stroombreker patroon in kliΓ«nte. Ook, om seker te maak dat die hele stelsel nie ineenstort nie, time-outs en schotten(Sien later in die artikel vir meer besonderhede oor beide genoemde patrone.), en om probleme op te spoor, monitering, opsporing, [β¦]
MP: O, laat ons dan net hierdie kenmerk in die produkdiens plaas.
Ek dink die idee is duidelik: die hoeveelheid stappe en moeite wat nodig is om 'n enkele diens by te voeg, is groot. In hierdie artikel sal ons kyk hoe Istio al die kompleksiteit wat hierbo genoem word (nie geteiken deur besigheidslogika nie) van dienste verwyder.
Let daarop: Die artikel veronderstel dat jy werkende kennis van Kubernetes het. Andersins beveel ek aan om te lees my inleiding tot Kubernetes en dan eers voort om hierdie materiaal te lees.
Istio idee
In 'n wΓͺreld sonder Istio rig een diens direkte versoeke aan 'n ander, en in geval van mislukking moet die diens dit self hanteer: maak 'n nuwe poging, maak voorsiening vir 'n time-out, maak 'n stroombreker oop, ens.
Netwerkverkeer in Kubernetes
Istio, aan die ander kant, bied 'n gespesialiseerde oplossing wat heeltemal apart is van dienste en funksies deur met netwerkinteraksie in te meng. En so implementeer dit:
fout verdraagsaamheid: gebaseer op die statuskode in die antwoord, verstaan ββdit of die versoek misluk het en dien dit weer in.
Kanarie-uitrol: herlei slegs 'n vaste persentasie versoeke na die nuwe weergawe van die diens.
Monitering en Metrieke: hoe lank het dit geneem vir die diens om te reageer?
Naspeuring en waarneembaarheid: Voeg spesiale opskrifte by elke versoek en spoor dit oor die groepie na.
sekuriteit: Haal 'n JWT-token op, verifieer en magtig gebruikers.
Hierdie is net 'n paar van die moontlikhede (regtig net 'n paar!) om jou te intrigeer. Kom ons duik nou in die tegniese besonderhede!
Argitektuur
Istio onderskep alle netwerkverkeer en pas 'n stel reΓ«ls daarop toe, en plaas 'n slim proxy in die vorm van 'n syspanhouer in elke peul. Gevolmagtigdes wat alle moontlikhede aktiveer, vorm a Data Vliegtuig, en hulle kan dinamies aangepas word met Beheervliegtuig.
Data Vliegtuig
Die gevolmagtigdes wat in die peule geplaas word, stel Istio in staat om maklik die vereistes te bereik wat ons benodig. Kom ons kyk byvoorbeeld na die herprobasies en stroombrekerfunksies.
Hoe herprobasies en stroomonderbreking in Envoy geΓ―mplementeer word
Opsomming:
gesant (Ons praat van 'n instaanbediener wat in 'n syspanhouer geleΓ« is, wat versprei word en hoe aparte produk - ongeveer. vertaal.) stuur 'n versoek na die eerste instansie van diens B en misluk.
Envoy Sidecar probeer weer (weer probeer). (1)
Die mislukte versoek word teruggestuur na die gevolmagtigde wat dit geroep het.
Dit maak die stroombreker oop en roep die volgende diens vir daaropvolgende versoeke. (2)
Dit beteken dat jy nie die volgende Herprobeer-biblioteek hoef te gebruik nie, jy hoef nie jou eie implementering van Circuit Breaking and Service Discovery in die X-, Y- of Z-programmeertaal te maak nie. Dit alles en meer is beskikbaar uit die boks in Istio en vereis nie geen kode verander.
Puik! Nou wil jy dalk saam met Istio op reis gaan, maar daar is nog twyfel, oop vrae. As dit 'n universele oplossing is vir alle geleenthede in die lewe, dan het jy 'n regmatige vermoede: al sulke oplossings is immers in werklikheid nie geskik vir enige geval nie.
En uiteindelik vra jy: "Is dit aanpasbaar?"
Nou is jy gereed vir 'n seereis β en kom ons maak kennis met Control Plane.
Beheervliegtuig
Dit bestaan ββuit drie komponente: Pilot, Mixer ΠΈ Citadel, wat saam Gesante konfigureer om verkeer te stuur, beleide toe te pas en telemetriedata in te samel. Skematies lyk dit alles so:
Interaksie van beheervlak met datavlak
Gesante (d.w.s. datavlak) is gekonfigureer met Kubernetes CRD (Custom Resource Definitions) gedefinieer deur Istio en spesifiek ontwerp vir hierdie doel. Wat dit vir jou beteken, is dat dit net nog 'n hulpbron in Kubernetes is met 'n bekende sintaksis. Sodra dit geskep is, sal hierdie hulpbron deur die beheervliegtuig opgetel word en op Gesante toegepas word.
Verhouding van dienste aan Istio
Ons het Istio se verhouding tot dienste beskryf, maar nie andersom nie: hoe hou dienste verband met Istio?
Om eerlik te wees, dienste weet van die teenwoordigheid van Istio sowel as visse weet van water, wanneer hulle hulself afvra: "Wat is water in elk geval?".
U kan dus 'n werkende groepering neem en nadat u die Istio-komponente ontplooi het, sal die dienste daarin aanhou werk, en nadat u hierdie komponente verwyder het, sal alles weer reg wees. Dit is duidelik dat u in hierdie geval die geleenthede wat Istio bied, sal verloor.
Genoeg teorie β kom ons sit hierdie kennis in die praktyk!
Istio in die praktyk
Istio benodig 'n Kubernetes-kluster met ten minste 4 vCPU's en 8 GB RAM beskikbaar. Om die groep vinnig te verhoog en die instruksies uit die artikel te volg, beveel ek aan om die Google Wolk-platform te gebruik, wat nuwe gebruikers bied gratis $300.
Nadat u die groepering geskep het en toegang tot Kubernetes deur die konsolehulpmiddel opgestel het, kan u Istio installeer deur die Helm-pakketbestuurder.
Roer installasie
Installeer die Helm-kliΓ«nt op jou rekenaar soos beskryf in amptelike dokumentasie. Ons sal dit gebruik om sjablone te genereer vir die installering van Istio in die volgende afdeling.
Installasie
Laai Istio-hulpbronne af van nuutste vrystelling(die oorspronklike skrywer se skakel na weergawe 1.0.5 is verander na die huidige een, d.w.s. 1.0.6 - ongeveer transl.), onttrek die inhoud na 'n enkele gids, waarna ek sal verwys as [istio-resources].
Vir maklike identifikasie van Istio-hulpbronne, skep 'n naamruimte in die K8s-groepering istio-system:
$ kubectl create namespace istio-system
Voltooi die installasie deur na die gids te navigeer [istio-resources] en voer die opdrag uit:
Hierdie opdrag sal die sleutelkomponente van Istio na 'n lΓͺer uitvoer istio.yaml. Ons het die standaard sjabloon vir onsself gewysig deur die volgende parameters te spesifiseer:
global.mtls.enabled geΓ―nstalleer in false(m.a.w. mTLS-verifikasie is gedeaktiveer - ongeveer transl.)om ons dating proses te vereenvoudig;
tracing.enabled maak versoekopsporing met Jaeger moontlik;
kiali.enabled installeer Kiali in 'n groepering om dienste en verkeer te visualiseer;
grafana.enabled installeer Grafana om die versamelde statistieke te visualiseer.
Pas die gegenereerde hulpbronne toe met die opdrag:
$ kubectl apply -f istio.yaml
Installasie van Istio in die cluster is voltooi! Wag totdat alle peule in die naamruimte is istio-system sal in staat wees om Running of Completeddeur die opdrag hieronder uit te voer:
$ kubectl get pods -n istio-system
Ons is nou gereed om voort te gaan na die volgende afdeling, waar ons die toepassing sal verhoog en uitvoer.
Sentimentanalise Toepassingsargitektuur
Kom ons gebruik die voorbeeld van die Sentiment Analysis-mikrodienstoepassing wat in die reeds genoemde gebruik is Inleidingsartikel tot Kubernetes. Dit is kompleks genoeg om die moontlikhede van Istio in die praktyk te wys.
Die toepassing bestaan ββuit vier mikrodienste:
Service SA-Frontend, wat die front-end-toepassing op Reactjs bedien;
Service SA WebApp, wat Sentimentanalise-navrae bedien;
Service SA Terugvoer, wat terugvoer van gebruikers ontvang oor die akkuraatheid van die analise wat uitgevoer is.
In hierdie diagram sien ons, benewens dienste, ook die ingangbeheerder, wat in Kubernetes inkomende versoeke na die ooreenstemmende dienste stuur. Istio gebruik 'n soortgelyke konsep as deel van die Ingress Gateway, waarvan besonderhede sal volg.
Begin 'n toepassing met 'n proxy van Istio
Vir verdere bewerkings wat in die artikel genoem word, kloon u bewaarplek istio-meesterskap. Dit bevat die toepassing en manifeste vir Kubernetes en Istio.
Syspan insit
Invoeging kan gemaak word outomaties of hand. Om syspanhouers outomaties in te voeg, moet jy die etiket op die naamruimte stel istio-injection=enabled, wat gedoen word deur die volgende opdrag:
Nou is elke pod wat in die verstek naamruimte (default) sal sy syspanhouer kry. Om dit te verifieer, laat ons 'n toetstoepassing ontplooi deur na die wortelgids van die bewaarplek te gaan [istio-mastery] en voer die volgende opdrag 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 u die dienste ontplooi het, maak seker dat die peule twee houers het (met die diens self en sy syspan) deur die opdrag uit te voer kubectl get pods en maak seker dat onder die kolom READY waarde gespesifiseer 2/2, wat simboliseer dat beide houers loop:
$ 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 lyk dit so:
Gesant volmag in een van die peule
Noudat die toepassing aan die gang is, moet ons toelaat dat inkomende verkeer die toepassing binnegaan.
Ingangpoort
Die beste praktyk om dit te bereik (laat verkeer in die groep toe) is via Ingangpoort in Istio, wat aan die "rand" van die groep geleΓ« is en jou toelaat om Istio-kenmerke soos roetering, vragbalansering, sekuriteit en monitering vir inkomende verkeer te aktiveer.
Die Ingress Gateway-komponent en die diens wat dit na buite stuur, is tydens die Istio-installasie op die groep geΓ―nstalleer. Om die eksterne IP-adres van 'n diens uit te vind, hardloop:
$ 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
Ons sal voortgaan om toegang tot die toepassing te kry met hierdie IP (ek sal daarna verwys as EXTERNAL-IP), so gerieflikheidshalwe sal ons die waarde na 'n veranderlike skryf:
$ EXTERNAL_IP=$(kubectl get svc -n istio-system
-l app=istio-ingressgateway
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
As jy nou probeer om toegang tot hierdie IP deur 'n blaaier te kry, sal jy 'n Service Unavailable-fout kry, want by verstek blokkeer Istio alle inkomende verkeertotdat Gateway gedefinieer is.
Gateway hulpbron
Gateway is 'n CRD (Custom Resource Definition) in Kubernetes, gedefinieer nadat Istio in 'n cluster geΓ―nstalleer is en die vermoΓ« moontlik maak om poorte, protokol en gashere te spesifiseer waarvoor ons inkomende verkeer wil toelaat.
In ons geval wil ons HTTP-verkeer op poort 80 vir alle gashere toelaat. Die probleem word deur die volgende definisie besef (http-gateway.yaml):
Hierdie konfigurasie het geen verduideliking nodig nie, behalwe vir die kieser istio: ingressgateway. Met hierdie kieser kan ons spesifiseer op watter Ingress Gateway die konfigurasie moet toegepas word. In ons geval is dit die Ingress Gateway-beheerder, wat by verstek in Istio geΓ―nstalleer is.
Die konfigurasie word toegepas deur die volgende opdrag te roep:
$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created
Die poort laat nou toegang tot poort 80 toe, maar het geen idee waarheen om die versoeke te stuur nie. Hiervoor sal jy nodig hΓͺ Virtuele dienste.
Virtuele dienshulpbron
Die VirtualService vertel die Ingress Gateway hoe om versoeke te stuur wat binne die groep toegelaat word.
Versoeke na ons aansoek wat deur die http-gateway kom, moet na die sa-frontend, sa-web-app en sa-terugvoerdienste gestuur word:
Roetes wat met VirtualServices gekonfigureer moet word
Oorweeg die versoeke wat aan SA-Frontend gestuur moet word:
Presiese passing langs die pad / moet na SA-Frontend gestuur word om index.html te kry;
Paadjies met 'n voorvoegsel /static/* moet na SA-Frontend gestuur word om statiese lΓͺers wat in die frontend gebruik word, soos CSS en JavaScript te kry;
Paadjies wat ooreenstem met die gereelde uitdrukking '^.*.(ico|png|jpg)$', moet aan SA-Frontend gestuur word, want Dit is die prente wat op die bladsy vertoon word.
Hierdie virtuele diens verwys na versoeke wat deurkom http-poort;
Π destination definieer die diens waarna die versoeke gestuur word.
Let daarop: Die konfigurasie hierbo word in 'n lΓͺer gestoor sa-virtualservice-external.yaml, wat ook instellings bevat vir roetering na SA-WebApp en SA-Terugvoer, maar is kortliks hier in die artikel verkort.
Pas VirtualService toe deur te skakel:
Let daarop: Wanneer ons Istio-hulpbronne toepas, vuur die Kubernetes API-bediener 'n gebeurtenis af wat die Istio-beheervliegtuig ontvang, en daarna word die nuwe konfigurasie op elke pod se Envoy-instaanbediener toegepas. En die Ingress Gateway-beheerder blyk nog 'n gesant te wees wat in die beheervlak gekonfigureer is. Dit alles lyk soos volg in die diagram:
Istio-IngressGateway-konfigurasie vir versoekroetering
Sentimentanalise is nou beskikbaar op http://{EXTERNAL-IP}/. Moenie bekommerd wees as jy Nie Gevind-status kry nie: soms neem dit 'n bietjie langer vir die konfigurasie om in werking te tree en vir die Envoy-geheue om op te dateer.
Voordat u voortgaan, speel 'n bietjie met die toepassing om verkeer te genereer. (die teenwoordigheid daarvan is nodig vir duidelikheid in daaropvolgende aksies - ongeveer vertaal.).
Kiali: waarneembaarheid
Voer die volgende opdrag uit om by die Kiali-administrasie-koppelvlak te kom:
β¦en oop http://localhost:20001/deur aan te meld as admin/admin. Hier sal jy baie nuttige kenmerke vind, byvoorbeeld om die opstelling van Istio-komponente na te gaan, dienste te visualiseer uit inligting wat ingesamel is deur netwerkversoeke te onderskep, antwoorde te kry op die vrae "Wie kontak wie?", "Watter weergawe van die diens ervaar mislukkings?β en so aan. Oor die algemeen, verken die moontlikhede van Kiali voordat u verder gaan met die visualisering van metrieke met Grafana.
Grafana: visualisering van metrieke
Die maatstawwe wat in Istio versamel word, beland in Prometheus en word met Grafana gevisualiseer. Om by die Grafana-administrasie-koppelvlak te kom, voer die opdrag hieronder uit en maak dan oop http://localhost:3000/:
Deur op die spyskaart te klik What is This links bo en kies Istio Service Dashboard in die boonste linkerhoek, begin met diens sa-web-appom die versamelde maatstawwe te sien:
Hier wag ons vir 'n leΓ« en heeltemal vervelige optrede β die bestuur sal dit nooit goedkeur nie. Kom ons skep 'n klein vrag met die volgende opdrag:
Nou het ons baie mooier grafieke, en bykomend tot hulle, die wonderlike instrumente Prometheus vir monitering en Grafana vir die visualisering van statistieke, wat ons in staat sal stel om te leer oor prestasie, gesondheidstatus, verbeterings / agteruitgang in dienste met verloop van tyd.
Laastens, kom ons kyk na versoekopsporing in dienste.
Jaeger: opspoor
Ons sal opsporing nodig hΓͺ, want hoe meer dienste ons het, hoe moeiliker is dit om by die oorsaak van die mislukking uit te kom. Kom ons kyk na 'n eenvoudige geval uit die prentjie hieronder:
Tipiese voorbeeld van 'n ewekansige mislukte versoek
Versoek kom, val - wat is die rede? Eerste diens? Of tweede? Daar is uitsonderings in beide - kom ons kyk na die logs van elkeen. Hoe gereeld het jy jouself al gevang om dit te doen? Ons werk is meer soos sagteware-speurders as ontwikkelaars ...
Dit is 'n wydverspreide probleem in mikrodienste en word opgelos deur verspreide opsporingstelsels, waarin dienste 'n unieke kop aan mekaar deurgee, waarna hierdie inligting na die opsporingstelsel herlei word, waar dit met die versoekdata vergelyk word. Hier is 'n illustrasie:
TraceId word gebruik om die versoek te identifiseer
Istio gebruik Jaeger Tracer, wat 'n verskaffer-onafhanklike OpenTracing API-raamwerk implementeer. U kan toegang tot die Jaeger-gebruikerskoppelvlak verkry met die volgende opdrag:
Gaan nou na http://localhost:16686/ en kies 'n diens sa-web-app. As die diens nie in die aftreklys gewys word nie, wys/genereer aktiwiteit op die bladsy en werk die koppelvlak op. Klik daarna op die knoppie Soek spore, wat die mees onlangse spore sal wys - kies enige - gedetailleerde inligting oor alle spore sal verskyn:
Hierdie spoor toon:
Die versoek kom in istio-ingangpoort (dit is die eerste interaksie met een van die dienste, en 'n Trace ID word vir die versoek gegenereer), waarna die poort die versoek na die diens stuur sa-web-app.
In diens sa-web-app die versoek word deur die Gesant-syspan opgetel, 'n "kind" word in die span geskep (dis hoekom ons dit in spore sien) en herlei word na die houer sa-web-app. (span - 'n logiese eenheid van werk in Jaeger, met 'n naam, die begintyd van die operasie en die duur daarvan. Spanninge kan genesteer en bestel word. 'n Gerigte asikliese grafiek van streke vorm 'n spoor. - ongeveer. vertaal.)
Hier word die versoek volgens die metode verwerk sentimentontleding. Hierdie spore word reeds deur die toepassing gegenereer, d.w.s. hulle het kodeveranderings vereis.
Vanaf hierdie oomblik word 'n POST-versoek geΓ―nisieer in sa-logika. Spoor ID moet aangestuur word vanaf sa-web-app.
...
Let daarop: In stap 4 moet die toepassing die opskrifte sien wat deur Istio gegenereer is en dit aan daaropvolgende versoeke deurgee, soos in die prent hieronder getoon:
(A) Kopaanstuur is die verantwoordelikheid van Istio; (B) Dienste is verantwoordelik vir opskrifte
Istio doen die grootste deel van die werk omdat genereer opskrifte vir inkomende versoeke, skep nuwe spanne in elke sysorg en stuur dit aan. Sonder om met opskrifte binne dienste te werk, sal die volle versoekspoorpad egter verlore gaan.
Die volgende opskrifte moet oorweeg word (aanstuur):
Dit is 'n eenvoudige taak, maar om die implementering daarvan te vereenvoudig, is daar reeds baie biblioteke - byvoorbeeld, in die sa-web-app-diens, stuur die RestTemplate-kliΓ«nt hierdie opskrifte aan as jy bloot die Jaeger- en OpenTracing-biblioteke byvoeg sy afhanklikhede.
Let daarop dat die Sentiment Analysis-toepassing implementerings in Flask, Spring en ASP.NET Core demonstreer.
Noudat dit duidelik is wat ons uit die boks kry (of amper uit die boks), kom ons kyk na fyn ingestelde roetering, netwerkverkeerbestuur, sekuriteit en meer!
Let wel. vertaal.: lees daaroor in die volgende deel van materiaal op Istio van Rinor Maloku, waarvan die vertalings in die nabye toekoms in ons blog sal volg. UPDATE (14 Maart): Tweede deel reeds gepubliseer.