Tagasi mikroteenustele koos Istio'ga. Osa 2

Tagasi mikroteenustele koos Istio'ga. Osa 2

MĂ€rkus tĂ”lke kohta.: Esimene osa 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 istio-mastery.

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:

  1. Pilt pĂ”hineb teisel sildil — istio-green,
  2. 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 , mis viib jÀrgmise olukorrani:PÀringud failid ei leitud

Tagasi mikroteenustele koos Istio'ga. Osa 2
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:

Tagasi mikroteenustele koos Istio'ga. Osa 2
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 (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-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 main

MĂ€rkus: Erinevate vÀÀrtuste lisamiseks pĂ€isesse ja testimiseks tulemusi otse brauseris vĂ”ite kasutada seda laiendust Chrome’ile (vĂ”i seda Firefox’ile — tĂ€iendav mĂ€rk..

Üldiselt on DestinationRules'il rohkem vĂ”imalusi koormuse tasakaalustamise osas — ĂŒksikasju tĂ€psustage. ametlikust dokumentatsioonist.

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

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

Tagasi mikroteenustele koos Istio'ga. Osa 2


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

Tagasi mikroteenustele koos Istio'ga. Osa 2

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 (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 seda reeglit rakendatakse ainult siis, kui marsruut suundub teenusele sa-logic;
  2. Nimed (nimi) alarĂŒhmade kasutatakse marsruutimiseks alarĂŒhma eksemplaride suunas;
  3. 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 loodud

NĂŒĂŒd, kui alamhulgad on mÀÀratletud, saame edasi liikuda ja seadistada VirtualService, et kohaldada reegleid sa-logicile esitatavatele pĂ€ringutele:

  1. suunata alamhulka v1,
  2. peegeldada alamhulka v2.

JÀrgmine manifeest vÔimaldab saavutada soovitud (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 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 loodud

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

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.

Tagasi mikroteenustele koos Istio'ga. Osa 2
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.yamlsa-logic-alamhuh-kihtibkanari-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: 500

VirtualServices 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. „8 eksiarvamust jaotatud arvutustes“ 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:

  1. lisada ajaĂŒlekande, kui teenus reageerib kauem kui 8 sekundit,
  2. ette vÔtta katse, kui pÀring ebaÔnnestub.

Rakendamiseks kasuta 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 aeg on seatud 8 sekundile;
  2. PĂ€ringute katseid 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 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 konfigureeritud

Ja kontrollige Grafana graafikutes, et eduka vastuse arv on tĂ”usnud ĂŒle:

Tagasi mikroteenustele koos Istio'ga. Osa 2
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" kustutatud

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

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

JĂ€tan need mustrite rakendamise ĂŒksikasjad vahele, kuna neid on lihtne leida, ametlikust dokumentatsioonist, samuti tahaks juba nĂ€idata autentimist ja autoriseerimist, millest on juttu jĂ€rgmises artikli osas.

P.S. tÔlkijalt

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster