Istio Circuit Breaker: deaktiveerime riknenud konteinerid

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

Istio Circuit Breaker: deaktiveerime riknenud konteinerid

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. Red Hat Developer DemosSiin 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:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid

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.

Istio Circuit Breaker: deaktiveerime riknenud konteinerid
Nii nÀeb see reegli rakendamine vÀlja:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid
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:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid

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:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid
Istio Circuit Breaker: deaktiveerime riknenud konteinerid
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 Gene KranzEestikeelde 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. Kubernetes, Red Hat OpenShift, ja Istio.

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:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid
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:

siege -r 2 -c 20 -v customer-tutorial.$(minishift ip).nip.io

Istio Circuit Breaker: deaktiveerime riknenud konteinerid
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:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid
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:

Istio Circuit Breaker: deaktiveerime riknenud konteinerid

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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster