Istio Circuit Breaker: Desaktivéiere vun defekt Container

D'Feierdeeg sinn eriwwer a mir sinn zréck mat eisem zweete Post an der Istio Service Mesh Serie.

Istio Circuit Breaker: Desaktivéiere vun defekt Container

D'Thema vun haut ass Circuit Breaker, wat an russesch Elektrotechnik iwwersat heescht "Circuit Breaker", am allgemenge Sproch - "Circuit Breaker". Nëmmen an Istio trennt dës Maschinn net e verkierzten oder iwwerlaaschte Circuit, mee fehlerhafte Container.

Wéi soll dat am Idealfall funktionéieren

Wann Mikroservicer vu Kubernetes geréiert ginn, zum Beispill an der OpenShift Plattform, ginn se automatesch op an erof ofhängeg vun der Belaaschtung. Well Mikroservicer a Pods lafen, kënnen et e puer Instanzen vun engem containeriséierte Mikroservice op engem Endpunkt sinn, a Kubernetes wäert Ufroen routen a Laaschtbalance tëscht hinnen. An - am Idealfall - dat alles soll perfekt funktionnéieren.

Mir erënneren datt Mikroservicer kleng an ephemeral sinn. Ephemeralitéit, dat heescht hei d'Liichtegkeet fir opzekommen an ze verschwannen, gëtt dacks ënnerschat. D'Gebuert an den Doud vun enger anerer Instanz vun engem Mikroservice an engem Pod sinn zimlech erwaart Saachen, OpenShift a Kubernetes handhaben dëst gutt, an alles funktionnéiert super - awer erëm an der Theorie.

Wéi et wierklech funktionnéiert

Stellt Iech elo vir, datt eng spezifesch Instanz vun engem Mikrodéngscht, also e Container, onbrauchbar ginn ass: entweder se reagéiert net (Feeler 503), oder, wat méi désagréabel ass, et reagéiert, awer ze lues. An anere Wierder, et gëtt glitchy oder reagéiert net op Ufroen, awer et gëtt net automatesch aus dem Pool geläscht. Wat soll an dësem Fall gemaach ginn? Nach eng Kéier probéieren? Soll ech et aus dem Routing Schema ewechhuelen? A wat heescht "ze lues" - wéi vill ass et an Zuelen, a wien bestëmmt se? Vläit just eng Paus ginn a spéider nach eng Kéier probéieren? Wa jo, wéi vill méi spéit?

Wat ass Pool Ejection zu Istio

An hei kënnt Istio zur Rettung mat senge Circuit Breaker Schutzmaschinnen, déi temporär fehlerhafte Behälter aus dem Routing a Laaschtbalancéierungsressource Pool ewechhuelen, d'Pool Ejection Prozedur implementéieren.

Mat enger Outlier Detektiounsstrategie erkennt Istio Podkurven déi aus der Linn sinn an läscht se aus dem Ressourcepool fir eng virbestëmmte Zäit, eng Schloffenster genannt.

Fir ze weisen wéi dëst a Kubernetes op der OpenShift Plattform funktionnéiert, loosst eis mat engem Screenshot vun normal funktionnéierende Mikroservicer aus dem Beispill am Repository ufänken Red Hat Entwéckler Demos. Hei hu mir zwee Pods, v1 a v2, déi all ee Container lafen. Wann d'Istio Routing Regelen net benotzt ginn, setzt Kubernetes Standard op e gläichméisseg equilibréierte Round-Robin Routing:

Istio Circuit Breaker: Desaktivéiere vun defekt Container

Bereet Iech fir e Crash

Ier Dir Pool Ejection maacht, musst Dir eng Istio Routing Regel erstellen. Loosst eis soen, mir wëllen Ufroen tëscht Pods an engem 50/50 Verhältnis verdeelen. Zousätzlech wäerte mir d'Zuel vu v2 Container vun engem op zwee erhéijen, sou:

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

Elo setzen mir eng Routing Regel sou datt de Verkéier tëscht Pods an engem 50/50 Verhältnis verdeelt gëtt.

Istio Circuit Breaker: Desaktivéiere vun defekt Container
Hei ass wéi d'Resultat vun dëser Regel ausgesäit:

Istio Circuit Breaker: Desaktivéiere vun defekt Container
Dir kënnt Feeler mat der Tatsaach fannen datt dësen Écran net 50/50 ass, awer 14:9, awer mat der Zäit wäert d'Situatioun sech verbesseren.

E Feeler maachen

Loosst eis elo ee vun den zwee v2 Container ausschalten, sou datt mir ee gesonde v1 Container, ee gesonde v2 Container an ee defekte v2 Container hunn:

Istio Circuit Breaker: Desaktivéiere vun defekt Container

De Feeler fixéieren

Also, mir hunn e defekte Container, an et ass Zäit fir Pool Ejection. Mat enger ganz einfacher Konfiguratioun wäerte mir dëse gescheiterte Container aus all Routingschema fir 15 Sekonnen ausschléissen an der Hoffnung datt et an e gesonde Staat zréckkënnt (entweder nei starten oder d'Leeschtung restauréieren). Dëst ass wéi dës Configuratioun ausgesäit an d'Resultater vu senger Aarbecht:

Istio Circuit Breaker: Desaktivéiere vun defekt Container
Istio Circuit Breaker: Desaktivéiere vun defekt Container
Wéi Dir gesitt, gëtt de gescheitert v2 Container net méi fir Routing Ufroe benotzt well et aus dem Pool geläscht gouf. Awer no 15 Sekonnen geet et automatesch an de Pool zréck. Eigentlech hu mir just gewisen wéi Pool Ejection funktionnéiert.

Loosst eis ufänken Architektur ze bauen

Pool Ejection, kombinéiert mat Istio d'Iwwerwaachungsfäegkeeten, erlaabt Iech e Kader ze bauen fir automatesch defekt Behälter z'ersetzen fir ze reduzéieren, wann net eliminéieren, Ausdauer a Feeler.

D'NASA huet en haart Motto - Failure Is Not an Option, den Auteur vun deem gëllt als Fluchdirekter Gene Kranz. Et kann op Russesch iwwersat ginn als "Feeler ass keng Optioun", an d'Bedeitung hei ass datt alles ka gemaach ginn fir ze schaffen wann Dir genuch Wëllen hutt. Wéi och ëmmer, am richtege Liewen, Feeler geschéien net nëmmen, si sinn inévitabel, iwwerall an an allem. A wéi mat hinnen am Fall vu Mikroservicer ëmzegoen? An eiser Meenung no ass et besser net op Wëllenskraaft ze vertrauen, mee op d'Fäegkeete vu Container, Kubernetes, Red Hat OpenShiftan Istio.

Istio, wéi mir uewen geschriwwen, implementéiert d'Konzept vun Circuit breakers, déi sech gutt an der kierperlecher Welt bewisen huet. A grad wéi en elektresche Circuit Breaker e Problem Sektioun vun engem Circuit ausschalt, mécht d'Istio Software Circuit Breaker d'Verbindung tëscht engem Stream vun Ufroen an engem Problembehälter op wann eppes falsch mam Endpunkt ass, zum Beispill wann de Server erofgefall ass oder ugefaang huet maach mei lues.

Ausserdeem, am zweete Fall sinn et nëmme méi Probleemer, well d'Bremsen vun engem Container net nëmmen eng Kaskade vu Verspéidungen an de Servicer verursaachen, déi et kréien an, als Resultat, d'Leeschtung vum System als Ganzt reduzéieren, awer och widderholl generéieren. Demande un e schonn lues lafenden Service, deen d'Situatioun nëmmen verschäerft.

Circuit Breaker an der Theorie

Circuit Breaker ass e Proxy deen de Flux vun Ufroen op en Endpunkt kontrolléiert. Wann dëse Punkt ophält ze schaffen oder, ofhängeg vun den spezifizéierten Astellungen, fänkt un ze luesen, brécht de Proxy d'Verbindung mam Container. Den Traffic gëtt dann op aner Container ëmgeleet, einfach wéinst der Belaaschtung. D'Verbindung bleift oppen fir eng Schlof Fënster, sot zwou Minutten, an dann als Halschent oppen considéréiert. E Versuch déi nächst Ufro ze schécken bestëmmt de weideren Zoustand vun der Verbindung. Wann alles OK mam Service ass, geet d'Verbindung zréck an d'Aarbechtskonditioun a gëtt erëm zou. Wann et nach ëmmer eppes falsch mam Service ass, gëtt d'Verbindung ofgeschalt an d'Schloffenster gëtt erëm aktivéiert. Hei ass wéi e vereinfacht Circuit Breaker Staatsdiagramm ausgesäit:

Istio Circuit Breaker: Desaktivéiere vun defekt Container
Et ass wichteg hei ze notéieren datt dat alles um Niveau vun, souzesoen, Systemarchitektur geschitt. Dofir musst Dir iergendwann Är Uwendungen léieren mat Circuit Breaker ze schaffen, zum Beispill andeems Dir e Standardwäert als Äntwert liwwert oder, wa méiglech, d'Existenz vum Service ignoréiert. E Schottmuster gëtt dofir benotzt, awer et ass iwwer den Ëmfang vun dësem Artikel.

Circuit Breaker an der Praxis

Zum Beispill wäerte mir zwou Versioune vun eisem Empfehlungsmikroservice op OpenShift lafen. D'Versioun 1 funktionnéiert gutt, awer am v2 wäerte mir eng Verspéidung bauen fir Verlängerungen um Server ze simuléieren. Fir d'Resultater ze gesinn, benotzt den Tool Belagerung:

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

Istio Circuit Breaker: Desaktivéiere vun defekt Container
Alles schéngt ze schaffen, awer zu wéi engem Präis? Op den éischte Bléck hu mir 100% Disponibilitéit, awer kuckt méi no - déi maximal Transaktiounsdauer ass sou vill wéi 12 Sekonnen. Dëst ass kloer e Flaschenhals a muss ausgebaut ginn.

Fir dëst ze maachen, benotze mir Istio fir Uriff op luesen Container ze eliminéieren. Dëst ass wéi déi entspriechend Configuratioun ausgesäit mat Circuit Breaker:

Istio Circuit Breaker: Desaktivéiere vun defekt Container
Déi lescht Zeil mat dem Parameter httpMaxRequestsPerConnection signaliséiert datt d'Verbindung mat sollt ofgeschalt ginn wann Dir probéiert eng aner - eng zweet - Verbindung zousätzlech zu der existéierter ze kreéieren. Well eise Container e luesen Service simuléiert, entstinn esou Situatiounen periodesch, an dann Istio gëtt e 503 Feeler zréck, awer dat ass wat d'Belagerung weist:

Istio Circuit Breaker: Desaktivéiere vun defekt Container

OK, mir hunn Circuit Breaker, wat ass nächst?

Also hu mir automatesch Ausschalten implementéiert ouni de Quellcode vun de Servicer selwer ze beréieren. Benotzt Circuit Breaker an der Pool Ejection Prozedur uewen beschriwwen, kënne mir Bremscontainer aus dem Ressource Pool ewechzehuelen bis se zréck normal, an kontrolléieren hire Status op enger spezifizéierter Frequenz - an eisem Beispill, dat ass zwou Minutten (sleepWindow Parameter).

Bedenkt datt d'Fäegkeet vun enger Applikatioun op e 503 Feeler ze reagéieren nach ëmmer um Quellcodeniveau gesat gëtt. Et gi vill Strategien fir Circuit Breaker ze benotzen, jee no der Situatioun.

Am nächste Post: Mir schwätzen iwwer d'Tracing an d'Iwwerwaachung déi scho agebaut ass oder einfach op Istio bäigefüügt ass, wéi och wéi een bewosst Feeler an de System aféieren.

Source: will.com

Setzt e Commentaire