Istio Circuit Breaker: disattivazione di cuntenituri difettosi

E vacanze sò finite è simu di ritornu cù u nostru secondu postu in a serie Istio Service Mesh.

Istio Circuit Breaker: disattivazione di cuntenituri difettosi

U tema di l'oghje hè Circuit Breaker, chì traduttu in l'ingegneria elettrica russa significa "circuit breaker", in lingua cumuni - "circuit breaker". Solu in Istio sta macchina ùn disconnect un circuitu in cortocircuiti o sovraccarichi, ma cuntenituri difettosi.

Cumu questu deve travaglià idealmente

Quandu i microservizi sò gestiti da Kubernetes, per esempiu in a piattaforma OpenShift, si scalanu automaticamente in up and down secondu a carica. Siccomu i microservizi funzionanu in pods, ponu esse parechje istanze di un microserviziu cuntainerizatu in un puntu finale, è Kubernetes indirizzerà e richieste è u bilanciu di carica trà elli. E - idealmente - tuttu questu duverebbe travaglià perfettamente.

Ricurdamu chì i microservizi sò chjuchi è effimeri. L'efimeralità, chì quì significa a facilità d'apparizione è di sparisce, hè spessu sottuvalutata. A nascita è a morte di un'altra istanza di un microserviziu in un pod sò cose abbastanza previste, OpenShift è Kubernetes trattanu questu bè, è tuttu funziona bè - ma dinò in teoria.

Cumu funziona veramente

Avà imaginate chì un esempiu specificu di un microserviziu, vale à dì un cuntinuu, hè diventatu inutilizabile: o ùn risponde micca (errore 503), o, ciò chì hè più sgradevule, risponde, ma troppu pianu. In altre parolle, diventa glitchy o ùn risponde micca à e dumande, ma ùn hè micca automaticamente eliminatu da a piscina. Cosa deve esse fattu in stu casu? Per ripruvà ? Deve sguassà da u schema di routing? E chì significa "troppu lento" - quantu hè in numeri, è quale li determina? Forse dà solu una pausa è pruvate di novu dopu? Sì cusì, quantu dopu?

Cosa hè Pool Ejection in Istio

È quì Istio vene in salvezza cù i so machini di prutezzione Circuit Breaker, chì sguassate temporaneamente i cuntenituri difettusi da a piscina di risorse di routing è di bilanciamentu di carica, implementendu a prucedura Pool Ejection.

Utilizendu una strategia di rilevazione di outlier, Istio detecta i podi di curve chì sò fora di linea è li elimina da u pool di risorse per una quantità specifica di tempu, chjamata finestra di sonnu.

Per dimustrà cumu funziona in Kubernetes nantu à a piattaforma OpenShift, cuminciamu cù una screenshot di i microservizi chì funzionanu normalmente da l'esempiu in u repository. Red Hat Developer Demos. Quì avemu dui pods, v1 è v2, ognuna chì gestisce un containeru. Quandu e regule di routing Istio ùn sò micca aduprate, Kubernetes hà da fà per default un routing round-robin uniformemente equilibratu:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi

Preparate per un crash

Prima di fà Pool Ejection, avete bisognu di creà una regula di routing Istio. Diciamu chì vulemu distribuisce e dumande trà pods in un rapportu 50/50. Inoltre, aumenteremu u numeru di cuntenituri v2 da unu à dui, cusì:

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

Avà avemu stabilitu una regula di routing per chì u trafficu hè distribuitu trà pods in un rapportu 50/50.

Istio Circuit Breaker: disattivazione di cuntenituri difettosi
Eccu ciò chì u risultatu di sta regula pare:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi
Pudete truvà difettu cù u fattu chì sta schermu ùn hè micca 50/50, ma 14: 9, ma cù u tempu a situazione hà da migliurà.

Facendu un glitch

Avà disattivemu unu di i dui cuntenituri v2 in modu chì avemu un cuntainer v1 sanu, un cuntainer v2 sanu è un cuntainer v2 difettu:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi

Fixing the glitch

Allora, avemu un cuntinuu difettu, è hè u tempu di Pool Ejection. Utilizendu una cunfigurazione assai simplice, escluderemu stu containeru fallutu da qualsiasi schemi di routing per 15 seconde in a speranza chì tornerà à un statu sanu (o riavvia o restaurà u rendiment). Eccu ciò chì pare sta cunfigurazione è i risultati di u so travagliu:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi
Istio Circuit Breaker: disattivazione di cuntenituri difettosi
Comu pudete vede, u cuntainer v2 fallutu ùn hè più utilizatu per e dumande di routing perchè hè statu eliminatu da a piscina. Ma dopu à 15 seconde, torna automaticamente à a piscina. In fatti, avemu appena dimustratu cumu funziona Pool Ejection.

Cuminciamu à custruisce l'architettura

Pool Ejection, cumminatu cù e capacità di monitoraghju di Istio, vi permette di cumincià à custruisce un framework per rimpiazzà automaticamente i cuntenituri difetti per riduce, se micca eliminà, i tempi di inattività è i fallimenti.

A NASA hà un mottu forte - U fallimentu ùn hè micca una opzione, l'autore di quale hè cunsideratu cum'è u direttore di u volu. Gene Kranz. Pò esse traduttu in russo cum'è "Failure ùn hè micca una opzione", è u significatu quì hè chì tuttu pò esse fattu per travaglià s'ellu avete abbastanza vuluntà. Tuttavia, in a vita reale, i fallimenti ùn sò micca solu, sò inevitabbili, in ogni locu è in tuttu. E cumu trattà cun elli in u casu di i microservizii? In u nostru parè, hè megliu di cunfidassi micca di a forza di vuluntà, ma di e capacità di cuntenituri, Kubernetes, RedHat OpenShifte Istio.

Istio, cum'è avemu scrittu sopra, implementa u cuncettu di circuit breakers, chì hà pruvatu bè in u mondu fisicu. È cum'è un interruttore di circuitu elettricu spegne una sezione problematica di un circuitu, u software Circuit Breaker d'Istio apre a cunnessione trà un flussu di richieste è un containeru di prublema quandu qualcosa hè sbagliatu cù l'endpoint, per esempiu, quandu u servitore s'hè lampatu o hà cuminciatu à sbattà. rallenta.

Inoltre, in u sicondu casu, ci sò solu più prublemi, postu chì i freni di un containeru ùn solu causanu una cascata di ritardi in i servizii chì accede à ellu è, in u risultatu, riduce u rendiment di u sistema in tuttu, ma ancu generanu ripetuti. dumande à un serviziu digià lento, chì aggrava solu a situazione.

Circuit Breaker in teoria

Circuit Breaker hè un proxy chì cuntrolla u flussu di richieste à un endpoint. Quandu stu puntu smette di travaglià o, sicondu i paràmetri specificati, cumencia à rallentà, u proxy rompe a cunnessione cù u cuntinuu. U trafficu hè allora redirettu à altri cuntainer, solu per via di l'equilibriu di carica. A cunnessione resta aperta per una data finestra di sonnu, dì dui minuti, è dopu hè cunsideratu mezzu apertu. Un tentativu di mandà a prossima dumanda determina u statu ulteriore di a cunnessione. Se tuttu hè bè cù u serviziu, a cunnessione torna in cundizione di travagliu è torna chjusu. Se ci hè ancu qualcosa di sbagliatu cù u serviziu, a cunnessione hè disconnected è a finestra di u sonnu hè riattivata. Eccu ciò chì pare un schema simplificatu di u statu di Circuit Breaker:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi
Hè impurtante di nutà quì chì tuttu questu succede à u livellu di l'architettura di u sistema. Dunque, in un certu puntu, duverete insignà à e vostre applicazioni à travaglià cù Circuit Breaker, per esempiu furnisce un valore predeterminatu in risposta o, se pussibule, ignurà l'esistenza di u serviziu. Un mudellu di bulkhead hè utilizatu per questu, ma hè fora di u scopu di stu articulu.

Circuit Breaker in pratica

Per esempiu, correremu duie versioni di u nostru microserviziu di ricunniscenza in OpenShift. A versione 1 hà da travaglià bè, ma in v2 custruiremu in un ritardu per simulà i rallentamenti in u servitore. Per vede i risultati, utilizate u strumentu assediu:

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

Istio Circuit Breaker: disattivazione di cuntenituri difettosi
Tuttu pare di travaglià, ma à chì costu? À u primu sguardu, avemu 100% dispunibilità, ma fate un ochju più vicinu - a durata massima di a transazzione hè quant'è 12 seconde. Questu hè chjaramente un collu di buttiglia è deve esse allargatu.

Per fà questu, useremu Istio per eliminà e chjama à i cuntenituri lenti. Questu hè ciò chì a cunfigurazione currispondente pare cù Circuit Breaker:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi
L'ultima linea cù u paràmetru httpMaxRequestsPerConnection signala chì a cunnessione cù deve esse disconnected when trying to create another - a second - connection in addition to the existing one. Siccomu u nostru cuntinuu simula un serviziu lento, tali situazioni surgiranu periodicamente, è tandu Istio torna un errore 503, ma questu hè ciò chì assediu mostrarà:

Istio Circuit Breaker: disattivazione di cuntenituri difettosi

OK, avemu Circuit Breaker, chì hè dopu?

Cusì, avemu implementatu a spegnimentu automaticu senza toccu u codice fonte di i servizii stessi. Utilizendu Circuit Breaker è a prucedura Pool Ejection descritta sopra, pudemu caccià i cuntenituri di frenu da a piscina di risorse finu à ch'elli tornanu à u normale, è verificate u so status à una freccia specifica - in u nostru esempiu, questu hè dui minuti (parametru sleepWindow).

Nota chì a capacità di una applicazione per risponde à un errore 503 hè sempre stabilitu à u livellu di u codice fonte. Ci hè parechje strategie per aduprà Circuit Breaker, secondu a situazione.

In u prossimu postu: Parleremu di u tracciamentu è di u monitoraghju chì hè digià integratu o facilmente aghjuntu à Istio, è ancu di cumu per intruduce intenzionalmente errori in u sistema.

Source: www.habr.com

Add a comment