
MĂ€rkus tĂ”lke kohta.: selle tsĂŒkli keskmes oli tutvumine Istio vĂ”imalustega ja nende demonstreerimine praktikas. NĂŒĂŒd rÀÀgime keerukamatest seadistamis- ja kasutusaspektidest, eelkĂ”ige detailvaitud marsruutimisest ja vĂ”rgu kaudu suunamise juhtimisest.
Tuletame meelde, et artiklis kasutatakse Kubernetese ja Istio konfigureerimist (manifestid) hoidlast .
Liikluse haldamine
Istio toob klastrisse uusi vÔimalusi, mis vÔimaldavad tagada:
- DĂŒnaamilise pĂ€ringute marsruutimise: kanarise vĂ€ljalaskmine, A/B-testimine;
- Koormuse tasakaalustamine: lihtne ja jÀrjepidev, pÔhinev hashidel;
- TÔrgete taastumine: ajavood, uued katsed, ringlusetÔkked;
- Rikkumiste lisamine: viivitused, pÀringute katkestamine jne.
Artikli jĂ€tkudes nĂ€idatakse neid vĂ”imalusi valitud rakenduse nĂ€itel ja samal ajal tutvustatakse uusi kontseptsioone. Esimene neist kontseptsioonidest on DestinationRules (st liiklabeleid / pĂ€ringutele â tĂ”lkija mĂ€rkus), mille abil aktiveerime A/B-testimise.
A/B-testimine: DestinationRules praktikas
A/B-testimist kasutatakse juhtudel, kui on olemas kaks rakenduse versiooni (tavaliselt erinevad visuaalselt) ja me ei ole 100% kindlad, milline neist parandab kasutajakogemust. SeetÔttu kÀivitame samal ajal mÔlemad versioonid ja kogume mÔÔdikut.
Teise versiooni front-end'i juurutamiseks, mis on vajalik A/B-testimise demonstreerimiseks, tÀitke jÀrgmine kÀsk:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green loodud«Rohelise versiooni» juurutamise manifest erineb kahes kohas:
- Pilt pĂ”hineb teisel sildil â
istio-green, - Pod'il on silt
versioon: green.
Kuna mÔlemal juurutamisel on silt rakendus: sa-frontend, pÀringud, mida marsruutib virtuaalne teenus sa-external-services , suunatakse kÔikidele selle instantsidele ja koormus jaguneb sa-frontendround-robin algoritmi PÀringud failid ei leitud

Need failid ei leitud, kuna need on rakenduse erinevates versioonides erinevate nimedega. Veendume selles:
See tÀhendab, et
$ 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 index.html index.html, mille versiooni staatilisi faile, vĂ”ib koormuse tasakaalustaja saata podâidele, millel on erinev versioon, kus, arusaamatutel pĂ”hjustel, selliseid faile ei ole. SeetĂ”ttu, et rakendus töötaks, peame kehtestama piiri: âsama rakenduse versioon, mis saatis index.html, peab teenindama ka jĂ€rgmisi pĂ€ringuid».
Saavutame eesmĂ€rgi kooskĂ”lalisel koormuse tasakaalustamisel, mis pĂ”hineb hash-idel (KooskĂ”laline Hash Koormuse Tasakaalustamine). Sel juhul saadetakse ĂŒhe kliendi pĂ€ringud samasse tagaplaneedi eksemplari, milleks kasutatakse eeldefineeritud omadust - nĂ€iteks HTTP-pĂ€ist. See on rakendatud âDestinationRules abil.
DestinationRules
PÀrast seda, kui VirtualService suunas pÀringu soovitud teenusele, saame DestinationRules abil mÀÀrata poliitikad, mida rakendatakse sellele teenusele suunatud liiklusele:

Liiklus haldamine Istio ressurssidega
MĂ€rkus: Istio ressursside mĂ”ju vĂ”rgu liiklusele on siin esitatud lihtsustatud mĂ”istetaval viisil. TĂ€pselt öeldes tehakse otsus, millisele eksemplarile pĂ€ring saata, Envoy poolt Ingress Gatewayâs, mis on seadistatud CRD-s.
Destination Rules abil saame seadistada koormuse tasakaalu nii, et kasutataks kooskĂ”lalisi hash-e ja tagataks ĂŒhe ja sama teenuse eksemplari vastused ĂŒhele ja sama kasutajale. JĂ€rgmine konfiguratsioon vĂ”imaldab seda saavutada ():
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-frontend
spec:
host: sa-frontend
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: version # 1 1 â hash genereeritakse HTTP-pĂ€ise sisu pĂ”hjal version.
Rakendage konfiguratsioon jÀrgmise kÀsuga:
$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created Ja nĂŒĂŒd kĂ€ivitage allolev kĂ€sk ja veenduge, et saaksite soovitud failid, kui mÀÀrate pĂ€ise version:
$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep mainMĂ€rkus: Erinevate vÀÀrtuste lisamiseks pĂ€isesse ja testimiseks tulemusi otse brauseris vĂ”ite kasutada Chromeâile (vĂ”i Firefoxâile â tĂ€iendav mĂ€rk..
Ăldiselt on DestinationRules'il rohkem vĂ”imalusi koormuse tasakaalustamise osas â ĂŒksikasju tĂ€psustage. .
Enne kui uurime VirtualService'i sĂŒvitsi, kustutame âroheline versioonâ rakendusest ja vastava reegli liikluse suunamiseks, kĂ€ivitades jĂ€rgmised kĂ€sud:
$ kubectl delete -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions "sa-frontend-green" deleted
$ kubectl delete -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io "sa-frontend" deletedPeegeldamine: Virtual Services praktikas
Varjamine (âekraanimineâ) vĂ”i Peegeldamine (âpeegeldamineâ) rakendatakse siis, kui soovime testida muudatust tootmises, kahjustamata lĂ”ppkasutajaid: selleks kopeerime (âpeegeldameâ) pĂ€ringud teisele eksemplarile, kus on tehtud vajalikud muudatused, ja vaatame tagajĂ€rgi. TeisisĂ”nu, see on siis, kui teie kolleeg valib kĂ”ige kriitilisema probleemi ja teeb pull request'i sellise tohutu segaduse kujul, et keegi ei saa tĂ”eliselt teha sellele ĂŒlevaate.
Selle stsenaariumi aktsiooni kontrollimiseks loome teise SA-Logic eksemplari vigadega (buggy), kÀivitades jÀrgmise kÀsu:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created Ja nĂŒĂŒd kĂ€ivitame kĂ€su, et veenduda, et kĂ”ik eksemplarid, millel on app=sa-logic , omavad ka silte vastavate versioonidega:
$ kubectl get pods -l app=sa-logic --show-labels
NAME READY LABELS
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 Teenuseid sa-logic suunatud pod'idele, millel on silt app=sa-logic, seega jaotatakse kÔik pÀringud kÔigi eksemplaride vahel:

⊠kuid me tahame, et pÀringud suunataks eksemplaridele, millel on versioon v1 ja peegeldataks eksemplaridele, millel on versioon v2:

Selle saavutamiseks kasutame VirtualService'i koos DestinationRule'iga, kus reeglid mÀÀravad VirtualService'i alarĂŒhmad ja marsruudid konkreetse alarĂŒhma jaoks.
AlarĂŒhmade mÀÀratlemine Destination Rules
AlarĂŒhmad (subsets) mÀÀratletakse jĂ€rgmise konfiguratsiooniga ():
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- Host (
host) mÀÀratleb, et seda reeglit rakendatakse ainult siis, kui marsruut suundub teenuselesa-logic; - Nimed (
nimi) alarĂŒhmade kasutatakse marsruutimiseks alarĂŒhma eksemplaride suunas; - Silt (
label) mÀÀratleb vÔtme-vÀÀrtuse paare, millele instantsid peavad vastama, et nende seonduda alamhulgaga.
Rakendage konfiguratsioon jÀrgmise kÀsuga:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic loodudNĂŒĂŒd, kui alamhulgad on mÀÀratletud, saame edasi liikuda ja seadistada VirtualService, et kohaldada reegleid sa-logicile esitatavatele pĂ€ringutele:
- suunata alamhulka
v1, - peegeldada alamhulka
v2.
JÀrgmine manifeest vÔimaldab saavutada soovitud ():
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: v2Siin ei ole selgitusi vajalikud, nii et vaatame lihtsalt toimingut:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic loodudLisame koormuse, kutsudes vÀlja jÀrgmise kÀsu:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done Vaadake tulemusi Grafanas, kus on nĂ€ha, et vigadega versioon (buggy) pĂ”hjustab ~60 % pĂ€ringutest ebaĂ”nnestumisi, kuid ĂŒkski neist ebaĂ”nnestumistest ei mĂ”juta lĂ”ppkasutajaid, kuna neile vastab töötav teenus.

Erinevate sa-logic teenuse versioonide vastustega seotud edukus
Siin nÀgime esmakordselt, kuidas VirtualService rakendatakse meie teenuste Envoy'ide suhtes: kui sa-web-app teeb pÀringu sa-logic, lÀbib see sidecar Envoy, mis - lÀbi VirtualService - on seadistatud suunama pÀringu alamhulka v1 ja peegeldama pÀringut alamhulka v2 teenuses sa-logic.
Tean: te olete juba mÔelnud, et Virtual Services on lihtsad. JÀrgmises osas laiendame seda arvamust, et nad on ka tÔeliselt suured.
KanarisĂŒsteemide juurutamine
Canary Deployment on uue tarkvaraversiooni juurutamise protsess vĂ€ikesele kasutajate arvule. Seda kasutatakse, et veenduda, et versioonis ei esine probleeme, ja ainult seejĂ€rel, olles kindel, et kvaliteet on piisav, levitada suuremale publikule.ilotkaSelleks, et demonstreerida kanarisĂŒsteemide juurutamist, jĂ€tkame alamhulga tööga.
Ărme ole tagasihoidlikud ja suuname kohe 20 % kasutajatest vigadega versioonile (kellel on meie kanarisĂŒsteem) ja ĂŒlejÀÀnud 80 % töökorrale. Selleks rakendame jĂ€rgmise VirtualService ( buggy on sa-logic.
sa-logic-subsets-canary-vs.yaml):
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 â see kaal (kaal), mis mÀÀrab protsendi pĂ€ringutest, mis suunatakse sihtpunkti vĂ”i sihtpunktide alamkogusse.
Uuendame eelmist VirtualService konfiguratsiooni sa-logic jÀrgiva kÀsuga:
$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic konfigureeritud⊠ja kohe nÀeme, et osa pÀringutest lÔpeb tÔrgetega:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "Ma armastan yogobella"}'
--silent -w "Aeg: %{time_total}s t Staatus: %{http_code}n"
-o /dev/null; sleep .1; done
Aeg: 0.153075s Staatus: 200
Aeg: 0.137581s Staatus: 200
Aeg: 0.139345s Staatus: 200
Aeg: 30.291806s Staatus: 500VirtualServices aktiveerivad kanarullid: antud juhul piirasime potentsiaalseid tagajĂ€rgi probleemide korral 20% kasutajabaasist. SuurepĂ€rane! NĂŒĂŒd, kui me pole oma koodis kindlad (teisisĂ”nu â alatiâŠ), saame kasutada peegeldamist ja kanarulle.
Aegade ja katsete kordamine
Kuid mitte alati ei esine vead koodis. ââ nimekirjas on esikohal vale arvamus, et âvĂ”rk on usaldusvÀÀrneâ. Tegelikult on vĂ”rk ei usaldusvÀÀrne ja seetĂ”ttu vajame aegade (timeouts) ja katseid (retries).
KÀsitluse demonstreerimiseks jÀtkame sama probleemiversiooniga sa-logic (buggy), samas kui vÔrgu ebamugavust simuleerime juhuslike tÔrgetega.
Las meie probleemidekandja teenusel on 1/3 tĂ”enĂ€osus liiga pika vastuse saamiseks, 1/3 lĂ”petamisest Internal Server Erroriga ja 1/3 eduka lehe ĂŒlekandmiseks.
Probleemide mÔju leevendamiseks ja kasutajakogemuse parandamiseks saame:
- lisada ajaĂŒlekande, kui teenus reageerib kauem kui 8 sekundit,
- ette vÔtta katse, kui pÀring ebaÔnnestub.
Rakendamiseks kasuta jÀrgmist ressursimÀÀratlust ():
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- PĂ€ringu aeg on seatud 8 sekundile;
- PĂ€ringute katseid tehakse 3 korda;
- Ja iga katse loetakse ebaĂ”nnestunuks, kui vastuse aeg ĂŒletab 3 sekundit.
Nii oleme saavutanud optimeerimise, kuna kasutaja ei pea ootama kauem kui 8 sekundit ja teeme kolm uut katset, et saada vastust tÔrgete korral, suurendades tÔhusat vastamise vÔimalusi.
Rakendage vÀrskendatud konfiguratsioon jÀrgmise kÀsuga:
$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic konfigureeritudJa kontrollige Grafana graafikutes, et eduka vastuse arv on tĂ”usnud ĂŒle:

Parandused eduka vastuse statistikas pĂ€rast ajaĂŒlesannete ja korduste lisamist
Enne jĂ€rgmist jaotist (ning tĂ€psemalt â juba jĂ€rgmises artikli osas, sest selles ei ole enam praktilisi katseid â toimetuse mĂ€rk.), eemaldage sa-logic-buggy ja VirtualService, tĂ€ites jĂ€rgmised kĂ€sud:
$ kubectl delete deployment sa-logic-buggy
deployment.extensions "sa-logic-buggy" kustutatud
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io "sa-logic" kustutatudCircuit Breaker ja Bulkhead mustrid
RÀÀkime kahest olulisest mustrist mikroteenuste arhitektuuris, mis vÔimaldavad saavutada iseseisvat taastumist (self-healing) teenustest.
Circuit Breaker (âautomaatvĂ€ljalĂŒlitiâ) kasutatakse, et peatada pĂ€ringud, mis suunatakse teenuse eksemplarile, mida peetakse ebatervislikuks, ning selle taastumist ajal, kui kliendi pĂ€ringud suunatakse tervele sellele teenusele, mis tĂ”stab eduka vastuse protsenti. (Toimetuse mĂ€rk.: Ăksikasjalikku kirjeldust mustrist saab leida nĂ€iteks .)
Bulkhead (âvaheseinâ) isoleerib teenuste tĂ”rked sĂŒsteemi hĂ€irimisest. NĂ€iteks, kui teenus B on katki, ja teine teenus (teenuse B klient) teeb pĂ€ringu teenusele B, siis see kasutab oma teede pered ja ei saa teenindada teisi pĂ€ringuid (isegi kui need ei puuduta teenust B). (Toimetuse mĂ€rk.: Ăksikasjalikku kirjeldust mustrist saab leida nĂ€iteks .)
JĂ€tan need mustrite rakendamise ĂŒksikasjad vahele, kuna neid on lihtne leida, , samuti tahaks juba nĂ€idata autentimist ja autoriseerimist, millest on juttu jĂ€rgmises artikli osas.
P.S. tÔlkijalt
Lugege ka meie blogist:
- "Tagasi mikroteenustele koos Istio": , ;
- «»;
- «».
Allikas: habr.com
