Istioga tagasi mikroteenuste juurde. 2. osa

Istioga tagasi mikroteenuste juurde. 2. osa

MĂ€rge. tĂ”lge: Esimene osa 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) istio-meisterlikkus.

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 created

Rohelise versiooni juurutamise manifest erineb kahes kohas.

  1. Pilt pÔhineb erineval sildil - istio-green,
  2. 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 Round-robin algoritm, mis toob kaasa jĂ€rgmise olukorra:

Istioga tagasi mikroteenuste juurde. 2. osa
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:

Istioga tagasi mikroteenuste juurde. 2. osa
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 (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 – 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 main

MÀrkus: pÀisesse erinevate vÀÀrtuste lisamiseks ja tulemuste testimiseks otse brauseris saate kasutada see laiendus Chrome'ile (VÔi sellega Firefoxi jaoks - u. tÔlge.).

Üldiselt on DestinationRulesil koormuse tasakaalustamise valdkonnas rohkem vĂ”imalusi – vaadake ĂŒksikasju ametlik dokumentatsioon.

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” deleted

Peegeldamine: 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:

Istioga tagasi mikroteenuste juurde. 2. osa

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

Istioga tagasi mikroteenuste juurde. 2. osa

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 (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ÀÀratleb, et see reegel kehtib ainult juhtudel, kui marsruut lÀheb teenuse poole sa-logic;
  2. Pealkirjad (name) alamhulka kasutatakse marsruutimisel alamhulga eksemplaridesse;
  3. 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 created

NĂŒĂŒd, kui alamhulgad on mÀÀratletud, saame edasi liikuda ja konfigureerida VirtualService'i rakendama reegleid sa-loogika pĂ€ringutele nii, et need:

  1. Suunatud alamhulka v1,
  2. Peegeldatud alamhulgaga v2.

JÀrgmine manifest vÔimaldab teil oma plaane saavutada (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

Siin 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 created

Lisame 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.

Istioga tagasi mikroteenuste juurde. 2. osa
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 (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 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: 500

Virtuaalsed 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 "8 eksiarvamust hajutatud andmetöötluse kohta"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.

  1. lisage ajalÔpp, kui teenusel kulub vastamiseks kauem kui 8 sekundit,
  2. proovige uuesti, kui taotlus ebaÔnnestub.

Rakendamiseks kasutame jÀrgmist ressursimÀÀ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. PÀringu ajalÔpp on seatud 8 sekundile;
  2. Taotlusi proovitakse uuesti 3 korda;
  3. 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 configured

Ja kontrollige Grafana graafikutelt, et edukate vastuste arv on suurenenud:

Istioga tagasi mikroteenuste juurde. 2. osa
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” deleted

KaitselĂŒ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 siin.)

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 siin.)

JĂ€tan nende mustrite rakendamise ĂŒksikasjad vĂ€lja, kuna neid on lihtne leida ametlik dokumentatsioon, ja ma tahan ka vĂ€ga nĂ€idata autentimist ja autoriseerimist, mida arutatakse artikli jĂ€rgmises osas.

PS tÔlkijalt

Loe ka meie blogist:

Allikas: www.habr.com

Lisa kommentaar