Märge. tõlge: Teenusvõrgud on tänapäeva mikroteenuste arhitektuuri järgivate rakenduste infrastruktuuris kindlasti muutunud kuumaks teemaks. Kuigi Istio võib olla paljude DevOpsi inseneride radaril, on tegemist üsna uue tootega, mille tundmaõppimiseks võib kuluda küll palju aega, kuigi see on pakutavate funktsioonide poolest keeruline. Saksa insener Rinor Maloku, kes vastutab telekommunikatsioonifirmas Orange Networks suurklientide pilvandmetöötluse eest, on kirjutanud suurepärase materjalisarja, mis võimaldab kiiresti ja sügavalt Istiosse sukelduda. Ta alustab oma lugu sellega, mida Istio suudab ja kuidas seda kiiresti oma silmaga näha.
Istio — avatud lähtekoodiga projekt, mis töötati välja koostöös Google'i, IBMi ja Lyfti meeskondadega. See lahendab keerukused, mis tekivad näiteks mikroteenustel põhinevates rakendustes, näiteks:
turvalisus: lõppkasutaja autentimine ja autoriseerimine;
jälgitavus: jälgimine, seire, metsaraie.
Neid kõiki saab lahendada rakenduse tasemel, kuid pärast seda ei ole teie teenused enam "mikro". Kõik lisapingutused nende probleemide lahendamiseks on ettevõtte ressursside raiskamine, mida saaks kasutada otse ärilise väärtuse teenimiseks. Kaaluge näidet:
Projektijuht: kui kaua võtab tagasiside funktsiooni lisamine aega?
Arendaja: kaks sprinti.
MP: Mida?.. See on lihtsalt TORE!
R: CRUD-i tegemine on ülesande lihtne osa, kuid me peame siiski kasutajaid ja teenuseid autentima ja autoriseerima. Kuna võrk on ebausaldusväärne, peate rakendama ka korduvaid taotlusi kaitselüliti muster klientides. Samuti veendumaks, et kogu süsteem kokku ei jooksnud, ajalõpud ja vaheseinad(Lisateavet mõlema mainitud mustri kohta leiate artiklist hiljem.)ning probleemide tuvastamiseks, jälgimiseks, jälgimiseks, […]
MP: Oh, paneme selle funktsiooni siis tooteteenusesse.
Arvan, et idee on selge: ühe teenuse lisamiseks on vaja palju samme ja jõupingutusi. Selles artiklis vaatleme, kuidas Istio eemaldab teenustest kogu ülalmainitud keerukuse (mitte äriloogikaga sihitud).
Märkus: artikkel eeldab, et teil on Kubernetesest tööalased teadmised. Muidu soovitan lugeda minu sissejuhatus Kubernetesesse ja alles siis jätkake selle materjali lugemist.
Istio idee
Ilma Istiota maailmas teeb üks teenus teisele otsepäringuid ja rikke korral peab teenus sellega ise hakkama saama: tegema uue katse, ette nägema ajalõpu, avama kaitselüliti jne.
Võrguliiklus Kubernetesis
Istio seevastu pakub spetsiaalset lahendust, mis on teenustest ja funktsioonidest täiesti eraldiseisev, segades võrgu suhtlust. Ja seega rakendab see:
veataluvus: vastuses oleva olekukoodi põhjal saab ta aru, kas päring ebaõnnestus ja esitab selle uuesti.
Canary Rollouts: suunab ainult kindla protsendi taotlustest teenuse uude versiooni.
Seire ja mõõdikud: kui kaua kulus teenusel vastamiseks?
Jälgimine ja jälgitavus: lisab igale päringule spetsiaalsed päised ja jälgib neid kogu klastris.
turvalisus: hangib JWT märgi, autentib ja volitab kasutajaid.
Need on vaid mõned võimalused (tõesti vaid mõned!) teid intrigeerida. Nüüd sukeldume tehnilistesse üksikasjadesse!
Arhitektuur
Istio peatab kogu võrguliikluse ja rakendab sellele reegleid, lisades igasse moodulisse nutika puhverserveri külgkorvi konteineri kujul. Kõiki võimalusi aktiveerivad puhverserverid moodustavad a Andmetasandja neid saab dünaamiliselt reguleerida Juhtplaat.
Andmetasand
Kaunadesse sisestatavad puhverserverid võimaldavad Istiol hõlpsasti täita meile vajalikud nõuded. Näiteks kontrollime korduskatseid ja kaitselülitite funktsioone.
Kuidas on Envoy's rakendatud korduskatseid ja voolukatkestusi
Kokkuvõtteks:
saadik (Jutt käib külgkorvi konteineris asuvast puhverserverist, mida jagatakse ja kuidas eraldi toode - u. tõlge.) saadab päringu teenuse B esimesele eksemplarile ja ebaõnnestub.
Saadik külgkorvi proovib uuesti (uuesti proovima). (1)
Ebaõnnestunud päring tagastatakse sellele kutsunud puhverserverile.
See avab kaitselüliti ja helistab järgmiste taotluste jaoks järgmisele teenusele. (2)
See tähendab, et te ei pea kasutama järgmist uuesti proovimise teeki, te ei pea ise juurutama Circuit Breaking ja Service Discovery programmeerimiskeeles X, Y või Z. Kõik see ja palju muud on saadaval kast Istios ja ei nõua ei koodi muutused.
Suurepärane! Nüüd võib tekkida soov minna Istioga merereisile, kuid kahtlusi, lahtisi küsimusi on veel. Kui see on universaalne lahendus kõigiks elujuhtumiteks, siis on teil õigustatud kahtlus: kõik sellised lahendused ei sobi ju tegelikult ühegi juhtumi jaoks.
Ja lõpuks küsite: "Kas see on kohandatav?"
Nüüd olete merereisiks valmis – ja tutvume Control Plane’iga.
Juhtplaat
See koosneb kolmest komponendist: Piloot, Mikser и Kants, mis koos konfigureerivad saadikud liikluse suunamiseks, poliitikate jõustamiseks ja telemeetriaandmete kogumiseks. Skemaatiliselt näeb see kõik välja selline:
Juhttasandi ja andmetasandi koostoime
Saatjad (st andmetasand) on konfigureeritud Kubernetes CRD (Kohandatud ressursside määratlused), mille Istio on määratlenud ja spetsiaalselt selleks otstarbeks loodud. See tähendab teie jaoks seda, et need on lihtsalt veel üks tuttava süntaksiga Kubernetese ressurss. Pärast loomist võtab juhttasand selle ressursi üles ja rakendab saadikutele.
Teenuste seos Istioga
Oleme kirjeldanud Istio suhet teenustega, kuid mitte vastupidi: kuidas on teenused seotud Istioga?
Ausalt öeldes teavad talitused Istio olemasolust sama hästi kui kalad veest, kui küsivad endalt: “Mis on ikkagi vesi?”.
Seega võite võtta töötava klastri ja pärast Istio komponentide juurutamist jätkavad selles olevad teenused tööd ning pärast nende komponentide eemaldamist on kõik jälle korras. Selge on see, et sel juhul jääd ilma Istio pakutavatest võimalustest.
Aitab teooriast – paneme need teadmised ellu!
Istio praktikas
Istio vajab Kubernetese klastrit, millel on vähemalt 4 vCPU-d ja 8 GB muutmälu. Klastri kiireks tõstmiseks ja artikli juhiste järgimiseks soovitan kasutada Google Cloud Platformi, mis pakub uutele kasutajatele tasuta 300 dollarit.
Pärast klastri loomist ja konsooliutiliidi kaudu Kubernetesele juurdepääsu seadistamist saate installida Istio Helmi paketihalduri kaudu.
Helmi paigaldamine
Installige Helmi klient oma arvutisse, nagu on kirjeldatud jaotises ametlik dokumentatsioon. Kasutame seda järgmises jaotises Istio installimiseks mallide loomiseks.
Paigaldamine
Laadige alla Istio ressursid aadressilt uusim väljalase(algse autori link versioonile 1.0.5 on muudetud praeguseks, st 1.0.6 - umbes tõlge.), eraldage sisu ühte kataloogi, mida ma nimetan [istio-resources].
See käsk väljastab Istio põhikomponendid faili istio.yaml. Oleme standardmalli enda jaoks muutnud, määrates järgmised parameetrid:
global.mtls.enabled sisse paigaldatud false(st mTLS-i autentimine on keelatud – ligikaudu tõlge)meie tutvumisprotsessi lihtsustamiseks;
tracing.enabled võimaldab Jaegeriga päringu jälgimist;
kiali.enabled installib Kiali teenuste ja liikluse visualiseerimiseks klastrisse;
grafana.enabled installib Grafana kogutud mõõdikute visualiseerimiseks.
Rakendage loodud ressursse käsuga:
$ kubectl apply -f istio.yaml
Istio paigaldamine klastris on lõppenud! Oodake, kuni kõik nimeruumis olevad kaustad istio-system suudab Running või Completedkäivitades alloleva käsu:
$ kubectl get pods -n istio-system
Nüüd oleme valmis jätkama järgmise jaotisega, kus tõstame rakenduse üles ja käivitame.
Sentiment Analysis Application Architecture
Kasutame juba mainitud juures kasutatud Sentiment Analysis mikroteenuse rakenduse näidet Kubernetese tutvustusartikkel. See on piisavalt keeruline, et näidata Istio võimalusi praktikas.
Rakendus koosneb neljast mikroteenusest:
Teenus SA-Eesmine, mis teenindab Reactjs'i esiotsa rakendust;
Teenus SA WebApp, mis teenindab Sentiment Analysis päringuid;
Teenus SA tagasiside, mis saab kasutajatelt tagasisidet tehtud analüüsi täpsuse kohta.
Sellel diagrammil näeme lisaks teenustele ka sissepääsukontrollerit, mis Kubernetes suunab sissetulevad päringud vastavatele teenustele. Istio kasutab sarnast kontseptsiooni Ingress Gateway osana, mille üksikasjad järgnevad.
Rakenduse käivitamine Istio puhverserveriga
Artiklis mainitud edasiste toimingute jaoks kloonige oma hoidla istio-meisterlikkus. See sisaldab rakendust ja manifeste Kubernetese ja Istio jaoks.
Külgkorvide paigaldamine
Sisestamist saab teha automaatselt või käsitsi. Külgkorvi konteinerite automaatseks sisestamiseks peate määrama sildi nimeruumile istio-injection=enabled, mis tehakse järgmise käsuga:
Nüüd iga pod, mis juurutatakse vaikenimeruumi (default) saab oma külgkorvi konteineri. Selle kontrollimiseks juurutagem testrakendus, minnes hoidla juurkataloogi [istio-mastery] ja käivitage järgmine käsk:
$ 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
Pärast teenuste juurutamist kontrollige käsu käivitamisega, et kaustadel oleks kaks konteinerit (koos teenuse enda ja selle külgkorviga) kubectl get pods ja veenduge, et veeru all READY määratud väärtus 2/2, mis sümboliseerib, et mõlemad konteinerid töötavad:
$ 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
Visuaalselt näeb see välja selline:
Saatja volikiri ühes kaunadest
Nüüd, kui rakendus on käivitatud ja töötab, peame lubama sissetuleval liiklusel rakendusse siseneda.
Sissepääsu värav
Parim tava selle saavutamiseks (liikluse lubamine klastris) on läbimine Sissepääsu värav Istios, mis asub klastri servas ja võimaldab lubada Istio funktsioone, nagu marsruutimine, koormuse tasakaalustamine, turvalisus ja sissetuleva liikluse jälgimine.
Ingress Gateway komponent ja teenus, mis seda väljapoole edastab, installiti klastris Istio installimise ajal. Teenuse välise IP-aadressi väljaselgitamiseks käivitage:
$ 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
Jätkame rakendusele juurdepääsu selle IP-aadressiga (ma nimetan seda VÄLIS-IP-ks), nii et mugavuse huvides kirjutame väärtuse muutujale:
$ EXTERNAL_IP=$(kubectl get svc -n istio-system
-l app=istio-ingressgateway
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
Kui proovite sellele IP-le nüüd brauseri kaudu juurde pääseda, kuvatakse tõrketeade Teenus pole saadaval, kuna vaikimisi blokeerib Istio kogu sissetuleva liiklusekuni lüüs on määratletud.
Lüüsi ressurss
Gateway on Kubernetes CRD (kohandatud ressursi definitsioon), mis defineeritakse pärast Istio installimist klastris ja võimaldab määrata pordid, protokollid ja hostid, mille jaoks tahame sissetulevat liiklust lubada.
Meie puhul tahame lubada HTTP-liiklust pordis 80 kõikidele hostidele. Probleem on realiseeritud järgmise definitsiooniga (http-gateway.yaml):
See konfiguratsioon ei vaja selgitust peale valija istio: ingressgateway. Selle valijaga saame määrata, millisele sissepääsulüüsile konfiguratsiooni rakendada. Meie puhul on selleks Ingress Gateway kontroller, mis installiti vaikimisi Istiosse.
Konfiguratsiooni rakendatakse järgmise käsu kutsumisega:
$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created
Lüüs võimaldab nüüd juurdepääsu pordile 80, kuid tal pole aimugi, kuhu päringud suunata. Selleks vajate Virtuaalsed teenused.
Virtuaalteenuse ressurss
VirtualService ütleb sisendlüüsile, kuidas suunata klastris lubatud päringuid.
Meie rakendusele http-lüüsi kaudu tulevad taotlused tuleb saata sa-frontendi, sa-web-app ja sa-tagasiside teenustele:
VirtualServicesiga konfigureeritavad marsruudid
Mõelge päringutele, mis tuleks SA-Frontendile saata:
Täpne vaste teel / tuleks saata SA-Frontendile, et saada index.html;
Eesliitega teed /static/* tuleks saata SA-Frontendile, et saada kasutajaliideses kasutatavaid staatilisi faile, nagu CSS ja JavaScript;
Regulaaravaldisele vastavad teed '^.*.(ico|png|jpg)$', tuleb saata SA-Frontendile, sest Need on lehel kuvatavad pildid.
See virtuaalteenus viitab päringutele, mis tulevad läbi http-lüüs;
В destination määrab teenuse, kuhu päringud saadetakse.
Märkus: ülaltoodud konfiguratsioon salvestatakse faili sa-virtualservice-external.yaml, mis sisaldab ka SA-WebAppi ja SA-Feedbacki marsruutimise sätteid, kuid on siin artiklis lühiduse huvides lühendatud.
Taotlege VirtualService'i helistades:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created
Märkus: Istio ressursside rakendamisel käivitab Kubernetes API server sündmuse, mille Istio juhtimistasand vastu võtab, ja pärast seda rakendatakse uut konfiguratsiooni iga podi Envoy puhverserveritele. Ja Ingress Gateway kontroller näib olevat veel üks juhttasandil konfigureeritud saadik. Kõik see näeb diagrammil välja selline:
Sentiment Analysis on nüüd saadaval aadressil http://{EXTERNAL-IP}/. Ärge muretsege, kui saate oleku Ei leitud: mõnikord kulub konfiguratsiooni jõustumiseks ja Envoy vahemälu värskendamiseks veidi kauem aega.
Enne jätkamist mängige liikluse tekitamiseks veidi rakendusega. (selle olemasolu on vajalik selguse huvides järgnevates toimingutes - umbes tõlge).
Kiali : jälgitavus
Kiali administraatoriliidese juurde pääsemiseks käivitage järgmine käsk:
$ kubectl port-forward
$(kubectl get pod -n istio-system -l app=kiali
-o jsonpath='{.items[0].metadata.name}')
-n istio-system 20001
… ja avage http://localhost:20001/logides sisse kui admin/admin. Siit leiate palju kasulikke funktsioone, näiteks saate kontrollida Istio komponentide konfiguratsiooni, visualiseerida teenuseid võrgupäringute pealtkuulamisel kogutud teabe põhjal, saada vastuseid küsimustele "Kes kellega ühendust võtab?", "Milline teenuse versioon on kasutusel ebaõnnestumised?" ja nii edasi. Üldiselt uurige Kiali võimalusi, enne kui asute Grafana abil mõõdikute visualiseerimisele.
Grafana: mõõdikute visualiseerimine
Istios kogutud mõõdikud jõuavad Prometheusesse ja visualiseeritakse Grafana abil. Grafana administraatoriliidese avamiseks käivitage allolev käsk ja seejärel avage 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
Menüüle klõpsates Avaleht üleval vasakul ja valige Istio teenuse juhtpaneel vasakus ülanurgas alustage teenindusega sa-veebirakenduskogutud mõõdikute vaatamiseks:
Siin ootame tühja ja täiesti igavat esinemist – juhtkond ei kiida seda kunagi heaks. Loome väikese koormuse järgmise käsuga:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
Nüüd on meil palju ilusamad graafikud ja lisaks neile suurepärased tööriistad Prometheus jälgimiseks ja Grafana mõõdikute visualiseerimiseks, mis võimaldavad meil õppida jõudluse, tervisliku seisundi, teenuste paranemise / halvenemise kohta aja jooksul.
Lõpuks vaatame päringu jälgimist teenustes.
Jaeger: jälitamine
Vajame jälgimist, sest mida rohkem teenuseid meil on, seda keerulisem on rikke põhjuseni jõuda. Vaatame lihtsat juhtumit allolevalt pildilt:
Tüüpiline näide juhuslikust ebaõnnestunud päringust
Palve tuleb, kukub - mis on põhjus? Esimene teenindus? Või teiseks? Mõlemas on erandeid – vaatame kummagi logisid. Kui sageli olete end seda tegemas tabanud? Meie töö on rohkem nagu tarkvara detektiivid kui arendajad…
See on mikroteenustes laialt levinud probleem ja seda lahendavad hajutatud jälgimissüsteemid, milles teenused edastavad üksteisele kordumatu päise, misjärel see teave suunatakse jälgimissüsteemi, kus seda võrreldakse päringu andmetega. Siin on illustratsioon:
TraceId kasutatakse päringu tuvastamiseks
Istio kasutab Jaeger Tracerit, mis rakendab müüjast sõltumatut OpenTracing API raamistikku. Jaegeri kasutajaliidesele pääsete juurde järgmise käsuga:
$ kubectl port-forward -n istio-system
$(kubectl get pod -n istio-system -l app=jaeger
-o jsonpath='{.items[0].metadata.name}') 16686
Nüüd minge juurde http://localhost:16686/ ja valige teenus sa-veebirakendus. Kui teenust rippmenüüs ei kuvata, kuvage/genereerige lehel tegevust ja värskendage liidest. Pärast seda klõpsake nuppu Leia jälgi, mis näitab kõige värskemaid jälgi - valige ükskõik milline - kuvatakse üksikasjalik teave kõigi jälgede kohta:
See jälg näitab:
Taotlus tuleb sisse istio-sissepääsuvärav (see on esimene interaktsioon ühe teenusega ja päringu jaoks genereeritakse jälituse ID), mille järel lüüs saadab teenusele päringu sa-veebirakendus.
Teenistuses sa-veebirakendus palve võtab üles Envoy külgkorvi, vahele luuakse "laps" (seetõttu näeme seda jälgedes) ja suunatakse konteinerisse sa-veebirakendus. (sille - loogiline tööüksus Jäägeris, millel on nimi, operatsiooni algusaeg ja kestus. Sirgesid saab pesastada ja järjestada. Suunatud atsükliline ulatuste graafik moodustab jälje. - u. tõlge.)
Siin töödeldakse taotlust meetodil sentimentanalüüs. Need jäljed on juba rakenduse poolt genereeritud, st. nad nõudsid koodi muutmist.
Sellest hetkest algatatakse POST-i päring sa-loogika. Jälje ID tuleb edastada aadressilt sa-veebirakendus.
...
Märkus: 4. sammus peaks rakendus nägema Istio loodud päiseid ja edastama need järgmistele päringutele, nagu on näidatud alloleval pildil:
(A) Päise edastamise eest vastutab Istio; (B) Päiste eest vastutavad teenused
Istio teeb suurema osa tööst, sest genereerib sissetulevate päringute päised, loob igas kõrvalhoolduses uued vahemikud ja edastab need. Kuid ilma teenuste sees päistega töötamata läheb kogu päringu jälgimise tee kaotsi.
See on lihtne ülesanne, kuid selle rakendamise lihtsustamiseks on see juba olemas palju raamatukogusid - näiteks sa-web-app teenuses saadab RestTemplate klient need päised edasi, kui lisate lihtsalt Jaegeri ja OpenTracingu teegid selle sõltuvused.
Pange tähele, et sentiment Analysis rakendus demonstreerib rakendusi Flaskis, Springis ja ASP.NET Core'is.
Nüüd, kui on selge, mida me karbist (või peaaegu kastist välja) saame, vaatame marsruutimise, võrguliikluse haldamise, turvalisuse ja palju muud täppishäälestust!
Märge. tõlge: selle kohta loe Rinor Maloku Istio materjalide järgmisest osast, mille tõlked on lähiajal ka meie blogis. UPDATE (14. märts): Teine osa juba avaldatud.