PĂŒhad on möödas ja naaseme oma teise postitusega Istio Service Mesh'i seeriast.

TĂ€na kĂ€sitleme teemat â Circuit Breaker, mis elektritehnikas tĂ€hendab "automaatkatkestit" ja igapĂ€evaselt "kaitseautomaat". Kuid Istio puhul katkestab see automaat mitte lĂŒhise vĂ”i ĂŒlekoormatud ahela, vaid riknenud konteinerid.
Kuidas see ideaaljuhul tööle peaks minema
Kui mikroteenuseid haldab Kubernetes, nĂ€iteks OpenShift'i platvormil, skaleeruvad need automaatselt ĂŒles-alla sĂ”ltuvalt koormusest. Kuna mikroteenused töötavad pod'ides, vĂ”ib ĂŒhel lĂ”pp-punktil samal ajal olla mitu konteineriseeritud mikroteenuse eksemplari, ning Kubernetes suunab pĂ€ringud ja tasakaalustab koormust nende vahel. Ja â ideaaljuhul â peaks kĂ”ik see toimima suurepĂ€raselt.
Peame meeles, et mikroteenused on vĂ€ikesed ja efemeersed. Efemeersus, mis siin tĂ€hendab kergust tekkimise ja kadumise osas, on sageli alahinnatud. Uue mikroteenuse juhusliku eksemplari sĂŒnn ja surm pod'is on ootuspĂ€rased, OpenShift ja Kubernetes haldavad seda hĂ€sti, ja kĂ”ik töötab imeliselt â kuid taaskord, vaid teoorias.
Kuidas see tegelikult töötab
Kujutage nĂŒĂŒd ette, et mingi konkreetne mikroteenuse eksemplar, nimelt konteiner, on rikki lĂ€inud: kas ei reageeri (viga 503) vĂ”i, mis on veel hullem, reageerib, kuid liiga aeglaselt. TeisisĂ”nu, ta jÀÀb 'hanguma' vĂ”i ei vasta pĂ€ringutele, kuid ei kĂ”rvaldata automaatselt ressursside hulgast. Mida siis teha? Korrata katset? Eemaldada see marsruutimisest? Ja mis tĂ€hendab "liiga aeglaselt" â kui suur on see number ja kes selle mÀÀrab? Kas tuleks lihtsalt anda talle pausi ja proovida hiljem? Kui kaua peaks ootama?
Mis on Pool Ejection Istios
Ja siin tuleb appi Istio oma Circuit Breaker'itega, mis ajutiselt eemaldavad riknenud konteinerid marsruudi ja koormuse tasakaalustamise ressurssidest, rakendades Pool Ejection'i protseduuri.
Kasutades kĂ”rvalekallete tuvastamise strateegiat (outlier detection), tuvastab Istio kĂ”rvalekaldeid nĂ€itavad pod'id, mis ei vasta ĂŒldisele mustrile, ja eemaldab need ressursside hulgast mÀÀratud ajaks, mida nimetatakse "uneaknaks" (sleep window).
Kuidas see OpenShift'i Kuberneteses töötab, nĂ€itame, alustades ekraanipildist hĂ€sti funktsioneerivatest mikroteenustest nĂ€ites hoidlasse. Siin on meil kaks pod'i, v1 ja v2, kus kummaski töötab ĂŒks konteiner. Kui Istio suunamisreegleid ei kasutata, rakendab Kubernetes vaikesena ĂŒhtlaselt tasakaalustatud ringikujulist suunamist:

Valmistume tÔrkeks
Enne kui teeme Pool Ejection, peame looma Istio suunamisreeglid. Oletame, et tahame jagada pĂ€ringud pod'ide vahel 50/50. Lisaks suurendame konteinerite v2 arvu ĂŒhelt kahele, nii et:
oc scale deployment recommendation-v2 --replicas=2 -n tutorial
NĂŒĂŒd mÀÀrame suunamisreegli, et liiklus jaguneks pod'ide vahel 50/50.

Nii nÀeb see reegli rakendamine vÀlja:

VÔib vaielda, et sellel ekraanil pole 50/50, vaid 14:9, kuid aja jooksul olukord stabiliseerub.
Teeme tÔrke
NĂŒĂŒd vĂ”tame vĂ€lja ĂŒhe kahest konteinerist v2, et meil oleks ĂŒks töötav konteiner v1, ĂŒks töötav konteiner v2 ja ĂŒks rikki minev konteiner v2:

Parandame tÔrke
NĂŒĂŒd on meil rikki minev konteiner ja on aeg teha Pool Ejection. VĂ€ga lihtsa konfiguratsiooni abil eemaldame selle rikki mineva konteineri kĂ”ikidest suunamiskeemidest 15 sekundiks, lootuses, et see naaseb töökorda (kas siis taaskĂ€ivitudes vĂ”i taastades oma jĂ”udluse). Nii nĂ€eb see konfiguratsioon ja selle tulemused vĂ€lja:


Nagu nÀha, ei kasutata rikki minevat konteinerit v2 enam pÀringute suunamisel, kuna see on eemaldatud grupist. 15 sekundi möödudes naaseb see automaatselt gruppi. Nii et me just nÀitasime, kuidas Pool Ejection töötab.
Alustame arhitektuuri loomist
Pool Ejection koos Istio jÀlgimisvÔimalustega vÔimaldab alustada rikete automaatse asendamise raamistruktuuri loomist, et vÀhendada vÔi isegi kÔrvaldada seisakuid ja riketeid.
â
NASA-l on ĂŒks tuntud moto â TĂ”rge Pole Valik, mille autoriks peetakse lennujuhti Eestikeelde vĂ”ib selle tĂ”lkida kui "TĂ”rje ei ole variant" ja selle mĂ”te on, et kĂ”ike on vĂ”imalik tööle panna, kui on piisavalt tahtejĂ”udu. Siiski juhtub tĂ”elises elus tĂ”rkeid mitte lihtsalt, vaid need on vĂ€ltimatud, kĂ”ikjal ja igas asjas. Kuidas nende tĂ”rgetega mikroteenuste puhul toime tulla? Meie arvates on parem toetuda mitte tahtejĂ”ule, vaid konteinerite vĂ”imalustele. , , ja .
Istio, nagu me juba eespool kirjutasime, rakendab suurepĂ€raselt tunnustatud fĂŒĂŒsilise maailma automaatsete kaitselĂŒlitite kontseptsiooni. Nagu elektriline kaitselĂŒliti katkestab probleemse ahela osa, katkestab programmiline Circuit Breaker Istios ĂŒhenduse pĂ€ringute vooge ja probleemse konteineri vahel, kui lĂ”pp-punktiga on midagi vale, nĂ€iteks kui server on kokku kukkunud vĂ”i hakkab aeglustuma.
Teise puhul on probleeme isegi rohkem, kuna ĂŒhe konteineri aeglustamine mitte ainult ei pĂ”hjusta ahel-viivitusi, mis tekivad sellele suunatud teenustes ning seelĂ€bi vĂ€hendab sĂŒsteemi tervikuna tootlikkust, vaid ka tekitab korduvaid pĂ€ringuid juba aeglaselt töötavale teenusele, mis ainult halvendab olukorda.
Circuit Breaker teoorias
Circuit Breaker on proksi, mis kontrollib pĂ€ringute voogu lĂ”pp-punktile. Kui see punkt peatub töötamast vĂ”i â sĂ”ltuvalt mÀÀratud seadistustest â hakkab aeglustuma, katkestab proksi ĂŒhenduse konteineriga. PĂ€rast seda suunatakse liiklus teistesse konteineritesse lihtsalt koormuse tasakaalustamise tĂ”ttu. Ăhendus jÀÀb avatud (open) mÀÀratud uneakna, nĂ€iteks kahe minuti ajaks, ja seejĂ€rel muutub see poolavatuks (half-open). JĂ€rgmise pĂ€ringu saatmise katse mÀÀrab edasise ĂŒhenduse seisundi. Kui teenusega on kĂ”ik korras, taastub ĂŒhendus ja muutub taas suletuks (closed). Kui aga teenusega on endiselt midagi valesti, katkestatakse ĂŒhendus ja uneaken aktiveeritakse uuesti. Nii nĂ€eb vĂ€lja lihtsustatud Circuit Breaker'i oleku diagramm:

Siin on oluline mĂ€rkida, et kĂ”ik see toimub nii-öelda sĂŒsteemi arhitektuuri tasandil. SeetĂ”ttu peate varem vĂ”i hiljem Ă”petama oma rakendusi töötama Circuit Breaker'iga, nĂ€iteks tagastama vaikimisi vÀÀrtuse vĂ”i, kui vĂ”imalik, ignoreerima teenuse olemasolu. Selleks kasutatakse bulkhead pattern'i, kuid see jÀÀb sellest artiklist vĂ€ljapoole.
Circuit Breaker praktikas
NÀiteks kÀivitame OpenShift'is kaks versiooni meie soovituste mikroteenust. Versioon 1 töötab normaalselt, kuid v2-s lisame viivituse, et simuleerida serveri mahajÀÀmust. Tulemuste vaatamiseks kasutatakse tööriista :
siege -r 2 -c 20 -v customer-tutorial.$(minishift ip).nip.io

KĂ”ik nĂ€ib töötavat, kuid mis hinnaga? Esmapilgul on meil 100% kĂ€ttesaadavus, kuid vaadake lĂ€hemalt â maksimaalne tehingu kestus on tervelt 12 sekundit. See on selge kitsaskoht ja seda tuleb laiendada.
Selleks vÀlistame koos Istio'ga aeglased konteinerid. Nii nÀeb vÀlja vastav konfigureerimine Circuit Breaker'iga:

Viimane rida, mille parameeter httpMaxRequestsPerConnection, signaliseerib, et ĂŒhendus peaks katkema, kui proovite luua veel ĂŒhe â teise â ĂŒhenduse juba olemasoleva kĂ”rval. Kuna meie konteiner simuleerib aeglustavat teenust, esinevad sellised olukorrad perioodiliselt, ja sel juhul tagastab Istio vea 503, kuid siin on, mida siege nĂ€itab:

Okei, meil on Circuit Breaker, mis edasi?
Nii oleme rakendanud automaatse katkestamise, puudutamata teenuste lĂ€htekoodi. Kasutades Circuit Breaker'it ja eespool kirjeldatud protseduuri Pool Ejection, saame eemaldada ressursipoolist aeglased konteinerid, kuni need on normaliseerunud, ja kontrollida nende seisundit etteantud ajavahemike jĂ€rel â meie nĂ€ites on see kaks minutit (parameeter sleepWindow).
Pange tÀhele, et rakenduse vÔime reageerida veale 503 on endiselt mÀÀratud tema lÀhtekoodis. Circuit Breaker'i toimimise strateegiaid on palju, mida rakendatakse sÔltuvalt olukorrast.
JĂ€rgmises postituses: rÀÀgime jĂ€lgimisest ja monitooringust, mis on juba integreeritud vĂ”i kergesti lisatavad Istio'sse, samuti sellest, kuidas sĂŒsteemi teadlikult vigu sisestada.
Allikas: habr.com
