Istio Circuit Breaker: hibás konténerek lekapcsolása

A ünnepek véget értek, és visszatérünk Istio Service Mesh sorozatunk második bejegyzésével.

Istio Circuit Breaker: hibás konténerek lekapcsolása

A mai téma a Circuit Breaker, ami magyarul 'automata', a köztudatban pedig 'védelem' néven ismert. Csakúgy, mint Istióban, ez az automata nem a rövidzárlatos vagy túlterhelt áramkört kapcsolja ki, hanem a hibás konténereket.

Hogyan kellene ideálisan működnie

Amikor a mikroszolgáltatásokat a Kubernetes kezeli, például az OpenShift platform keretében, automatikusan felskálázza őket a terheléstől függően. Mivel a mikroszolgáltatások podokban futnak, egy végponton egyszerre több példány is lehet a konténerizált mikroszolgáltatásból, és a Kubernetes irányítja a kéréseket, valamint elosztja a terhelést közöttük. Ideálisan mindez jól működik.

Tartsuk észben, hogy a mikroszolgáltatások kicsik és efemer természetűek. Az efemeritás, amely itt a keletkezés és eltűnés egyszerűségét jelenti, gyakran alábecsült. Egy újabb mikroszolgáltatás példány keletkezése és megszűnése a podban teljesen elvárt események, az OpenShift és a Kubernetes jól megbirkózik ezzel, és minden csodálatosan működik - de ismételni kell, ez csak elmélet.

Hogyan működik ez valójában

Most képzeljünk el egy konkrét mikroszolgáltatás példányt, vagyis egy konténert, ami meghibásodott: vagy nem válaszol (503 hiba), vagy - ami kellemetlenebb - reagál, de túl lassan. Más szóval, akadozik vagy nem válaszol a kérésekre, de a poolból automatikusan nem távolítják el. Mit kell tenni ebben az esetben? Ismételni a próbálkozást? Eltávolítani a forgalomirányítási sémából? És mit jelent az, hogy 'túl lassan' - mennyit jelent ez számokban, és ki határozza meg őket? Talán csak adjunk neki egy kis szünetet, és próbálkozzunk később? Ha igen, akkor mennyi később?

Mi az a Pool Ejection az Istióban

És itt jön a segítségünkre az Istio a Circuit Breaker védelemmel, amelyek ideiglenesen eltávolítják a hibás konténereket a forgalomirányítási és terheléselosztási erőforrások pooljából, megvalósítva a Pool Ejection eljárását.

Az Istio a kiugró detektálási stratégiát (outlier detection) alkalmazva azonosítja a görbéktől eltérő podokat, és eltávolítja őket a nyersanyag pooljából egy megadott időre, amit 'alvó ablaknak' (sleep window) neveznek.

Ahhoz, hogy megmutassuk, hogyan működik a Kubernetes az OpenShift platformon, kezdjük egy képernyőképpel a megfelelően működő mikroszolgáltatásokról a tárolóból. Red Hat Developer Demos. Itt két podunk van, v1 és v2, mindkettőben egy-egy konténerrel. Amikor az Istio irányítási szabályokat nem használják, a Kubernetes alapértelmezés szerint egyenletesen kiegyensúlyozott körkörös irányítást alkalmaz:

Istio Circuit Breaker: hibás konténerek lekapcsolása

Felkészülés a hibára

Mielőtt végrehajtanánk a Pool Ejection-t, létre kell hoznunk egy Istio irányítási szabályt. Tegyük fel, hogy a pod-ok között 50/50 arányban szeretnénk elosztani a kéréseket. Ezen kívül növelni fogjuk a v2 konténerek számát egyből kettőre, így:

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

Most beállítjuk az irányítási szabályt, hogy a forgalmat 50/50 arányban osszuk el a pod-ok között.

Istio Circuit Breaker: hibás konténerek lekapcsolása
Így néz ki ennek a szabálynak az eredménye:

Istio Circuit Breaker: hibás konténerek lekapcsolása
Jogosan merülhet fel a kérdés, hogy ezen a képernyőképen nem 50/50 az arány, hanem 14:9, de idővel a helyzet stabilizálódni fog.

Hiba okozása

Most leállítunk egy v2 konténert, hogy legyen egy működő v1, egy működő v2 és egy nem működő v2 konténterünk:

Istio Circuit Breaker: hibás konténerek lekapcsolása

Hiba javítása

Tehát van egy nem működő konténterünk, és itt az ideje a Pool Ejection-nak. Egy nagyon egyszerű konfigurációval 15 másodpercig kizárjuk ezt a hibás konténert minden irányítási sémából, abban a reményben, hogy magától visszatér a működésbe (vagy újraindul, vagy helyreállítja a teljesítményét). Így néz ki ez a konfiguráció és az eredményei:

Istio Circuit Breaker: hibás konténerek lekapcsolása
Istio Circuit Breaker: hibás konténerek lekapcsolása
Ahogy látható, a hibás v2 konténert többé nem használják a kérések irányításában, mivel eltávolították a poolból. 15 másodperc elteltével automatikusan visszatér a poolba. Valójában csak most mutattuk be, hogyan működik a Pool Ejection.

Kezdünk építeni egy architektúrát

A Pool Ejection az Istio monitoring lehetőségeivel kombinálva lehetővé teszi a hibás konténerek automatikus helyettesítésére szolgáló keretrendszer kiépítését, hogy csökkentsük, vagy akár teljesen megszüntessük a leállásokat és hibákat.
 
A NASA-nak van egy híres mottója – Failure Is Not an Option, amelyet a repülési igazgató írt. Gene Kranz. Magyarra úgy lehet lefordítani, hogy „A kudarc nem lehetőség”, és a jelentése az, hogy mindent működésre lehet bírni, ha van rá elegendő akarat. Az igazi életben azonban a hibák nem csupán előfordulnak, hanem elkerülhetetlenek, mindenhol és mindent. És hogyan kezeljük ezeket a mikroszolgáltatások esetében? Véleményünk szerint jobb, ha nem az akaratunkra támaszkodunk, hanem a konténerek képességeire, Kubernetes, Red Hat OpenShift, és a Istio.

Az Istio, ahogy már említettük, remekül megvalósítja a fizikailag már jól bevált automatikus megszakítók koncepcióját. Ahogy az elektromos megszakító is lekapcsolja a problémás áramkört, úgy a programozási Circut Breaker az Istión az összeköttetést megszakítja a kérések áramlása és a problémás konténer között, amikor a végponttal valami baj van, például amikor a szerver leáll vagy elkezd akadozni.

A második esetben még több probléma merül fel, mivel egy konténer akadozása nemcsak láncreakciót indít el az általa elérni próbáló szolgáltatásokban, ezzel csökkentve a rendszer teljesítményét, hanem újabb kérésekhez is vezet a már amúgy is lassan működő szolgáltatáshoz, ami csak fokozza a helyzetet.

Circuit Breaker elméletben

A Circuit Breaker egy proxy, amely ellenőrzi a kérések áramlását a végpont felé. Amikor ez a pont már nem működik, vagy – a beállításoktól függően – elkezd akadozni, a proxy megszakítja a kapcsolatot a konténerrel. A forgalom ezután más konténerekre kerül átirányításra, csupán a terhelés egyensúlyozása miatt. A kapcsolat nyitott (open) marad a megadott alvási időszak alatt, mondjuk két percig, majd félig nyitottnak (half-open) számít. A következő kérés elküldésének kísérlete meghatározza a kapcsolat állapotát. Ha a szolgáltatással minden rendben van, a kapcsolat visszatér a működő állapotba és ismét zártnak (closed) számít. Ha viszont a szolgáltatással továbbra is probléma van, a kapcsolat megszakad, és újraindul az alvási időszak. Íme, így néz ki a Circuit Breaker állapotváltásának leegyszerűsített diagramja:

Istio Circuit Breaker: hibás konténerek lekapcsolása
Fontos megjegyezni, hogy mindez a rendszer architektúrájának szintjén zajlik. Ezért egy adott ponton meg kell tanítani az alkalmazásaidat a Circuit Breaker használatára, például alapértelmezett érték megadására válaszként, vagy ha lehetséges, a szolgáltatás létezésének figyelmen kívül hagyására. Ehhez a bulkhead minta használatos, de ez a cikk keretein túlmutat.

Circuit Breaker a gyakorlatban

Példának okáért futtatni fogunk két verziót a javaslatok mikroszolgáltatásunkból az OpenShift-en. Az 1. verzió normálisan fog működni, míg a v2-be késleltetést építünk be, hogy a szerver terhelését szimuláljuk. Az eredmények megtekintéséhez egy eszközt használunk siege:

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

Istio Circuit Breaker: hibás konténerek lekapcsolása
Minden úgy tűnik, hogy működik, de milyen áron? Első pillantásra 100% elérhetőségünk van, de nézd meg alaposabban – a tranzakciók maximális időtartama akár 12 másodperc is lehet. Ez nyilvánvalóan szűk keresztmetszet, és ezt kezelni kell.

Ezen okból kifolyólag az Istio segítségével kizárjuk a lassú konténerek elérését. Így néz ki a megfelelő konfiguráció a Circuit Breaker használatával:

Istio Circuit Breaker: hibás konténerek lekapcsolása
Az utolsó sor, amely a httpMaxRequestsPerConnection paramétert tartalmazza, jelzi, hogy a kapcsolatnak meg kell szakadásnia, ha próbálunk létrehozni egy új – második – kapcsolatot a már meglévő mellett. Mivel a konténerünk lassító szolgáltatást szimulál, ilyen helyzetek időről időre előfordulnak, és ilyenkor az Istio 503-as hibát fog visszaadni, de mit fog mutatni a siege:

Istio Circuit Breaker: hibás konténerek lekapcsolása

Rendben, van Circuit Breaker, mi a következő lépés?

Tehát automatikus lekapcsolást valósítottunk meg anélkül, hogy hozzá kellett volna nyúlnunk a szolgáltatások forráskódjához. A Circuit Breaker és a fent leírt Pool Ejection eljárás segítségével eltávolíthatjuk a lassító konténereket a források pooljából, amíg helyre nem állnak, és rendszeres időközönként ellenőrizhetjük az állapotukat – a példánkban ez két perc (sleepWindow paraméter).

Fontos megjegyezni, hogy az alkalmazásnak a 503-as hibára való reagálásának képessége még mindig a forráskódjában van meghatározva. Számos Circuit Breaker stratégiát alkalmaznak a helyzet függvényében.

A következő bejegyzésben: beszélünk a nyomkövetésről és a monitorozásról, amelyek már be vannak építve vagy könnyen hozzáadhatók az Istio-hoz, valamint arról, hogyan lehet szándékosan hibákat bevinni a rendszerbe.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster