Tagasi mikroteenustele koos Istio'ga. Osa 2

Tagasi mikroteenustele koos Istio'ga. Osa 2

MĂ€rk. tĂ”lge.: Esimene osa Selle tsĂŒkli raames tutvustame Istio vĂ”imalusi ja demonstreerime neid praktikas. NĂŒĂŒd rÀÀgime keerukamatest konfiguratsiooni ja selle service mesh'i kasutamise aspektidest, eriti detailsest marsruutimisest ja vĂ”rgu liikluse haldamisest.

Tuletame meelde, et artiklis kasutatakse konfigureerimisi (manifeste Kubernetes'i ja Istio jaoks) hoidlast istio-mastery.

Liiklustugevdus

Istio toob klastrisse uusi vÔimalusi, mis vÔimaldavad tagada:

  • DĂŒnaamiline pĂ€ringute marsruutimine: kanari vĂ€ljalaskmine, A/B-testeerimine;
  • Koormuse tasakaalustamine: lihtne ja jĂ€rjepidev, mis pĂ”hineb rĂ€staste peal;
  • Ärikatkestuste taastamine: ajautused, uute katsete tegemine, circuit breakers;
  • Veateade: viivitused, pĂ€ringute katkestamine jne.

Edasiartiklis nĂ€idatakse neid vĂ”imalusi valitud rakenduse nĂ€itel ning tutvustatakse uusi kontseptsioone. Esimene selline kontseptsioon on DestinationRules (s.t. liikluse/tehtud pĂ€ringute reeglid — tĂ”lkija mĂ€rkus), millega aktiveerime A/B-testeerimise.

A/B-testeerimine: DestinationRules praktikas

A/B-testimist kasutatakse olukordades, kus on olemas kaks versiooni rakendusest (need erinevad tavaliselt visuaalselt) ja me ei ole sajaprotsendiliselt kindlad, milline neist parandab kasutajakogemust. SeetÔttu kÀivitame samaaegselt mÔlemad versioonid ja kogume mÔÔdikud.

A/B-testimise demonstreerimiseks vajaliku teise versiooni frontendi juurutamiseks execute siguiente kÀsk:

$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created

Deployment-manifest 'roheline versioon' erineb kahes kohas:

  1. Pilt pĂ”hineb teisel sildil — istio-green,
  2. Pod'idel on silt version: green.

Kuna mÔlemal deployment'il on silt app: sa-frontend, pÀringud, mida suunatakse virtuaalse teenuse sa-external-services teenusele sa-frontend, suunatakse kÔikide oma eksemplaride poole ja koormus jaotatakse round-robin algoritmi, mis toob kaasa jÀrgmise olukorra:

Tagasi mikroteenustele koos Istio'ga. Osa 2
PĂ€ringus olevaid faile ei leitud

Need failid ei olnud leitud, kuna neid nimetatakse erinevates rakenduse versioonides erinevalt. Veendugem 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, ĂŒhe staatiliste failide versiooni taotlevat pĂ€ringut vĂ”ib koormuse tasakaalustaja saata pod’idesse, kus on teine versioon, kus, arusaadavatel pĂ”hjustel, selliseid faile ei eksisteeri. SeetĂ”ttu, et rakendus töötaks, peame seadma piirangu: „sama rakenduse versioon, mis andis index.html, peab teenindama ka jĂ€rgnevates pĂ€ringutes».

Sellele eesmĂ€rgile jĂ”uame kooskĂ”lalise koormuse tasakaalustamisega, kasutades hajurehkendusi (KooskĂ”laline Hash Koormuse Tasakaalustamine). Sel juhul saab ĂŒhe kliendi pĂ€ringud suunata samasse tagapaneeli instantsi, milleks kasutatakse eeldefineeritud omadust — nĂ€iteks HTTP-pealkiri. See teostatakse kasutades  DestinationRules.

DestinationRules

PÀrast seda, kui VirtualService suunab pÀringu Ôige teenuse poole, saame DestinationRules'i abil mÀÀrata poliitikad, mis kehtivad selle teenuse instantsidele suunatud liiklusele:

Tagasi mikroteenustele koos Istio'ga. Osa 2
Liikluse haldamine Istio ressurssidega

MĂ€rkus: Istio ressursside mĂ”ju vĂ”rguliiklusele on siin esitatud lihtsustatud ja arusaadavas vormis. TĂ€psemalt öeldes otsustab, millisele instantsile pĂ€ring saata, Envoy Ingress Gateway’is, mis on CRD-s seadistatud.

Destination Rules abil saame me seadistada load balancing`u nii, et kasutatakse ĂŒhtseid hashe ja garanteeritakse, et sama teenuse eksemplar vastab samale kasutajale. JĂ€rgmine konfiguratsioon vĂ”imaldab selle saavutamist (destinationrule-sa-frontend.yaml):

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-pealkirja sisu pĂ”hjal version.

Rakendage konfiguratsioon jÀrgmise kÀsu abil:

$ 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 sa saate Ă”iged failid, kui tĂ€iendate pealkirja version:

$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep main

MĂ€rkus: Erinevate vÀÀrtuste lisamiseks pealkirja ja testimiseks tulemusi otse brauseris, vĂ”ite kasutada seda laiendust Chrome'i jaoks (vĂ”i selle Firefoxi jaoks — toimetaja mĂ€rkus).

Tegelikult on Destination Rules`il rohkem vĂ”imalusi load balancing`u osas — tĂ€iendavat teavet kĂŒsige. ametlikus dokumentatsioonis.

Enne VirtualService'i edasist uurimist eemaldame rakenduse «roheline versioon» ja vastava liiklussuunamise 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” deleted

Peegeldamine: Virtual Services praktikas

Shadowing («ekraanimine») vĂ”i Mirroring («peegelduse») rakendatakse juhtudel, kui soovime testida muudatust tootmises, mĂ”jutamata lĂ”ppkasutajaid: selleks kopeerime («peegelduse») pĂ€ringud teisele eksemplarile, kus vajalikud muudatused on tehtud, ja vaatame tagajĂ€rgi. TeisisĂ”nu, see on siis, kui teie kolleeg valib kĂ”ige kriitilisema probleemi ja teeb pull request'i sellise tohutu mÀÀrdekamaka nĂ€ol, et keegi ei saa tegelikult sellele ĂŒlevaadet anda.

Selle stsenaariumi kontrollimiseks rakendame 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Ă€ime kĂ€su, et veenduda, et kĂ”ik eksemplarid on app=sa-logic on ka labelid koos 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

Teenuse sa-logic fokuseerib pod'e, millel on label app=sa-logic, seega jaotatakse kÔik pÀringud kÔigi eksemplaride vahel:

Tagasi mikroteenustele koos Istio'ga. Osa 2


 kuid me tahame, et pÀringud suunataks versiooni v1 eksemplaridele ja peegeldataks versiooni v2 eksemplaridele:

Tagasi mikroteenustele koos Istio'ga. Osa 2

Saavutame selle VirtualService'i kaudu koos DestinationRule'iga, kus reeglid mÀÀravad alagrupid ja VirtualService'i marsruudid konkreetsele alagrupile.

Alagruppide mÀÀratlemine Destination Rules'is

Alagrupid (alagrupid) mÀÀratakse jÀrgmise konfiguratsiooni kaudu (sa-logic-subsets-destinationrule.yaml):

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

  1. Host (host) mÀÀrab, et seda reeglit rakendatakse ainult juhul, kui marsruut suundub teenusele sa-logic;
  2. Alagruppide nimed (name) kasutatakse alagruppide eksemplaride marsruutimiseks;
  3. Label (silt) mÀÀrab vÔtme-vÀÀrtuse paarid, millele eksemplarid peavad vastama, et saada osa alamkogust.

Rakendage konfiguratsioon jÀrgmise kÀsu abil:

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic loodud

NĂŒĂŒd, kui alamkogud on mÀÀratletud, saame liikuda edasi ja seadistada VirtualService, et rakendada reegleid sa-logic'i pĂ€ringutele, et need:

  1. Suunatakse alamkogusse v1,
  2. Peegeldatakse alamkogusse v2.

JĂ€rgmine manifest saavutab soovitud tulemuse (sa-logic-subsets-shadowing-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      
    mirror:             
      host: sa-logic     
      subset: v2

Selgitused ei ole siin vajalikud, nii et vaatame lihtsalt toimetulekut:

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic loodud

Lisame koormuse jÀrgmise kÀsuga:

$ while true; do curl -v http://$EXTERNAL_IP/sentiment 
    -H "Content-type: application/json" 
    -d '{"sentence": "I love yogobella"}'; 
    sleep .8; done

Vaatame tulemusi Grafanas, kus on nĂ€ha, et vigadega versioon (buggy) pĂ”hjustab ~60% pĂ€ringute ebaĂ”nnestumist, kuid ĂŒkski neist tĂ”rgetest ei mĂ”juta lĂ”ppkasutajaid, kuna neile vastab töötav teenus.

Tagasi mikroteenustele koos Istio'ga. Osa 2
Erinevate sa-logic teenuse versioonide vastuste edukus.

Siin nĂ€gime esmakordselt, kuidas VirtualService rakendatakse meie teenuste Envoy’ide suhtes: kui sa-web-app saab pĂ€ringu sa-logic, lĂ€bib see sidecar Envoy'i, mis on — VirtualService'i kaudu — seadistatud marsruudiks pĂ€ringule alamgrupi v1 suunas ja pĂ€ringu peegeldamiseks alamgrupi v2 suunas teenusel. sa-logic.

Tean: olete juba mÔelnud, et Virtual Services on lihtsad. JÀrgmises jaotises laiendame seda arvamust, nÀidates, et nad on tÔeliselt suurepÀrased.

Kanari vÀljalasked.

Canary Deployment — uue versiooni vĂ€ljalaskmise protsess rakendusele vĂ€ikesele kasutajate rĂŒhmale. Seda kasutatakse, et veenduda, et vĂ€ljaandes ei ole probleeme, ja alles seejĂ€rel, olles veendunud piisavas kvaliteedis, levitada seda suuremale publikule.olaiemat publikut.

Kanari vÀljalaskude demonstreerimiseks jÀtkame töötamist alamgrupiga. buggy on sa-logic.

Ei ole mĂ”tet pisiasjadesse laskuda ja suuname kohe 20% kasutajatest veaga versioonile (see esindab meie kanarollimist), samas kui ĂŒlejÀÀnud 80% lĂ€hevad normaalsesse teenusesse. Selleks rakendame jĂ€rgmise VirtualService'i (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 on kaal (weight), mis mÀÀrab protsendi pĂ€ringutest, mis suunatakse saajale vĂ”i saaja alagrupile.

Uuendame eelnevat VirtualService'i konfigureerimist 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 konfigureeritud


 ja nÀeme kohe, et osa pÀringutest viib tÔrgeteni:

$ while true; do 
   curl -i http://$EXTERNAL_IP/sentiment 
   -H "Content-type: application/json" 
   -d '{"sentence": "Mulle meeldib 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: 500

VirtualServices aktiveerivad kanarivĂ€ljakud: sel juhul oleme vĂ€hendanud potentsiaalseid tagajĂ€rgi probleemide tĂ”ttu 20% kasutajabaasist. SuurepĂ€rane! NĂŒĂŒd, iga kord, kui me ei ole oma koodis kindlad (teisisĂ”nu — alati
), saame kasutada peegeldamist ja kanarivĂ€ljakuid.

AjaĂŒlekanded ja uuesti proovimine

Kuid alati ei pruugi vead olla koodis. Nimekirjas "8 mĂŒĂŒti jaotatud arvutustes" jĂ€rel on esimene vale arvamus, et "vĂ”rk on usaldusvÀÀrne". Tegelikult on vĂ”rk ei usaldusvÀÀrne ja seetĂ”ttu vajame ajaĂŒlekandeid (timeouts) ja uuesti proovimist (retries)..

Demonstratsiooniks jÀtkame sama probleemiversiooni kasutamist sa-logic (buggy), samas kui vÔrgus usaldamatust simuleerime juhuslike tÔrgetega.

Las meie vead sisaldav teenus on 1/3 tĂ”enĂ€osus liiga pika vastuse saamiseks, 1/3 — Internal Server Erroriga lĂ”petamiseks ja 1/3 — lehe edastamiseks eduka vastusena.

Sarnaste probleemide tagajÀrgede leevendamiseks ja kasutajate elu paremaks muutmiseks saame:

  1. lisada ajaĂŒlekande, kui teenus vastab kauem kui 8 sekundit,
  2. teha uuesti proovimist, kui pÀringul esineb tÔrge.

JÀtkamiseks kasutame sellist ressursi mÀÀratlust (sa-logic-retries-timeouts-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: 50
    - destination: 
        host: sa-logic
        subset: v2
      weight: 50
    timeout: 8s           # 1
    retries:
      attempts: 3         # 2
      perTryTimeout: 3s # 3

  1. KĂŒsimuse ajakava on seadistatud 8 sekundiks;
  2. KĂŒsimuste korduvad katsed tehakse 3 korda;
  3. Ja iga katse loetakse ebaĂ”nnestunuks, kui vastuse aeg ĂŒletab 3 sekundit.

Nii oleme saavutanud optimeerimise, kuna kasutaja ei pea ootama enam kui 8 sekundit ja me teeme kolm uut katset saada vastus tÔrgete korral, suurendades vÔimalust saada eduka vastuse.

Rakendage uuendatud konfiguratsioon jÀrgmise kÀsuga:

$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

Ja kontrollige Grafana diagrammides, et eduka vastuse arv tĂ”usis ĂŒle:

Tagasi mikroteenustele koos Istio'ga. Osa 2
Parandused edukaid vastuseid statistikas pÀrast ajakava ja korduvate katsete lisamist

Enne jĂ€rgmisse jaotusse liikumist (ja tĂ€psemalt — juba jĂ€rgmisse artikli osasse, kuna selles praktikalisi katseid enam ei toimu — toimetaja mĂ€rk.), eemalda sa-logic-buggy ja VirtualService, tĂ€ites jĂ€rgmised kĂ€sud:

$ kubectl delete deployment sa-logic-buggy
deployment.extensions “sa-logic-buggy” eemaldatud
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io “sa-logic” eemaldatud

Circuit Breaker ja Bulkhead mustrid

RÀÀgime kahest olulisest mustrist mikroteenuste arhitektuuris, mis vÔimaldavad saavutada iseravimist (self-healing) teenuste.

Circuit Breaker („automaatne vĂ€lja lĂŒlitaja“) kasutatakse tervisele halva staatusega teenuse eksemplaridele saadetud pĂ€ringute katkestamiseks ning nende taastamiseks samal ajal, kui klientide pĂ€ringud suunatakse selle teenuse tervetesse eksemplaridesse (mis suurendab eduka vastuse protsenti). (Toim. mĂ€rk.: Üksikasjalikuma kirjelduse mustrist leiate nĂ€iteks siit.)

Bulkhead („vahe sein“) isoleerib teenuste tĂ”rkeid kogu sĂŒsteemi rikke eest. NĂ€iteks kui teenus B on rikki lĂ€inud, teeb teenuse B klient arstiteenuse B suhtes pĂ€ringu, mille tulemusena kasutab ta oma sisendite kogumi ja ei suuda teenindada teisi pĂ€ringuid (isegi kui need ei ole seotud teenusega B). (Toim. mĂ€rk.: Üksikasjalikuma kirjelduse mustrist leiate nĂ€iteks siit.)

JĂ€tan vahele ĂŒksikasjad nende mustrite rakendamise kohta, kuna neid on lihtne leida ametlikus dokumentatsioonis, samuti on tĂ”eliselt soovitatav nĂ€idata autentimist ja autoriseerimist, millest tuleb juttu artikli jĂ€rgmises osas.

P.S. tÔlkija mÀrkused

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster