
Obs. övers.: av denna cykel var tillÀgnad att bekanta sig med Istios funktioner och visa dem i praktiken. Nu kommer vi att diskutera mer komplexa aspekter av konfiguration och anvÀndning av detta service mesh, specifikt om fininstÀlld ruttning och nÀtverkstrafikhantering.
Vi pÄminner ocksÄ om att artikeln anvÀnder konfigurationer (manifester för Kubernetes och Istio) frÄn repot .
Trafikhantering
Med Istio i klustret finns nya möjligheter som möjliggör:
- Dynamisk ruttning av förfrÄgningar: kanariefÄglar, A/B-testning;
- Lastbalansering: enkel och konsekvent, baserad pÄ hash;
- à terstÀllning efter krascher: tidsgrÀnser, Äterförsök, circuit breakers;
- Introduktion av fel: fördröjningar, avbrutna förfrÄgningar osv.
I resten av artikeln kommer dessa funktioner att visas med ett valt program och samtidigt presentera nya koncept. Det första sĂ„dana konceptet Ă€r DestinationRules (dvs. regler för trafik-/förfrĂ„gningsmottagning â anm. övers.), som vi anvĂ€nder för att aktivera A/B-testning.
A/B-testning: âDestinationRules i praktiken
A/B-testning anvÀnds i fall dÀr det finns tvÄ versioner av en applikation (de skiljer sig vanligtvis visuellt) och vi inte Àr 100% sÀkra pÄ vilken som förbÀttrar anvÀndarinteraktionen. DÀrför kör vi bÄda versionerna samtidigt och samlar in mÀtvÀrden.
För att distribuera den andra versionen av frontend, som behövs för att demonstrera A/B-testning, kör följande kommando:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
department.extensions/sa-frontend-green createdManifestet för deploymenten för den "gröna versionen" skiljer sig pÄ tvÄ stÀllen:
- Images Ă€r baserad pĂ„ en annan tagg â
istio-green, - Pods har en etikett
version: green.
Eftersom bÄda deploymenterna har etiketten app: sa-frontend, kommer förfrÄgningar som dirigeras av den virtuella tjÀnsten sa-external-services till tjÀnsten sa-frontend, att omdirigeras till alla dess instanser och belastningen kommer att fördelas med hjÀlp av , vilket leder till följande situation:

BegÀrda filer hittades inte
Dessa filer hittades inte eftersom de har olika namn i de olika versionerna av applikationen. LÄt oss se till detta:
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.c7071b22.css
/static/js/main.059f8e9c.js
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.f87cd8c9.css
/static/js/main.f7659dbb.js Detta innebÀr att index.html, som begÀr en version av statiska filer, kan skickas av lastbalanseraren till pods som har en annan version, dÀr dessa filer av uppenbara skÀl inte finns. DÀrför behöver vi införa en begrÀnsning för att applikationen ska fungera: "samma version av applikationen som levererade index.html mÄste Àven hantera följande förfrÄgningar».
Vi kommer att uppnĂ„ vĂ„rt mĂ„l med hjĂ€lp av konsekvent lastbalansering baserat pĂ„ hash (Consistent Hash Loadbalancing). I detta fall skickas förfrĂ„gningar frĂ„n en och samma klient till samma backendinstans, vilket anvĂ€nds genom en fördefinierad egenskap â till exempel en HTTP-header. Implementeras med hjĂ€lp av âDestinationRules.
DestinationRules
Efter att VirtualService har dirigerat förfrÄgan till rÀtt tjÀnst, kan vi med hjÀlp av DestinationRules definiera policyer som kommer att tillÀmpas pÄ trafiken som riktas till instanser av denna tjÀnst:

Trafikhantering med Istio-resurser
AnmÀrkning: PÄverkan av Istio-resurser pÄ nÀtverkstrafik presenteras hÀr i ett förenklat format för att underlÀtta förstÄelsen. För att vara exakt görs beslutet om vilken instans en förfrÄgan ska skickas till av Envoy i Ingress Gateway, som Àr konfigurerad i CRD.
Med hjÀlp av Destination Rules kan vi konfigurera lastbalansering sÄ att konsekventa hashvÀrden anvÀnds och svar frÄn samma tjÀnsteinstans garanteras till samma anvÀndare. Följande konfiguration möjliggör detta ():
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-frontend
spec:
host: sa-frontend
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: version # 1 1 â hash kommer att genereras baserat pĂ„ innehĂ„llet i HTTP-headern version.
AnvÀnd konfigurationen med följande kommando:
$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created Och nu kan du köra kommandot nedan och se till att du fÄr de rÀtta filerna nÀr du anger headern version:
$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep mainAnmĂ€rkning: För att lĂ€gga till olika vĂ€rden i headern och testa resultaten direkt i webblĂ€saren kan du anvĂ€nda till Chrome (eller för Firefox â övers. anm..
Generellt har DestinationRules fler alternativ för lastbalansering â för mer information, vĂ€nligen frĂ„ga. .
Innan vi gÄr djupare in pÄ VirtualService, lÄt oss ta bort den "gröna versionen" av applikationen och motsvarande regel för trafikdirigering genom att köra följande kommandon:
$ kubectl delete -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions "sa-frontend-green" borttaget
$ kubectl delete -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io "sa-frontend" borttagetSpeglingspraktik: Virtual Services i praktiken
Skuggning ("skugga") eller Spegling ("speglad") tillÀmpas i situationer dÀr vi vill testa en förÀndring i produktion utan att pÄverka slutanvÀndarna: för detta duplicerar vi ("speglas") förfrÄgningar till en andra instans dÀr de nödvÀndiga Àndringarna har gjorts, och ser pÄ konsekvenserna. Enkelt uttryckt, det Àr nÀr din kollega vÀljer den mest kritiska frÄgan och gör en pull request i form av en sÄ stor klump smuts att ingen faktiskt kan ge den recension.
För att se detta scenario i aktion, skapa en andra instans av SA-Logic med buggar (buggig), genom att köra följande kommando:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy skapad Och nu kör vi kommandot för att sÀkerstÀlla att alla instanser med app=sa-logic ocksÄ har etiketter med motsvarande versioner:
$ kubectl get pods -l app=sa-logic --show-labels
NAMN KLAR ETIKETTER
sa-logic-568498cb4d-2sjwj 2/2 app=sa-logic,version=v1
sa-logic-568498cb4d-p4f8c 2/2 app=sa-logic,version=v1
sa-logic-buggy-76dff55847-2fl66 2/2 app=sa-logic,version=v2
sa-logic-buggy-76dff55847-kx8zz 2/2 app=sa-logic,version=v2 TjÀnsten sa-logic Àr riktad mot pods med etiketten app=sa-logic, sÄ alla begÀrningar kommer att fördelas mellan alla instanser:

⊠men vi vill att begÀrningarna ska riktas mot instanser med version v1 och speglas till instanser med version v2:

Vi kommer att uppnÄ detta genom VirtualService i kombination med DestinationRule, dÀr reglerna kommer att definiera delmÀngder och rutter för VirtualService till den specifika delmÀngden.
Definition av delmÀngder i Destination Rules
DelmÀngder (delmÀngder) definieras av följande konfiguration ():
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-logic
spec:
host: sa-logic # 1
subsets:
- name: v1 # 2
labels:
version: v1 # 3
- name: v2
labels:
version: v2- VĂ€rd (
host) definierar att denna regel endast tillÀmpas nÀr rutten gÄr mot tjÀnstensa-logic; - Namn (
name) av delmÀngder anvÀnds vid dirigering till instanser av delmÀngden; - Etikett (
label) definierar nyckel-vÀrde-par som instanser mÄste uppfylla för att bli en del av en delmÀngd.
AnvÀnd konfigurationen med följande kommando:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic skapadNu nÀr delmÀngderna Àr definierade kan vi gÄ vidare och konfigurera VirtualService för att tillÀmpa regler pÄ förfrÄgningar till sa-logic sÄ att de:
- Riktas till delmÀngden
v1, - Speglas till delmÀngden
v2.
Den följande manifestationen möjliggör det önskade ():
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
mirror:
host: sa-logic
subset: v2Förklaringar behövs inte hÀr, sÄ lÄt oss bara se det i aktion:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic skapadVi lÀgger till belastning genom att köra följande kommando:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done Vi ser pÄ resultaten i Grafana, dÀr vi kan se att versionen med buggar (buggig) orsakar fel för ~60 % av förfrÄgningarna, men inga av dessa fel pÄverkar de slutliga anvÀndarna, eftersom de fÄr svar frÄn den fungerande tjÀnsten.

FramgÄngen i svaren frÄn olika versioner av tjÀnsten sa-logic
HĂ€r sĂ„g vi för första gĂ„ngen hur VirtualService tillĂ€mpas pĂ„ vĂ„ra tjĂ€nsters Envoy: nĂ€r sa-web-app gör en förfrĂ„gning till sa-logic, gĂ„r den genom sidecar Envoy, som â genom VirtualService â Ă€r konfigurerad för att rikta förfrĂ„gningen till delmĂ€ngden v1 och spegla förfrĂ„gningen till delmĂ€ngden v2 av tjĂ€nsten sa-logic.
Jag vet: du har redan tÀnkt att Virtual Services Àr enkla. I nÀsta avsnitt kommer vi att bredda denna Äsikt genom att visa att de ocksÄ Àr verkligt fantastiska.
Kanarieutdelningar
Canary Deployment Àr processen att rulla ut en ny version av applikationen till ett litet antal anvÀndare. Den anvÀnds för att sÀkerstÀlla att det inte finns nÄgra problem i releasen och först efter att man Àr sÀker pÄ tillrÀcklig kvalitet i den (releasen) sprider den till enbÀsta resultatet (subjektiv Äsikt).större publik.
För att demonstrera kanarieutdelningar fortsÀtter vi att arbeta med delmÀngden buggig för sa-logic.
Vi ska inte snÄla och skickar direkt 20 % av anvÀndarna till versionen med buggar (den kommer att representera vÄr kanarieutdelning), medan de ÄterstÄende 80 % gÄr till den normala tjÀnsten. För detta tillÀmpar vi följande VirtualService ():
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
weight: 80 # 1
- destination:
host: sa-logic
subset: v2
weight: 20 # 1 1 â detta Ă€r vikten (vikt), som bestĂ€mmer procentandelen av förfrĂ„gningar som kommer att dirigeras till mottagaren eller delmĂ€ngden av mottagaren.
LÄt oss uppdatera den tidigare konfigurationen av VirtualService med sa-logic följande kommando:
$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic konfigurerad⊠och vi ser omedelbart att en del av förfrÄgningarna misslyckas:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}'
--silent -w "Time: %{time_total}s t Status: %{http_code}n"
-o /dev/null; sleep .1; done
Time: 0.153075s Status: 200
Time: 0.137581s Status: 200
Time: 0.139345s Status: 200
Time: 30.291806s Status: 500VirtualServices aktiverar kanariefördelningar: i det hĂ€r fallet har vi minskat de potentiella konsekvenserna av problem till 20 % av anvĂ€ndarbasen. UtmĂ€rkt! Nu, varje gĂ„ng vi Ă€r osĂ€kra pĂ„ vĂ„r kod (med andra ord â alltid âŠ), kan vi anvĂ€nda spegling och kanariefördelningar.
TidsgrÀnser och försök pÄ nytt
Men buggar finns inte alltid i koden. PÄ listan över "" ligger den felaktiga uppfattningen att "nÀtverket Àr pÄlitligt" högst upp. I sjÀlva verket Àr nÀtverket inte pÄlitligt, och av den anledning behöver vi tidsgrÀnser (timeouts) och försök pÄ nytt (retries).
För att demonstrera kommer vi att anvÀnda samma problemversion, sa-logic (buggig), och vi kommer att simulera opÄlitligheten i nÀtverket med slumpmÀssiga fel.
LÄt vÄr buggy service ha 1/3 chans till en för lÄng svarstid, 1/3 till att avslutas med ett felmeddelande Internal Server Error och 1/3 till att lyckas returnera sidan.
För att mildra konsekvenserna av sÄdana problem och förbÀttra anvÀndarupplevelsen kan vi:
- lÀgga till en tidsgrÀns om tjÀnsten svarar lÀngre Àn 8 sekunder,
- försöka igen om en begÀran misslyckas.
För implementeringen anvÀnder vi följande resursdefinition ():
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: sa-logic
spec:
hosts:
- sa-logic
http:
- route:
- destination:
host: sa-logic
subset: v1
weight: 50
- destination:
host: sa-logic
subset: v2
weight: 50
timeout: 8s # 1
retries:
attempts: 3 # 2
perTryTimeout: 3s # 3- TidsgrÀnsen för begÀran Àr instÀlld pÄ 8 sekunder;
- Försök pÄ nytt görs 3 gÄnger;
- Och varje försök anses misslyckat om svarstiden överstiger 3 sekunder.
SÄ vi har uppnÄtt en optimering, eftersom anvÀndaren inte behöver vÀnta lÀngre Àn 8 sekunder och vi kommer att göra tre nya försök att fÄ ett svar vid problem, vilket ökar chansen för ett lyckat svar.
TillÀmpa den uppdaterade konfigurationen med följande kommando:
$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic konfigureradOch kontrollera i Grafana-diagrammen att antalet lyckade svar har ökat:

FörbÀttringar i statistiken över lyckade svar efter tillÀgg av tidsgrÀnser och upprepade försök
Innan vi gĂ„r vidare till nĂ€sta sektion (eller snarare till nĂ€sta del av artikeln, eftersom det inte kommer att finnas fler praktiska experiment i denna â anm. övers.), ta bort sa-logic-buggy och VirtualService genom att köra följande kommandon:
$ kubectl delete deployment sa-logic-buggy
deployment.extensions "sa-logic-buggy" borttagen
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io "sa-logic" borttagenMönster för Circuit Breaker och Bulkhead
Det handlar om tvÄ viktiga mönster inom mikrotjÀnstarkitektur som möjliggör sjÀlvÄterstÀllning (self-healing) av tjÀnster.
Circuit Breaker ("automatiskt strömbrytare") anvÀnds för att stoppa förfrÄgningar som skickas till en instans av en tjÀnst som anses vara ohÀlsosam, och för att ÄterstÀlla den medan kundens förfrÄgningar omdirigeras till friska instanser av denna tjÀnst (vilket ökar procenten av lyckade svar). (Anm. övers.: En mer detaljerad beskrivning av mönstret kan hittas, till exempel, .)
Bulkhead ("skott") isolera misslyckanden i tjÀnster frÄn att pÄverka hela systemet. Till exempel, tjÀnst B Àr trasig, och en annan tjÀnst (klienten till tjÀnst B) gör en begÀran till tjÀnst B, vilket leder till att den förbrukar sin trÄdpool och inte kan betjÀna andra förfrÄgningar (Àven om de inte rör tjÀnst B). (Anm. övers.: En mer detaljerad beskrivning av mönstret kan hittas, till exempel, .)
Jag kommer att hoppa över detaljerna om implementeringen av dessa mönster, eftersom de Àr lÀtta att hitta i , och det kÀnns ocksÄ vÀldigt bra att visa autentisering och auktorisering, vilket kommer att diskuteras i nÀsta del av artikeln.
P.S. frÄn översÀttaren
LÀs Àven i vÄr blogg:
- «Tillbaka till mikrotjÀnster med Istio»: , ;
- «»;
- «».
KĂ€lla: habr.com
