PĂŒhad on lĂ€bi, ja me naaseme oma teise postitusega Istio Service Meshi seerias.

TĂ€na rÀÀgime Circuit Breaker'ist, mis tĂ€hendab eesti keeles 'automaatkaitse', slangikeeles - 'kaitseautomaat'. Ainult et Istios see automaat ei katkesta katkenud vĂ”i ĂŒlekoormatud voolu, vaid riknenud konteinerid.
Nii peaks see ideaalis toimima
Kui mikroteenuseid haldab Kubernetes, nĂ€iteks platvormi OpenShift raames, siis need skaleeruvad automaatselt ĂŒles- ja allapoole vastavalt koormusele. Kuna mikroteenused töötavad pod'ides, vĂ”ib ĂŒhel lĂ”pp-punktil olla korraga mitu konteinerit, ning Kubernetes suunab pĂ€ringud nende vahel ja tasakaalustab koormuse. Ja - ideaalis - peaks see kĂ”ik suurepĂ€raselt toimima.
Meeles peate, et mikroteenused on vĂ€ikesed ja mööduvad. Mööduvus, mis siin tĂ€hendab lihtsust tekkida ja kaduda, on sageli alahinnatud. Mikroteenuse sĂŒnd ja surm pod'is on tĂ€iesti ootuspĂ€rased, OpenShift ja Kubernetes saavad selle vĂ€ga hĂ€sti hakkama ning kĂ”ik toimib suurepĂ€raselt â kuid jĂ€lle teoorias.
Kuidas see tegelikult töötab
NĂŒĂŒd kujutage ette, et mingi konkreetne mikroteenuse instants, ehk konteiner, on rikki lĂ€inud: kas ei vasta (vea 503) vĂ”i â mis on veel hullem â reageerib, kuid liiga aeglaselt. TeisisĂ”nu, ta kĂ€itub aeglaselt vĂ”i ei vasta pĂ€ringutele, kuid samas ei eemaldata teda automaatselt reservi. Mida sel juhul ette vĂ”tta? Korduskatse? Eemaldada see marsruudist? Ja mis tĂ€hendab âliiga aeglaseltâ â kui palju see numbrites on ja kes mÀÀrab need? Kas vĂ”ib-olla tuleks talle lihtsalt paus anda ja proovida hiljem? Kui jah, siis kui kaua hiljem?
Mis on Pool Ejection Istios
Ja siin tuleb appi Istio oma Circuit Breaker automaatidega, mis ajutiselt eemaldavad vigased konteinerid marsruutimise ja koormuse tasakaalustamise ressursside kassist, rakendades protseduuri Pool Ejection.
Kasutades kĂ”rvalekallete tuvastamise strateegiat (outlier detection), tuvastab Istio ebaĂ”iged podâid, mis eristuvad tavalisest, ja eemaldab nad mÀÀratud ajaks ressursside kassist, mida nimetatakse 'unereĆŸiimiks' (sleep window).
KĂŒsimiseks, kuidas see Kuberneteses platvormil OpenShift töötab, alustame ekraanipildist normaalselt toimivatest mikroteenustest nĂ€ites hoidlast. . Siin on meil kaks podâi, v1 ja v2, millest igas töötab ĂŒks konteiner. Kui Istio marsruutimise reegleid ei kasutata, rakendab Kubernetes vaikimisi ĂŒhtlaselt tasakaalustatud tsĂŒklilist marsruuti:

Valmistume rikke jaoks
Enne Pool Ejectionâit tuleb luua Istio marsruutimise reegel. Oletame, et soovime jaotada pĂ€ringud podâide vahel suhtega 50/50. Lisaks suurendame konteinerite arvu v2-l ĂŒhest kahele, nagu siin:
oc scale deployment recommendation-v2 --replicas=2 -n tutorial
Seame reeglid suunamiseks, et liiklus jaguneks-pod'ide vahel 50/50.

Nii nÀeb selle reegli töö tulemus vÀlja:

VÔib öelda, et sellel ekraanil ei ole 50/50, vaid 14:9, kuid aja jooksul olukord stabiliseerub.
Teeme rikke
NĂŒĂŒd viime ĂŒhe kahest konteinerist v2 rikki, et meil oleks ĂŒks töötav konteiner v1, ĂŒks töötav konteiner v2 ja ĂŒks rikki minna konteiner v2:

Parandame rikke
Nii, meil on rikki lÀinud konteiner ja aeg on Pool Ejectiooni jaoks. VÀga lihtsa konfiguraatori abil vÀlistame selle rikki lÀinud konteineri mis tahes suunamisest 15 sekundiks, lootuses, et see taastub (kas ta taaskÀivitub vÔi taastab oma jÔudluse). Nii nÀeb see konfiguratsioon vÀlja ja millised on selle tulemused:


Nagu nÀha, ei kasutata rikki lÀinud konteinerit v2 enam pÀringute suunamiseks, kuna see on puul vÀlja toodud. Kuid 15 sekundi möödumisega naaseb see automaatselt puusse. Tegelikult just nÀitasime, kuidas Pool Ejectioon töötab.
Alustame arhitektuuri loomist
Pool Ejection koos Istio jÀlgimisvÔimalustega vÔimaldab luua automaatse rikke pÔhjustanud konteinerite asendamise raamistikku, et vÀhendada vÔi isegi tÀielikult kÔrvaldada seiskumisi ja tÔrkeid.
â
NASA-l on ĂŒks tuntud moto â Failure Is Not an Option, mille autor on lennujuht. . Selle tĂ”lge eesti keelde on âEbaĂ”nnestumine ei ole variantâ, ja mĂ”te on selles, et kĂ”ik on vĂ”imalik tööle panna, kui on piisavalt tahet. Kuid tegelikus elus ei juhtu tĂ”rked lihtsalt, need on vĂ€ltimid, kĂ”ikjal ja igal pool. Kuidas nendega siis toime tulla mikroteenustes? Meie arvates on parem toetuda mitte tahtejĂ”ule, vaid konteinerite vĂ”imalustele. , , ja .
Istio rakendab nagu eelpool nimetatud automaatse kaitselĂŒliti kontseptsioon, mis on end fĂŒĂŒsilises maailmas tĂ”estanud. Nii nagu elektriline kaitselĂŒliti katkestab probleemse ahela osa, katkestab programmi Circuit Breaker Istios ĂŒhenduse pĂ€ringute voo ja probleemse konteineri vahel, kui lĂ”pp-punktiga on midagi valesti, nĂ€iteks kui server on maha kukkunud vĂ”i hakkab rahmeldama.
Teises olukorras on probleeme veelgi rohkem, kuna ĂŒhe konteineri pidurid mitte ainult ei pĂ”hjusta kaskaadset viivitust sellele juurdepÀÀsuga teenustes, vĂ€hendades seelĂ€bi sĂŒsteemi ĂŒldist jĂ”udlust, vaid tekitavad ka korduvaid pĂ€ringuid juba niigi aeglases teenuses, mis vaid sĂŒvendab olukorda.
Circuit Breaker teoorias
Circuit Breaker â see proxy, which controls the flow of requests to an endpoint. When this endpoint stops working or, depending on the configured settings, starts lagging, the proxy breaks the connection with the container. Traffic is then redirected to other containers simply due to load balancing. The connection remains open for a specified sleep window, say two minutes, after which it is considered half-open. An attempt to send the next request determines the further state of the connection. If everything is fine with the service, the connection returns to operational state and becomes closed again. If, however, there is still an issue with the service, the connection opens again and the sleep window is reactivated. Hereâs a simplified state change diagram of the Circuit Breaker:

Siin on oluline mĂ€rkida, et kogu see toimub sĂŒsteemi arhitektuuri tasemel. SeetĂ”ttu peate mingi hetk Ă”petama oma rakendusi töötama Circuit Breakeriga, nĂ€iteks andma vastuseks vaikimisi vÀÀrtuse vĂ”i, kui see on vĂ”imalik, ignoreerima teenuse olemasolu. Selleks kasutatakse bulkhead pattern'i, kuid see jÀÀb vĂ€lja selle artikli raamist.
Circuit Breaker praktikas
NÀiteks kÀivitame OpenShiftis kaks versiooni meie soovituste mikroteenusest. Versioon 1 töötab normaalselt, kuid v2-s lisame viivituse, et simuleerida serveri aeglustusi. Tulemuste vaatamiseks kasutatakse tööriista :
siege -r 2 -c 20 -v customer-tutorial.$(minishift ip).nip.io

KĂ”ik tundub töötavat, aga mis hinnaga? Esmapilgul on meil 100% kĂ€ttesaadavus, kuid vaadake lĂ€hemalt â maksimumm aega tehingu jaoks on tervelt 12 sekundit. See on selgelt kitsaskohaks ja seda tuleb avardada.
Selleks vĂ€listame Istio abil ĂŒhendused aeglaste konteineritega. Niisiis, selline on vastav konfigureerimine, kasutades Circuit Breakerit:

Viimane rida parameetriga httpMaxRequestsPerConnection nĂ€itab, et ĂŒhendus tuleb katkestada, kui ĂŒritatakse luua veel ĂŒks â teine â ĂŒhendus olemasoleva kĂ”rval. Kuna meie konteiner simuleerib aeglustavat teenust, esinevad sellised olukorrad perioodiliselt ja siis tagastab Istio vea 503, aga mida nĂ€itab siege:

Okei, meil on Circuit Breaker, mis edasi?
Nii et oleme rakendanud automaatse katkestamise, puutumatult muutmata teenuste algkoodi. Kasutades Circuit Breakerit ja eespool kirjeldatud protseduuri Pool Ejection, saame eemaldada aeglustavad konteinerid ressursi reservuaarist, kuni nad normaliseeruvad, ning kontrollida nende staatust mÀÀratud ajavahemiku jĂ€rel â meie nĂ€ites on see kaks minutit (parameeter sleepWindow).
Pange tÀhele, et rakenduse vÔime reageerida veale 503 mÀÀratakse endiselt selle algkoodi tasemel. On mitmeid Circuit Breakeri tööstrateegiaid, mida rakendatakse sÔltuvalt olukorrast.
JĂ€rgmises postituses: rÀÀgime jĂ€lgimisest ja monitooringust, mis on juba sisseehitatud vĂ”i kergesti lisatavad Istiosse, ning sellest, kuidas sĂŒsteemi vigu teadlikult sisestada.
Allikas: habr.com
