
MĂ€rge. tĂ”lge: See seeria oli pĂŒhendatud Istio vĂ”imaluste tutvustamisele ja nende tegevuses demonstreerimisele. NĂŒĂŒd rÀÀgime selle teenusevĂ”rgu konfigureerimise ja kasutamise keerukamatest aspektidest ning eriti peenhÀÀlestatud marsruutimisest ja vĂ”rguliikluse juhtimisest.
Samuti tuletame meelde, et artikkel kasutab hoidlast pÀrit konfiguratsioone (Kubernetese ja Istio manifestid) .
liikluskorraldus
Istioga ilmuvad klastris uued vÔimalused, mis pakuvad:
- DĂŒnaamiline pĂ€ringu marsruutimine: canary rollouts, A/B testimine;
- Koormuse tasakaalustamine: lihtne ja jÀrjekindel, rÀsipÔhine;
- Taastumine pĂ€rast kukkumisi: ajalĂ”pud, korduskatsed, kaitselĂŒlitid;
- Vigade sisestamine: viivitused, tĂŒhistatud taotlused jne.
Artikli jĂ€tkudes illustreeritakse neid vĂ”imalusi valitud rakenduse nĂ€itel ja tutvustatakse uusi kontseptsioone. Esimene selline kontseptsioon on DestinationRules (st liikluse/pĂ€ringute saaja reeglid â umbes tĂ”lge), mille abil aktiveerime A/B testimise.
A/B testimine: DestinationRules praktikas
A/B testimist kasutatakse juhtudel, kui rakendusel on kaks versiooni (tavaliselt on need visuaalselt erinevad) ja me ei ole 100% kindlad, milline neist kasutajakogemust parandab. SeetÔttu kÀitame mÔlemat versiooni korraga ja kogume mÔÔdikuid.
A/B-testimise demonstreerimiseks vajaliku kasutajaliidese teise versiooni juurutamiseks kÀivitage jÀrgmine kÀsk:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green createdRohelise versiooni juurutamise manifest erineb kahes kohas.
- Pilt pÔhineb erineval sildil -
istio-green, - Kaunadel on silt
version: green.
Kuna mĂ”lemal juurutamisel on silt app: sa-frontend,pĂ€ringud suunatakse virtuaalteenuse kaudu sa-external-services teenuse eest sa-frontend, suunatakse ĂŒmber kĂ”igile selle eksemplaridele ja koormus jaotatakse lĂ€bi , mis toob kaasa jĂ€rgmise olukorra:

Taotletud faile ei leitud
Neid faile ei leitud, kuna need on rakenduse erinevates versioonides erineva nimega. Veendume selles:
$ 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 See tĂ€hendab, et index.html, mis taotleb ĂŒht staatiliste failide versiooni, saab koormuse tasakaalustaja saata kaustadele, millel on erinev versioon, kus selliseid faile arusaadavatel pĂ”hjustel ei eksisteeri. SeetĂ”ttu peame rakenduse töötamiseks seadma piirangu: "sama rakenduse versioon, mis teenindas index.html-i, peaks esitama ka jĂ€rgnevaid pĂ€ringuid'.
JĂ”uame selleni jĂ€rjekindla rĂ€sipĂ”hise koormuse tasakaalustamisega (JĂ€rjepidev rĂ€sikoormuse tasakaalustamine)... Sel juhul sama kliendi pĂ€ringud saadetakse samale taustaeksemplarile, mille jaoks kasutatakse eelmÀÀratletud atribuuti â nĂ€iteks HTTP-pĂ€ist. Rakendatud kasutades DestinationRules.
Sihtkohareeglid
PÀrast Virtuaalteenus saatis soovitud teenusele pÀringu, saame DestinationRules'i abil mÀÀratleda eeskirjad, mida rakendatakse selle teenuse eksemplaride jaoks mÔeldud liiklusele:

Liikluskorraldus Istio vahenditega
MĂ€rkus: Istio ressursside mĂ”ju vĂ”rguliiklusele on siin toodud lihtsalt arusaadaval viisil. TĂ€psemalt, otsuse, millisele eksemplarile pĂ€ring saata, teeb saadik CRD-s konfigureeritud sissepÀÀsulĂŒĂŒsis.
Sihtreeglite abil saame koormuse tasakaalustamise konfigureerida nii, et see kasutaks ĂŒhtseid rĂ€si ja tagaks, et sama teenuse eksemplar reageerib samale kasutajale. JĂ€rgmine konfiguratsioon vĂ”imaldab teil seda saavutada ():
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: sa-frontend
spec:
host: sa-frontend
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: version # 1 1 â rĂ€si 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 NĂŒĂŒd kĂ€ivitage allolev kĂ€sk ja veenduge, et saate pĂ€ise mÀÀramisel Ă”iged failid version:
$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep mainMÀrkus: pÀisesse erinevate vÀÀrtuste lisamiseks ja tulemuste testimiseks otse brauseris saate kasutada Chrome'ile (VÔi Firefoxi jaoks - u. tÔlge.).
Ăldiselt on DestinationRulesil koormuse tasakaalustamise valdkonnas rohkem vĂ”imalusi â vaadake ĂŒksikasju .
Enne VirtualService'i edasist uurimist kustutame rakenduse "roheline versioon" ja sellele vastava liiklussuuna reegli, 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: virtuaalsed teenused praktikas
varjamine ("varjestus") vĂ”i peegeldamine ("peegeldamine") kasutatakse juhtudel, kui soovime katsetada tootmise muudatust ilma lĂ”ppkasutajaid mĂ”jutamata: selleks dubleerime ("peegeldame") pĂ€ringuid teisele eksemplarile, kus soovitud muudatused on tehtud, ja vaatame tagajĂ€rgi. Lihtsamalt öeldes valib teie kolleeg vĂ€lja kĂ”ige kriitilisema probleemi ja esitab tĂ”mbetaotluse nii suure mustuse kujul, et keegi ei saa seda tegelikult ĂŒle vaadata.
Selle stsenaariumi testimiseks loome SA-Logicu teise eksemplari koos 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 veendumaks, et kĂ”ik eksemplarid koos app=sa-logic Neil on ka vastavate versioonidega sildid:
$ 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 Teenus sa-logic sihib sildiga kaunasid app=sa-logic, seega jaotatakse kÔik pÀringud kÔigi eksemplaride vahel:

... aga me tahame, et taotlused saadetaks v1 eksemplaridele ja peegeldataks v2 eksemplaridele:

Me saavutame selle VirtualService'i kaudu koos DestinationRule'iga, kus reeglid mÀÀravad kindlaks VirtualService'i alamhulgad ja marsruudid konkreetse alamhulgani.
Alamhulkade mÀÀratlemine sihtkoha reeglites
Alamhulgad (alamhulgad) on mÀÀratud 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 see reegel kehtib ainult juhtudel, kui marsruut lÀheb teenuse poolesa-logic; - Pealkirjad (
name) alamhulka kasutatakse marsruutimisel alamhulga eksemplaridesse; - Silt (
label) mÀÀrab vÔtme-vÀÀrtuse paarid, millele eksemplarid peavad vastama, et saada alamhulga osaks.
Rakendage konfiguratsioon jÀrgmise kÀsuga:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic createdNĂŒĂŒd, kui alamhulgad on mÀÀratletud, saame edasi liikuda ja konfigureerida VirtualService'i rakendama reegleid sa-loogika pĂ€ringutele nii, et need:
- Suunatud alamhulka
v1, - Peegeldatud alamhulgaga
v2.
JÀrgmine manifest vÔimaldab teil oma plaane saavutada ():
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 pole selgitust vaja, nii et vaatame seda tegevuses:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic createdLisame 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 Vaatame Grafana tulemusi, kus on nĂ€ha, et vigadega versioon (buggy) pĂ”hjustab ~60% taotluste tĂ”rkeid, kuid ĂŒkski neist tĂ”rgetest ei mĂ”juta lĂ”ppkasutajaid, kuna neile vastab töötav teenus.

Sa-loogika teenuse erinevate versioonide edukad vastused
Siin nĂ€gime esmakordselt, kuidas VirtualService'i rakendatakse meie teenuste saadikutele: millal sa-web-app teeb taotluse sa-logic, lĂ€bib see kĂŒlgkorvi Envoy, mis VirtualService'i kaudu on konfigureeritud suunama taotlust v1 alamhulka ja peegeldama taotlust teenuse v2 alamhulka. sa-logic.
Ma tean, vÔite juba arvata, et virtuaalteenused on lihtsad. JÀrgmises osas rÀÀgime sellest lÀhemalt, öeldes, et need on ka tÔeliselt suurepÀrased.
Canary Rollouts
Canary juurutamine on rakenduse uue versiooni avaldamine vĂ€ikesele arvule kasutajatele. Seda kasutatakse veendumaks, et vĂ€ljalaskes pole probleeme, ja alles pĂ€rast seda, olles juba kindel selle (vĂ€ljaande) kvaliteedis, levitada seda teistele kasutajatele.ĐŸsuurem publik.
Kanaari levitamise demonstreerimiseks jĂ€tkame tööd alamhulgaga buggy Ń sa-logic.
Ărgem raiskagem aega pisiasjadele ja saatkem 20% kasutajatest kohe vigadega versioonile (see esindab meie kanaari levikut) ja ĂŒlejÀÀnud 80% tavateenusesse. Selleks kasutage jĂ€rgmist VirtualService'i ():
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 on kaal (weight), mis mÀÀrab taotluste protsendi, mis suunatakse adressaadile vÔi adressaadi alamhulgale.
VÀrskendame eelmist VirtualService'i konfiguratsiooni sa-logic jÀrgmise kÀsuga:
$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic configured... ja me nÀeme kohe, et mÔned taotlused pÔhjustavad tÔrkeid:
$ 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: 500Virtuaalsed teenused vĂ”imaldavad kanaari levitamist: antud juhul oleme vĂ€hendanud probleemide vĂ”imalikku mĂ”ju 20%-le kasutajabaasist. Imeline! NĂŒĂŒd, igal juhul, kui me pole oma koodis kindlad (teisisĂ”nu - alati...), saame kasutada peegeldamist ja kanaari levitamist.
Aegumised ja korduskatsed
Kuid vead ei satu alati koodi. Loendis alates ""Esiteks on ekslik arvamus, et "vÔrk on usaldusvÀÀrne." Tegelikult vÔrk ei usaldusvÀÀrne ja sel pÔhjusel vajame aegumist (ajalÔpud) ja proovib uuesti (proovib uuesti).
Demonstreerimiseks jÀtkame sama probleemse versiooni kasutamist sa-logic (buggy) ja simuleerime vÔrgu ebausaldusvÀÀrsust juhuslike riketega.
Laske meie vigadega teenusel olla 1/3 tÔenÀosus, et reageerimine vÔtab liiga kaua aega, 1/3 tÔenÀosus, et see lÔpeb sisemise serveri veaga ja 1/3 tÔenÀosus lehe edukaks tagastamiseks.
Selliste probleemide mÔju leevendamiseks ja kasutajate elu paremaks muutmiseks saame teha jÀrgmist.
- lisage ajalÔpp, kui teenusel kulub vastamiseks kauem kui 8 sekundit,
- proovige uuesti, kui taotlus ebaÔnnestub.
Rakendamiseks kasutame 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 ajalÔpp on seatud 8 sekundile;
- Taotlusi proovitakse uuesti 3 korda;
- Ja iga katse loetakse ebaĂ”nnestunuks, kui reageerimisaeg ĂŒletab 3 sekundit.
See on optimeerimine, sest kasutaja ei pea ootama kauem kui 8 sekundit ja me teeme kolm uut katset, et saada tÔrgete korral vastus, suurendades eduka vastuse vÔimalust.
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 configuredJa kontrollige Grafana graafikutelt, et edukate vastuste arv on suurenenud:

Vastuste edukuse statistika tÀiustused pÀrast ajalÔppude ja korduskatsete lisamist
Enne jÀrgmise osa juurde liikumist (vÔi Ôigemini artikli jÀrgmise osa juurde, sest selles pole enam praktilisi katseid - umbes tÔlge), kustutada sa-logic-buggy ja VirtualService, kÀivitades jÀrgmised kÀsud:
$ kubectl delete deployment sa-logic-buggy
deployment.extensions âsa-logic-buggyâ deleted
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io âsa-logicâ deletedKaitselĂŒliti ja vaheseinte mustrid
Me rÀÀgime kahest olulisest mustrist mikroteenuste arhitektuuris, mis vÔimaldavad teil saavutada enesetaaste (eneseparanemine) teenused.
kaitselĂŒliti ("kaitselĂŒliti") kasutatakse ebatervislikuks peetava teenuse eksemplarile saabuvate pĂ€ringute lĂ”petamiseks ja selle taastamiseks, samal ajal kui kliendipĂ€ringud suunatakse ĂŒmber selle teenuse tervetele eksemplaridele (mis suurendab edukate vastuste protsenti). (MĂ€rkus: mustri tĂ€psema kirjelduse leiate nĂ€iteks .)
Vahesein ("partitsioon") isoleerib teenuse tĂ”rked kogu sĂŒsteemi mĂ”jutamisest. NĂ€iteks teenus B on katki ja mĂ”ni teine ââteenus (teenuse B klient) esitab teenusele B pĂ€ringu, mille tĂ”ttu see ammendab oma lĂ”imekogumi ja ei saa teisi taotlusi teenindada (isegi kui need ei ole teenusest B). (MĂ€rkus: mustri tĂ€psema kirjelduse leiate nĂ€iteks .)
JĂ€tan nende mustrite rakendamise ĂŒksikasjad vĂ€lja, kuna neid on lihtne leida , ja ma tahan ka vĂ€ga nĂ€idata autentimist ja autoriseerimist, mida arutatakse artikli jĂ€rgmises osas.
PS tÔlkijalt
Loe ka meie blogist:
- "Tagasi mikroteenuste juurde Istioga": , ;
- «";
- «'.
Allikas: www.habr.com
