Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar

Festat kanë përfunduar, dhe ne kthehemi me postimin tonë të dytë nga seria mbi Istio Service Mesh.

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar

Sot tema është – Circuit Breaker, që në përkthimin në shqip do të thotë «prerës automatik», e njohur ndryshe si «mbrojtës automatik». Në Istio, ky prerës nuk ndalon një qark të shkurtër ose të ngarkuar, por ndalon kontejnerët e defektuar.

Si duhet të funksionojë idealisht

Kur mikroshërbimet menaxhohen nga Kubernetes, për shembull, brenda platformës OpenShift, ato automatikisht shkallëzohen lart e poshtë në varësi të ngarkesës. Duke qenë se mikroshërbimet funksionojnë në pod-e, në një pikë finale mund të ketë disa instanca të kontejnerizuar të mikroshërbimit, dhe Kubernetes do të rruazojë kërkesat dhe balancojë ngarkesën mes tyre. Dhe – në mënyrë ideale – të gjitha këto should të funksionojnë shkëlqyeshëm.

Ne kujtojmë se mikroshërbimet janë të vogla dhe efemere. Efemërsia, që këtu do të thotë thjeshtësinë e lindjes dhe zhdukjes, shpesh nënvlerësohet. Lindja dhe vdekja e një instance tjetër të mikroshërbimit në pod është një gjë mjaft e pritshme, OpenShift dhe Kubernetes e menaxhojnë mirë këtë, dhe gjithçka funksionon mrekullisht – por përsëri në teori.

Si funksionon në të vërtetë

Tani imagjinoni se një instancë e caktuar e mikroshërbimit, dmth kontejneri, ka dalë nga funksioni: ose nuk përgjigjet (gabimi 503), ose – që është më e pakëndshme – reagon, por shumë ngadalë. Me fjalë të tjera, ai është duke pësuar ngadalësim ose nuk përgjigjet në kërkesa, por nga pool-i ai nuk hiqet automatikisht. Çfarë duhet të bëjmë në këtë rast? Të përsërisim përpjekjen? Ta heqim nga skema e rruazimit? Dhe çfarë do të thotë «shumë ngadalë» – sa është kjo në numra, dhe kush i përcakton ato? Ndoshta thjesht t’i japim një pauzë dhe të provojmë më vonë? Nëse po, sa vonë?

Çfarë është Pool Ejection në Istio

Dhe këtu vjen në ndihmë Istio me automatet e tij të mbrojtjes Circuit Breaker, që përkohësisht heqin kontejnerët e defektuar nga pool-i i burimeve të rruazimit dhe balancimit të ngarkesës, duke realizuar procedurën e Pool Ejection.

Duke përdorur strategjinë e zbulimit të devijimeve (outlier detection), Istio detecton pod-e të këqija, që dallohet nga grupi përgjithshëm, dhe i heq ato nga pool-i i burimeve për një kohë të caktuar, e quajtur «dritarja e gjumit» (sleep window).

Për të ilustruar se si funksionon në Kubernetes në platformën OpenShift, le të fillojmë me një tërheqje të mikroshërbimeve që funksionojnë mirë nga shembulli në depo. Demonstrime nga Red Hat Developer. Këtu kemi dy podë, v1 dhe v2, në secilin prej të cilëve funksionon një kontejner. Kur rregullat e rrugës Istio nuk përdoren, Kubernetes në mënyrë të paracaktuar aplikon një rrugëzim ciklik të balancuar barabartë:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar

Po përgatitemi për dështimin

Para se të bëjmë Pool Ejection, duhet të krijojmë një rregull të rrugës Istio. Supozoni se duam të shpërndajmë kërkesat midis podëve në një raport 50/50. Për më tepër, do të rrisim numrin e konteinerëve v2 nga një në dy, kështu:

oc scale deployment recommendation-v2 --replicas=2 -n tutorial

Tani vendosim rregullin e rrugës për të shpërndarë trafikun midis podëve në një raport 50/50.

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Ja si duket rezultati i aplikimit të këtij rregulli:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Mund të argumentoni se në këtë ekran nuk është 50/50, por 14:9, por me kalimin e kohës situata do të rregullohet.

Po shkaktojmë dështimin

Tani do të çaktivizojmë një nga dy konteinerët v2, në mënyrë që të kemi një kontejner të mirë v1, një kontejner të mirë v2 dhe një kontejner të dështuar v2:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar

Po riparojmë dështimin

Pra, kemi një kontejner të dështuar, dhe është koha për Pool Ejection. Me një konfigurim shumë të thjeshtë, do të përjashtojmë këtë kontejner të dështuar nga çdo skemë rrugëzimi për 15 sekonda me shpresën se ai do të rikthehet në një gjendje normale (ose do të riaktivizohet, ose do të rikuperojë performancën). Këtu është si duket ky konfigurim dhe rezultatet e tij:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Siç shihet, kontejneri i dështuar v2 nuk përdoret më për rrugëzimin e kërkesave, pasi u hoq nga pool. Por pas 15 sekondash ai do të rikthehet automatikisht në pool. Në thelb, sapo e tregonim se si funksionon Pool Ejection.

Po fillojmë të ndërtojmë arkitekturën

Pool Ejection në kombinim me funksionalitetet e monitorimit Istio lejon fillimin e ndërtimit të një kornize për zëvendësimin automatik të konteinerëve të dëmtuar, për të reduktuar, madje edhe për të eliminuar, kohëzgjatjet dhe dështimet.

NASA ka një moto të njohur – Dështimi Nuk Është Një Opcioni, që mendohet se është shkruar nga menaxheri i fluturimeve Gene Kranz. Në shqip mund të përkthehet si "Dështimi nuk është një opsion", dhe kuptimi këtu është se gjithçka mund të funksionojë nëse keni mjaft vullnet. Megjithatë, në jetën reale, dështimet nuk ndodhin thjesht; ato janë të pashmangshme, kudo dhe në gjithçka. Si të përballeni me to në rastin e mikroshërbimeve? Sipas mendimit tonë, më mirë është të mos mbështeteni në forcën e vullnetit, por në mundësitë e konteinerëve. Kubernetes, Red Hat OpenShift, dhe Istio.

Istio, siç e përmendëm më sipër, implementon një koncept të provuar dhe të suksesshëm në botën fizike, atë të automatikëve të fikjes. Dhe si një automatik elektrik ndalon një pjesë problematike të zinxhirit, ashtu edhe Circuit Breaker në Istio ndërpret lidhjen midis rrjedhës së kërkesave dhe konteinerit problematik, kur diçka shkon keq me pikën përfundimtare, për shembull, kur serveri ka rënë ose ka filluar të ngadalësohet.

Dhe në rastin e dytë, problemet janë akoma më të shumta, pasi ngadalësimi i një konteineri jo vetëm që shkakton një kaskadë vonesash në shërbimet që i drejtohen atij, dhe si pasojë, ul rendimentin e sistemit në tërësi, por gjithashtu gjeneron përsëritje të kërkesave ndaj një shërbimi që tashmë është ngadalësuar, gjë që vetëm e rëndon situatën.

Circuit Breaker në teori

Circuit Breaker është një proxy që kontrollon rrjedhën e kërkesave në pikën përfundimtare. Kur kjo pikë ndalon së punuari ose – në varësi të cilësimeve të caktuara – fillon të ngadalësohet, proxy ndërpret lidhjen me konteinerin. Trafiku pas kësaj redirektohet në konteinerë të tjerë, thjesht për shkak të balancimit të ngarkesës. Lidhja mbetet e shkëputur (open) për një periudhë të caktuar, le të say dy minuta, dhe pastaj konsiderohet e gjysmë-shkëputur (half-open). Përpjekja për të dërguar kërkesën e ardhshme përcakton gjendjen e mëtejshme të lidhjes. Nëse gjithçka shkon mirë me shërbimin, lidhja kthehet në gjendjen funksionale dhe bëhet sërish e mbyllur (closed). Nëse me shërbimin ka ende diçka të keqe, lidhja ndërpritet sërish dhe hapet një tjetër periudhë pritjeje. Kjo është si duket një diagram i thjeshtë i ndryshimeve të gjendjeve të Circuit Breaker:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Është e rëndësishme të theksohet se e gjithë kjo ndodh në nivelin e arhitektures sistemore. Prandaj, në një moment, do t'ju duhet të mësoni aplikacionet tuaja të punojnë me Circuit Breaker, për shembull, duke ofruar një vlerë të paracaktuar në përgjigje ose, nëse është e mundur, të injoroni ekzistencën e shërbimit. Për këtë përdoret modeli bulkhead, por ai del jashtë kornizës së këtij artikulli.

Circuit Breaker në praktikë

Për shembull, ne do të nisnim në OpenShift dy versione të mikroshërbimit tonë të rekomandimeve. Versioni 1 do të funksionojë normalisht, ndërsa në v2 ne do të integrojmë një vonesë për të imituar ngadalësimin në server. Për të parë rezultatet, përdoret mjeti siege:

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

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Gjithçka duket se funksionon, por me çmimin e çfarë? Në dukje, kemi 100 % disponueshmëri, por shikoni me kujdes – maksimalja e kohës së transaksionit arrin deri në 12 sekonda. Kjo është një ngushticë e dukshme dhe duhet të zgjerohet.

Për këtë, ne do të eliminonim thirrjet ndaj konteinerëve të ngadaltë me ndihmën e Istio. Këtu është si duket konfigurimi përkatës duke përdorur Circuit Breaker:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar
Rreshti i fundit me parametrin httpMaxRequestsPerConnection sinjalizon se lidhja duhet të shpërndahen me përpjekjen për të krijuar një lidhje të re – të dytë – përveç asaj ekzistuese. Duke qenë se kontenieri ynë imiton një shërbim që ngadalëson, këto situata do të ndodhin herë pas here, dhe atëherë Istio do të kthejë një gabim 503, ndërsa ja çfarë do të tregojë siege:

Ishte Rrethit të Ritmit: çaktivizimi i kontejnerëve të dështuar

Mirë, tani kemi Circuit Breaker, çfarë ndodh më pas?

Pra, ne zbatuam shkëputjen automatike, pa prekur fare kodin burimor të shërbimeve. Duke përdorur Circuit Breaker dhe procedurën e përshkruar më lart Pool Ejection, ne mund t'i largojmë nga grupi i burimeve kontenierët ngadalësues deri sa ata të rikuperohen, dhe të kontrollojmë cilësinë e tyre me një periudhë të caktuar - në shembullin tonë, kjo është dy minuta (parametri sleepWindow).

Vini re se aftësia e aplikacionit për t'u përgjigjur ndaj gabimit 503 akoma përcaktohet në nivelin e kodit të tij burimor. Ekzistojnë shumë strategji për punën me Circuit Breaker, të cilat zbatohen në varësi të situatës.

Në postimin e ardhshëm: do të flasim për gjurmimin dhe monitorimin, të cilat janë tashmë të integruara ose lehtësisht të shtohen në Istio, si dhe se si të futim gabime në sistem në mënyrë të qëllimshme.

Burimi: habr.com

Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster