Heisenbergi ebamugavuse pĂ”himĂ”te ĂŒtleb, et ei saa samal ajal mÔÔta objekti asukohta ja selle kiirus. Kui objekt liigub, siis ei ole tal asukohta. Ja kui asukoht on olemas â siis tal ei ole kiirus.

Mis puudutab mikroteenuseid Red Hat OpenShift platvormil (ja Kubernetes'i juhtimisel), siis tÀnu avatud koodiga tarkvarale saavad nad samal ajal raporteerida nii oma jÔudlust kui ka töökindlust. Heisenbergi ebamugavus jÀÀb kehtima, kuid see kÔrvaldab ebamugavuse pilve rakenduste kasutamisel. Istio vÔimaldab hÔlpsasti korraldada nende rakenduste jÀlgimist ja monitooringut, et kÔik oleks kontrolli all.
MÀÀratleme terminoloogia
Alustama jĂ€lgimine (Tracing) me mĂ”istame sĂŒsteemi tegevuse logimist. See kĂ”lab ĂŒsna ĂŒldiselt, kuid tegelikult on siin ĂŒks peamisi reegleid andmete jĂ€lgimise suunamine sobivasse salvestusse, muretsemata nende vormingu pĂ€rast. KĂ”ik andmete otsimise ja analĂŒĂŒsimise töö jÀÀb nende tarbija Ă”lgadele. Istios kasutatakse jĂ€lgimissĂŒsteemi Jaeger, mis rakendab OpenTracing andmemudelit.
JĂ€ljed (Traces, ja sĂ”na âjĂ€ljedâ kasutatakse siin tĂ€henduses âmĂ€rkeâ, nagu nĂ€iteks ballistika eksamineerimisel) nimetame me andmeid, mis kirjeldavad tĂ€ielikult pĂ€ringu vĂ”i tĂ¶Ă¶ĂŒlesande lĂ€bimist, nagu öeldakse, âkĂ”ik alates ja kuniâ. NĂ€iteks kĂ”ik, mis juhtub hetkest, kui kasutaja vajutab nuppu veebilehel, kuni andmete tagastamise hetkeni, sealhulgas kĂ”ik kaasatud mikroteenused. Ăhe jĂ€lje kohta vĂ”ib öelda, et see kirjeldab (vĂ”i modelleerib) pĂ€ringu lĂ€bimist sinna ja tagasi. Jaegeri liideses jagunevad jĂ€ljed ajateljel koostisosadeks, just nagu ahelat vĂ”iks jagada eraldi lĂŒlideks. Ainult et lĂŒlide asemel koosneb jĂ€lg nn span'idest.
Span â see on ajavahemik tööde tegemise algusest kuni nende lĂ”petamiseni. JĂ€tkates analoogiat, vĂ”ib öelda, et iga span esindab eraldi lĂŒli ketis. Span vĂ”ib omada (vĂ”i mitte omada) ĂŒhte vĂ”i mitut alam span'i. SeetĂ”ttu on kĂ”ige kĂ”rgema taseme span'il (root span) sama kogukestus nagu rada, millele see viitab.
JĂ€lgimine â see on tegelikult teie sĂŒsteemi jĂ€lgimine â silmade kaudu, kasutajaliidese kaudu vĂ”i automatiseerimise vahendite abil. JĂ€lgimise aluseks on jĂ€lgimisandmed. Istios on jĂ€lgimine rakendatud Prometheuse vahenditega, millel on ka vastav kasutajaliides. Prometheus toetab automaatset jĂ€lgimist, kasutades teavitusi Alerts ja Alert Managers.
JÀtame mÀrgid
Ette, et jÀlgimine oleks vÔimalik, peab rakendus looma span'ide kogumi. SeejÀrel tuleb need eksportida Jaegerisse, et see omakorda looks jÀlgimise visuaalse esituse. Nende span'ide hulka kuuluvad muu hulgas operatsiooni nimi ning ajamÀrke selle alguse ja lÔpu kohta. Span'ide edastamine toimub Jaegerile suunatud HTTP-pÀringute pealkirjade samuti sisse- ja vÀljaminevate pÀringute vahelise suunamise teel. SÔltuvalt kasutatavast programmeerimiskeelest vÔib see nÔuda vÀikseid muudatusi rakenduste lÀhtekoodis. Allpool on nÀide Java koodist (kasutades Spring Boot raamistikku), mis lisab B3 (Zipkin-stiilis) pealkirjad teie pÀringule Springi konfigureerimisklassis:

Kasutatakse jÀrgmisi pealkirja seadeid:

Kui kasutate Java't, siis koodi pole vaja muuta, piisab, kui lisada paar rida Maven POM-faili ning mÀÀrata keskkonnamuutujad. Siin on read, mida peate lisama POM.XML faili, et Jaeger Tracer Resolverit integreerida:

Ja vastavad keskkonnamuutujad mÀÀratakse Dockerfile'is:

NĂŒĂŒd on kĂ”ik seadistatud, ja meie mikroteenused hakkavad genereerima jĂ€lgimisandmeid.
Vaatame ĂŒldiselt
Istio sisaldab lihtsat juhtpaneeli, mis on ĂŒles ehitatud Grafana pĂ”hjal. Kui kĂ”ik on seadistatud ja töötab Red Hat OpenShift PaaS platvormil (meie nĂ€ites on Red Hat OpenShift ja Kubernetes paigaldatud minishiftile), kĂ€ivitatakse see paneel jĂ€rgmise kĂ€suga:
ava "$(minishift openshift service grafana -u)/d/1/istio-dashboard?refresh=5⩝Id=1"
Grafana paneel vĂ”imaldab kiiresti hinnata sĂŒsteemi toimimist. Selle paneeli fragment on nĂ€idatud alloleval joonisel:

Siit on nĂ€ha, et mikroteenus customer kutsub mikroteenust preference v1, mis omakorda kutsub mikroteenuseid recommendation v1 ja v2. Grafana paneelil on Dashboard Row plokk kĂ”rgetasemeliste mÔÔdikute jaoks, nagu globaalne pĂ€ringute maht (Global Request Volume), edukaid pĂ€ringute osakaal (success rates) ja 4xx vead. Samuti on seal Server Mesh esitus diagrammide kujul iga teenuse kohta ja Services Row plokk, et vaadata ĂŒksikasjalikke andmeid iga konteineri kohta iga teenuse jaoks.
NĂŒĂŒd uurime sĂŒgavamale
Korrektselt seadistatud Istio jĂ€lgimine vĂ”imaldab kohe sĂŒvitsi minna sĂŒsteemi sooritusvĂ”ime analĂŒĂŒsi. Jaegeri kasutajaliideses saab jĂ€lgimisi vaadata ning nĂ€ha, kui kaugele ja sĂŒgavale need ulatuvad, samuti visuaalselt lokaliseerida sooritusvĂ”ime kitsaskohti. Red Hat OpenShift platvormil minishift kĂ€ivitate Jaegeri kasutajaliidese jĂ€rgmise kĂ€su abil:
minishift openshift service jaeger-query --in-browser

Mida saab sellel ekraanipildil jÀlgimise kohta öelda:
- See jaguneb 7 span'iks.
- Kogu tÀitmise aeg on 6,99 ms.
- MikrosĂŒsteemil recommendation, mis on ahelas viimane, kulub 0,69 ms.
Sellised diagrammid aitavad kiiresti olukorda mĂ”ista, kui mĂ”ni ĂŒksik toimiv teenus mĂ”jutab kogu sĂŒsteemi sooritusvĂ”imet.
NĂŒĂŒd teeme asja keerulisemaks ja kĂ€ivitame kaks eksemplari mikroteenusest recommendation:v2 kĂ€suga oc scale âreplicas=2 deployment/recommendation-v2. Siin on, millised pod'id meil pĂ€rast seda on:

Kui nĂŒĂŒd tagasi Jaegeri peale lĂŒlituda ja soovituse teenuse span'i laiendada, nĂ€eme, millisele pod'ile pĂ€ringud suunatakse. Nii suudame hĂ”lpsasti lokaliseerida viivitused konkreetse pod'i tasemel. Vaadata tuleb node_id vĂ€lja.

Kuhu ja kuidas kÔik liigub
NĂŒĂŒd liikume Prometheuse liidese poole ja ĂŒsna oodatult nĂ€eme seal, et pĂ€ringud soovituse teenuse teise ja esimese versiooni vahel jagunevad suhe 2:1, rangelt tegutsevate pod'ide arvu alusel. Samuti muutub see diagramm dĂŒnaamiliselt pod'ide ĂŒles- ja allaskaalumisel, mis on eriti kasulik Canary tĂ€itmisel (me vaatame seda deployment'i skeemi jĂ€rgmine kord lĂ€hemalt).

KÔik on alles algamas
Tegelikult oleme tĂ€na, nagu öeldakse, vaid kergelt puudutanud kasuliku teabe varasalve Jaegeri, Grafana ja Prometheuse kohta. Ăldiselt oli see meie eesmĂ€rk â suunata teid Ă”iges suunas ja avada Istio vĂ”imalusi.
Ja pidage meeles, et kĂ”ik see on juba integreeritud Istiosse. Teatud programmeerimiskeelte (nĂ€iteks Java) ja raamistike (nt Spring Boot) kasutamisel saab seda kĂ”ike rakendada, puudutamata rakenduste enda koodi. Jah, koodi tuleb veidi muuta, kui kasutate teisi keeli, peamiselt Nodejs vĂ”i C#. Kuid kuna jĂ€lgitavus (loe: âlingitamineâ) on usaldusvÀÀrsete pilvesĂŒsteemide loomise ĂŒks kohustuslikke tingimusi, peate te igal juhul koodi muutma, olgu teil Istio vĂ”i mitte. Miks siis mitte suunata oma jĂ”upingutusi kasulikuma eesmĂ€rgi nimel?
Isegi selleks, et vastata kĂŒsimustele âkus?â ja âkui kiiresti?â 100% kindlalt.
Kaosinseneria Istios: nii see oli ette nÀhtud
Asjade purustamise oskus aitab tagada, et need ei puruneks
Tarkvara testimine on mitte ainult keeruline, vaid ka oluline. Samas on testimine, et kontrollida, kas funktsioon tagastab Ă”ige tulemuse, ĂŒks asi, aga testimine usaldusvÀÀrse vĂ”rgu tingimustes on hoopis teine ĂŒlesanne (tihti arvatakse, et vĂ”rk töötab alati tĂ”rgeteta, ja see on esimene kaheksast eksitusest jaotatud arvutustes). Ăks raskusi selle ĂŒlesande lahendamisel seisneb selles, kuidas simuleerida sĂŒsteemi rikkeid vĂ”i sisestada neid tahtlikult, tehes nii nimetatud fault injection. Seda saab teha, muutes rakenduse algkoodi. Kuid siis testite te mitte oma algset koodi, vaid selle versiooni, mis simuleerib spetsiaalselt rikkeid. Tulemusena riskite sattuda surmavate fault injection'ite embustesse ja kokku puutuda geisenbug'idega â tĂ”rgetega, mis kaovad katsetamisel, et neid avastada.
Ja nĂŒĂŒd nĂ€itame, kuidas Istio aitab neid raskusi lahendada kiirelt ja lihtsalt.
Nii see vÀlja nÀeb, kui kÔik on suurepÀraselt
Kaalu jĂ€rgmine stsenaarium: meil on kaks pod'i meie soovitusmikroteenuses, mille vĂ”tsime Istio Ă”pikust. Ăks pod on mĂ€rgitud kui v1 ja teine kui v2. Nagu nĂ€eme, töötab kĂ”ik praegu suurepĂ€raselt:

(Muide, paremal number on lihtsalt igas pod'is tehtud kÔnede loend)
Aga me ei vaja tÔepoolest seda, eks? Proovime siis kÔik purustada, puudutamata algseid koode.
Teeme mikroteenusele katkestusi
Allpool on nÀidatud yaml-fail Istio marsruutimisreegli jaoks, mis pooltel juhtudel tekitab vea (veateate). serverid 503):

Pange tÀhele, et me kirjeldame selgelt, et pooltel juhtudel peab toimuma viga 503.
Nii nÀeb vÀlja pildiscreenshot jooksutatud curl'i kÀsust pÀrast reegli aktiveerimist, et simuleerida katkestusi. Nagu nÀeme, tagastab pool pÀringutest veateate 503, sÔltumata sellest, kas need suunatakse pod'ile v1 vÔi v2:

Normaalse töö taastamiseks piisab reegli kustutamisest, meie puhul kÀsuga istioctl delete routerule recommendation-503 -n tutorial. Siin on Tutorial Red Hat OpenShift'i projekti nimi, kus meie Istio Ôpik töötab.
Lisame kunstlikud viivitused
Tehislikud 503 vead aitavad testida sĂŒsteemi taluvust riketeks, kuid vĂ”ime prognoosida ja hallata viivitusi peaks teid veelgi rohkem hĂ€mmastama. Ja tegelikus elus esinevad viivitused sageli rohkem kui rikete probleemid. Aeglaselt töötav mikroteenus on mĂŒrgine, mis mĂ”jutab kogu sĂŒsteemi. Istio abil saame testida koodi, mis kĂ€sitleb viivitusi, seda muudatusi tegemata. Alustuseks nĂ€itame, kuidas seda teha kunstlikult tekitatud vĂ”rgu viivituste korral.
Pange tĂ€hele, et sellise testimise jĂ€rel vĂ”ib teil olla vajadus (vĂ”i soov) oma koodi tĂ€iendada. Hea uudis on see, et sellisel juhul tegutsete proaktiivselt, mitte reaktiivselt. Just nii peaks olema ĂŒles ehitatud arendustsĂŒkkel: kodeerimine-testeerimine-tagasiside-kodeerimine-testeerimineâŠ
Nii nÀeb vÀlja reegel, mis⊠Kuigi teadsite, mis? Istio on nii lihtne ja see yaml-fail on nii arusaadav, et kÔik selles nÀites rÀÀgib ise enda eest, lihtsalt vaadake:

Pooles juhtudel on meil 7-sekundiline viivitus. See ei ole sama, nagu oleksime sisestanud algkoodis kĂ€su sleep, kuna Istio viivitab pĂ€ringu tegelikult 7 sekundiks. Kuna Istio toetab Jaegeri jĂ€litamist, on see viivitus selgelt nĂ€htav Jaegeri kasutajaliideses, nagu on nĂ€idatud alloleval ekraanipildil. Pange tĂ€hele, et paremas ĂŒlanurgas on pikk pĂ€ring â selle kestus on 7,02 sekundit:

See stsenaarium vÔimaldab testida koodi vÔrgu viivituse tingimustes. On selge, et kui eemaldame selle reegli, eemaldame ka kunstliku viivituse. Kordame end, kuid me tegime kÔik selle, puutumatult algkoodi.
Ărge tagasi astuge ja Ă€rge alla andke
Teine kasulik funktsioon Istios, mis aitab kaosetehnoloogiate valdkonnas, on vĂ”imalus teha teenusele korduvaid pĂ€ringuid antud arvu kordi. Idee on see, et me ei katkestaks katseid, kui esimene pĂ€ring lĂ”ppeb veaga 503 â ja vĂ”ib-olla, N-ndal korral Ă”nnestub meil. VĂ”ib-olla on teenus lihtsalt mĂ”neks ajaks puhkusele lĂ€inud. Jah, see pĂ”hjus tuleks kindlasti vĂ€lja selgitada ja kĂ”rvaldada. Aga see on hiljem, praegu proovime sĂŒsteemi töös hoida.
Nii et me tahame, et teenus aeg-ajalt vĂ€ljastaks vea 503, ja Istio pĂŒĂŒab sellele jĂ€rgnevalt uuesti ĂŒhendust vĂ”tta. Siinkohal on kindlasti vaja viisi genereerida viga 503, muutmata koodi iseâŠ
Peatu, oota! Me just tegime seda.
See fail muudab nii, et teenus recommendation-v2 vÀljastab pooled korrad vea 503:

Ilmselgelt osa pÀringutest lÔppeb ebaÔnnestumisega:

NĂŒĂŒd rakendame Istio retry funktsiooni:

See marsruutingureegel teeb kolm kordust kahe sekundi intervalliga ja peaks vÀhendama (ideaalis tÀiesti kÔrvaldama) vea 503:

KokkuvĂ”tteks kĂŒsime: kuidas Istio, kĂ”igepealt, genereerib 503 viga poolele pĂ€ringutele. Ja teiseks, sama Istio teeb kolm katset, et uuesti ĂŒhendust vĂ”tta teenusega 503 vea ilmnemisel. Tulemuseks töötab kĂ”ik suurepĂ€raselt. Seega, kasutades Retry funktsiooni, tĂ€itsime oma lubaduse mitte alla anda.
Ja jah, me tegime seda taas, puudutamata koodi. KÔik, mis meil vaja oli, oli kaks Istio marsruutimise reeglit:

Kuidas mitte kasutajat alt vedada vĂ”i seitsmeĂŒhe ootamine
Ja nĂŒĂŒd keerame olukorra tagurpidi ja vaatame stsenaariumi, kus mitte alla anda on Ă”igustatud ainult mÀÀratud ajavahemiku jooksul. Ja siis tuleb lihtsalt katsetest loobuda, et mitte sundida kĂ”iki ootama ĂŒhte aeglast teenust. TeisisĂ”nu, me ei kaitse kaduma lĂ€inud positsiooni, vaid taganeme varupositsioonile, et mitte kasutajat petta ja mitte sundida teda teadmatuses vaevlema.
Istios on vĂ”imalik seada pĂ€ringu tĂ€itmise ajapiirang. Kui teenus ĂŒletab selle ajapiirangu, tagastatakse viga 504 (Gateway Timeout) â kĂ”ik see toimub taas lĂ€bi Istio konfiguratsiooni. Kuid meil tuleb lisada teenuse lĂ€htekoodi kĂ€sk sleep (ja seejĂ€rel loomulikult teha rebuild ja redeploy), et simuleerida teenuse aeglast tööd. Kahjuks muidu ei Ă”nnestu.
Nii et me lisasime teenuse recommendation v2 koodis kolmese kunduses sleep, rekonstrueerisime vastava pildi ja tegime konteineri rediplomatise, nĂŒĂŒd lisame ajapiirangu jĂ€rgmise Istio marsruutimise reegli kaudu:

Ălaltoodud ekraanipildilt on nĂ€ha, et katkestame katse ĂŒhendust vĂ”tta teenusega recommendation, kui me ei saa vastust ĂŒhe sekundi jooksul, st isegi enne, kui 504 viga esineb. PĂ€rast selle marsruutimise reegli rakendamist (ja kolme sekundi sleep'i lisamist teenuse recommendation:v2 koodi) saame jĂ€rgmist:

Korrame jĂ€lle, kuid ajapiirangut saab seadistada, puudutamata lĂ€htekoodi. TĂ€iendav boonus on see, et nĂŒĂŒd saate oma koodi muuta nii, et see reageerib ajapiirangule, ja hĂ”lpsasti testida neid muudatusi Istio abil.
Ja nĂŒĂŒd kĂ”ik koos
Isto'ga kaose toomis on suurepĂ€rane viis katsetada oma koodi ja kogu sĂŒsteemi usaldusvÀÀrsust. Tagasilöögimallid, bulkhead ja circuit breaker, kunstlike rike ja viivitusmehhanismid, samuti uuesti kutsumised ja ajaĂŒlemised on ÀÀrmiselt kasulikud usaldusvÀÀrsete pilvesĂŒsteemide loomisel. Koos Kubernetes'i ja Red Hat OpenShift'iga aitavad need tööriistad tulevikku kindlalt siseneda.
Allikas: habr.com
