Lura għall-mikroservizzi b'Istio. Parti 2

Lura għall-mikroservizzi b'Istio. Parti 2

Nota. transl.: L-ewwel parti Din is-serje kienet iddedikata biex tintroduċi l-kapaċitajiet ta’ Istio u turihom fl-azzjoni. Issa se nitkellmu dwar aspetti aktar kumplessi tal-konfigurazzjoni u l-użu ta 'din il-malja tas-servizz, u b'mod partikolari, dwar ir-rotot irfinat u l-ġestjoni tat-traffiku tan-netwerk.

Infakkruk ukoll li l-artiklu juża konfigurazzjonijiet (manifesti għal Kubernetes u Istio) mir-repożitorju istio-ħakma.

Ġestjoni tat-Traffiku

B'Istio, jidhru kapaċitajiet ġodda fil-cluster biex jipprovdu:

  • Rotot tat-talba dinamiku: rollouts tal-kanarji, ittestjar A/B;
  • Ibbilanċjar tat-tagħbija: sempliċi u konsistenti, ibbażata fuq hashes;
  • Irkupru wara waqgħat: timeouts, tentattivi mill-ġdid, circuit breakers;
  • Iddaħħal difetti: dewmien, talbiet waqgħu, eċċ.

Hekk kif l-artiklu jkompli, dawn il-kapaċitajiet se jiġu illustrati bl-użu tal-applikazzjoni magħżula bħala eżempju u kunċetti ġodda se jiġu introdotti tul it-triq. L-ewwel kunċett bħal dan se jkun DestinationRules (jiġifieri regoli dwar ir-riċevitur tat-traffiku/talbiet - madwar trad.), li bl-għajnuna tagħha nattivaw l-ittestjar A/B.

Testjar A/B: DestinationRules fil-prattika

L-ittestjar A/B jintuża f'każijiet fejn hemm żewġ verżjonijiet ta 'applikazzjoni (ġeneralment huma viżwalment differenti) u m'aħniex 100% ċerti liema waħda se ttejjeb l-esperjenza tal-utent. Għalhekk, inħaddmu ż-żewġ verżjonijiet simultanjament u niġbru metriċi.

Biex tuża t-tieni verżjoni tal-frontend, meħtieġa biex turi l-ittestjar A/B, mexxi l-kmand li ġej:

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

Il-manifest tal-iskjerament għall-verżjoni ħadra jvarja f'żewġ postijiet:

  1. L-immaġni hija bbażata fuq tikketta differenti - istio-green,
  2. Il-miżwed għandhom tikketta version: green.

Peress li ż-żewġ skjeramenti għandhom tikketta app: sa-frontend,talbiet mibgħuta minn servizz virtwali sa-external-services għas-servizz sa-frontend, se tiġi ridiretta lejn l-istanzi kollha tagħha u t-tagħbija titqassam permezz algoritmu round-robin, li se jwassal għas-sitwazzjoni li ġejja:

Lura għall-mikroservizzi b'Istio. Parti 2
Il-fajls mitluba ma nstabux

Dawn il-fajls ma nstabux minħabba li huma msemmija b'mod differenti f'verżjonijiet differenti tal-applikazzjoni. Ejja niżguraw minn dan:

$ 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

Dan ifisser li index.html, li titlob verżjoni waħda ta 'fajls statiċi, tista' tintbagħat mill-load balancer lil imżiewed li għandhom verżjoni differenti, fejn, għal raġunijiet ovvji, tali fajls ma jeżistux. Għalhekk, sabiex l-applikazzjoni taħdem, irridu nistabbilixxu restrizzjoni: "l-istess verżjoni tal-applikazzjoni li nnotifikat index.html għandha sservi talbiet sussegwenti".

Se naslu hemm b'ibbilanċjar konsistenti tat-tagħbija ibbażat fuq il-hash (Ibbilanċjar Konsistenti tat-Tagħbija tal-Hash)... F'dan il-każ talbiet mill-istess klijent jintbagħtu lill-istess istanza backend, li għalih tintuża proprjetà predefinita - pereżempju, header HTTP. Implimentat bl-użu ta 'DestinationRules.

Regoli tad-Destinazzjoni

Wara Servizz Virtwali bagħtet talba lis-servizz mixtieq, billi tuża DestinationRules nistgħu niddefinixxu politiki li se jiġu applikati għat-traffiku ddestinat għal każijiet ta’ dan is-servizz:

Lura għall-mikroservizzi b'Istio. Parti 2
Ġestjoni tat-traffiku bir-riżorsi Istio

Innota: L-impatt tar-riżorsi Istio fuq it-traffiku tan-netwerk huwa ppreżentat hawn b'mod li huwa faċli biex jinftiehem. Biex tkun preċiża, id-deċiżjoni dwar liema istanza tintbagħat it-talba hija meħuda mill-Mibgħut fil-Ingress Gateway konfigurat fis-CRD.

Bir-Regoli tad-Destinazzjoni, nistgħu nikkonfiguraw l-ibbilanċjar tat-tagħbija biex nużaw hashes konsistenti u niżguraw li l-istess istanza tas-servizz tirrispondi għall-istess utent. Il-konfigurazzjoni li ġejja tippermettilek tikseb dan (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 - il-hash se jiġi ġġenerat ibbażat fuq il-kontenut tal-header HTTP version.

Applika l-konfigurazzjoni bil-kmand li ġej:

$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created

Issa mexxi l-kmand hawn taħt u kun żgur li tikseb il-fajls it-tajba meta tispeċifika l-header version:

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

Innota: Biex iżżid valuri differenti fl-intestatura u tittestja r-riżultati direttament fil-browser, tista 'tuża din l-estensjoni għal Chrome (Jew ma’ dan għal Firefox - madwar. trad.).

B'mod ġenerali, DestinationRules għandha aktar kapaċitajiet fil-qasam tal-ibbilanċjar tat-tagħbija - iċċekkja għad-dettalji dokumentazzjoni uffiċjali.

Qabel ma nistudjaw aktar VirtualService, ejja nħassru l-"verżjoni ħadra" tal-applikazzjoni u r-regola tad-direzzjoni tat-traffiku korrispondenti billi tħaddem il-kmandi li ġejjin:

$ 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

Mirroring: Servizzi Virtwali fil-Prattika

Dellijiet (“ilqugħ”) jew Mirroring (“mirroring”) użat f'każijiet fejn irridu nittestjaw bidla fil-produzzjoni mingħajr ma naffettwaw l-utenti finali: biex nagħmlu dan, nidduplikaw it-talbiet ("mera") għat-tieni istanza fejn saru l-bidliet mixtieqa, u nħarsu lejn il-konsegwenzi. Fi kliem sempliċi, dan huwa meta l-kollega tiegħek jagħżel l-aktar kwistjoni kritika u jagħmel talba ta 'ġibda fil-forma ta' daqs kbir ta 'ħmieġ li ħadd ma jista' fil-fatt jirrevediha.

Biex tittestja dan ix-xenarju fl-azzjoni, ejja noħolqu t-tieni istanza ta 'SA-Logic bi bugs (buggy) billi tħaddem il-kmand li ġej:

$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created

U issa ejja tmexxi l-kmand biex niżguraw li l-istanzi kollha ma app=sa-logic Għandhom ukoll tikketti bil-verżjonijiet korrispondenti:

$ 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

Servizz sa-logic jimmira l-imżiewed b'tikketta app=sa-logic, għalhekk it-talbiet kollha jitqassmu fost l-istanzi kollha:

Lura għall-mikroservizzi b'Istio. Parti 2

... imma rridu li t-talbiet jintbagħtu lil istanzi v1 u jiġu riflessi f'istanzi v2:

Lura għall-mikroservizzi b'Istio. Parti 2

Aħna se niksbu dan permezz VirtualService flimkien ma 'DestinationRule, fejn ir-regoli se jiddeterminaw is-sottogruppi u r-rotot tal-VirtualService għal subsett speċifiku.

Definizzjoni ta' Subsets fir-Regoli tad-Destinazzjoni

Sottogruppi (sottogruppi) huma determinati mill-konfigurazzjoni li ġejja (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. Ospitanti (host) jiddefinixxi li din ir-regola tapplika biss għal każijiet meta r-rotta tmur lejn is-servizz sa-logic;
  2. Titoli (name) is-sottosettijiet jintużaw meta jiġu r-rotta għal istanzi ta' subsett;
  3. Tikketta (label) jiddefinixxi l-pari ewlenin-valur li l-istanzi jridu jaqblu biex isiru parti mis-subsett.

Applika l-konfigurazzjoni bil-kmand li ġej:

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

Issa li s-sottogruppi huma definiti, nistgħu nimxu 'l quddiem u kkonfiguraw is-Servizz Virtwali biex japplikaw regoli għal talbiet għal sa-logic sabiex dawn:

  1. Mogħti lejn subsett v1,
  2. Mirrorjati għal subsett v2.

Il-manifest li ġej jippermettilek tikseb il-pjanijiet tiegħek (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

L-ebda spjegazzjoni meħtieġa hawn, allura ejja narawha fl-azzjoni:

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

Ejja nżidu t-tagħbija billi nsejħu l-kmand li ġej:

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

Ejja nħarsu lejn ir-riżultati fi Grafana, fejn tista' tara li l-verżjoni bil-bugs (buggy) jirriżulta f'falliment għal ~60% tat-talbiet, iżda l-ebda wieħed minn dawn il-fallimenti ma jaffettwa lill-utenti finali peress li huma mwieġba minn servizz li qed jaħdem.

Lura għall-mikroservizzi b'Istio. Parti 2
Risposti b'suċċess ta 'verżjonijiet differenti tas-servizz sa-logic

Hawnhekk l-ewwel rajna kif VirtualService jiġi applikat għall-Mibgħuta tas-servizzi tagħna: meta sa-web-app jagħmel talba lil sa-logic, jgħaddi mis-sidecar Envoy, li - permezz VirtualService - huwa kkonfigurat biex iwassal it-talba lejn is-subsett v1 u jirrifletti t-talba għas-subsett v2 tas-servizz sa-logic.

Naf, forsi diġà taħseb li s-Servizzi Virtwali huma sempliċi. Fit-taqsima li jmiss, aħna ser nespandu fuq dan billi ngħidu li huma wkoll tassew kbar.

It-tnedija tal-Kanarji

Canary Deployment huwa l-proċess tat-tnedija ta' verżjoni ġdida ta' applikazzjoni għal numru żgħir ta' utenti. Jintuża biex jiġi żgurat li ma jkun hemm l-ebda problemi fir-rilaxx u biss wara dan, li diġà jkun kunfidenti fil-kwalità (tal-rilaxx) tiegħu, iqassamha lil utenti oħra.оudjenza akbar.

Biex nuru t-tnedija tal-Canary, aħna se nkomplu naħdmu b'subsett buggy у sa-logic.

Ejja ma naħlux ħin fuq trifles u immedjatament tibgħat 20% tal-utenti għall-verżjoni bi bugs (dan se jirrappreżenta t-tnedija tal-kanarji tagħna), u l-80% li jifdal għas-servizz normali. Biex tagħmel dan, uża s-Servizz Virtwali li ġej (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 huwa l-piż (weight), li jispeċifika l-perċentwal ta’ talbiet li se jiġu diretti lejn riċevitur jew subsett tar-riċevitur.

Ejja naġġornaw il-konfigurazzjoni VirtualService preċedenti għal sa-logic bil-kmand li ġej:

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

... u immedjatament naraw li xi talbiet iwasslu għal fallimenti:

$ 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

VirtualServices jippermettu t-tnedija tal-kanarji: F'dan il-każ, naqqset l-impatt potenzjali tal-kwistjonijiet għal 20% tal-bażi tal-utenti. Sabiħ! Issa, f'kull każ meta ma nkunux ċerti mill-kodiċi tagħna (fi kliem ieħor - dejjem...), nistgħu nużaw ir-riflessi u t-tnedija tal-kanarji.

Timeouts u tentattivi mill-ġdid

Iżda bugs mhux dejjem jispiċċaw fil-kodiċi. Fil-lista minn "8 Kunċetti żbaljati dwar Kompjuter imqassam"Fl-ewwel post hemm it-twemmin żbaljat li "in-netwerk huwa affidabbli." Fir-realtà n-netwerk ebda affidabbli, u għal din ir-raġuni għandna bżonn timeouts (timeouts) u jerġa' jipprova (jipprova mill-ġdid).

Għal dimostrazzjoni aħna se nkomplu nużaw l-istess verżjoni problema sa-logic (buggy), u se nissimulaw in-nuqqas ta 'affidabbiltà tan-netwerk b'fallimenti każwali.

Ħalli s-servizz tagħna bil-bugs ikollu 1/3 ċans li jieħu wisq żmien biex jirrispondi, 1/3 ċans li jispiċċa bi Żball Intern tas-Server, u 1/3 ċans li jirritornaw il-paġna b'suċċess.

Biex intaffu l-impatt ta’ problemi bħal dawn u nagħmlu l-ħajja aħjar għall-utenti, nistgħu:

  1. żid timeout jekk is-servizz jieħu aktar minn 8 sekondi biex jirrispondi,
  2. erġa' pprova jekk it-talba tfalli.

Għall-implimentazzjoni, se nużaw id-definizzjoni tar-riżorsi li ġejja (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. Il-timeout għat-talba huwa ssettjat għal 8 sekondi;
  2. It-talbiet jerġgħu jiġu ppruvati 3 darbiet;
  3. U kull tentattiv jitqies li ma jirnexxix jekk il-ħin tar-rispons jaqbeż it-3 sekondi.

Din hija ottimizzazzjoni minħabba li l-utent mhux se jkollu jistenna aktar minn 8 sekondi u se nagħmlu tliet tentattivi ġodda biex niksbu rispons f'każ ta 'fallimenti, u jżidu ċ-ċans ta' rispons ta 'suċċess.

Applika l-konfigurazzjoni aġġornata bil-kmand li ġej:

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

U iċċekkja fil-graffs ta' Grafana li n-numru ta' tweġibiet ta' suċċess żdied hawn fuq:

Lura għall-mikroservizzi b'Istio. Parti 2
Titjib fl-istatistika tar-rispons b'suċċess wara li żżid timeouts u tentattivi mill-ġdid

Qabel ma tgħaddi għat-taqsima li jmiss (jew aħjar, għall-parti li jmiss tal-artiklu, għax f'dan mhux se jkun hemm aktar esperimenti prattiċi - approx. transl.), ħassar sa-logic-buggy u VirtualService billi tħaddem il-kmandi li ġejjin:

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

Disinni ta' Circuit Breaker u Bulkhead

Qed nitkellmu dwar żewġ mudelli importanti fl-arkitettura tal-mikroservizz li jippermettulek tikseb l-awto-irkupru (awto-fejqan) servizzi.

Circuit Interruttur ("circuit breaker") użat biex jintemm talbiet li jaslu f'istanza ta' servizz li huwa meqjus mhux tajjeb għas-saħħa u terġa' tiġi restawrata filwaqt li t-talbiet tal-klijenti jiġu ridiretti lejn każijiet b'saħħithom ta' dak is-servizz (li jżid il-perċentwal ta' tweġibiet b'suċċess). (Nota: Tista' ssib deskrizzjoni aktar dettaljata tal-mudell, pereżempju, hawn.)

Paratija ("partizzjoni") iżola fallimenti fis-servizz milli jaffettwaw is-sistema kollha. Pereżempju, is-Servizz B jinkiser u servizz ieħor (il-klijent tas-Servizz B) jagħmel talba lis-Servizz B, li jġiegħlu jeżawrixxi l-grupp tal-ħajt tiegħu u ma jkunx jista’ jservi talbiet oħra (anki jekk ma jkunux mis-Servizz B). (Nota: Tista' ssib deskrizzjoni aktar dettaljata tal-mudell, pereżempju, hawn.)

Se nħalli barra d-dettalji tal-implimentazzjoni ta 'dawn ix-xejriet minħabba li huma faċli biex jinstabu fihom dokumentazzjoni uffiċjali, u nixtieq ukoll verament nuri l-awtentikazzjoni u l-awtorizzazzjoni, li se jiġu diskussi fil-parti li jmiss tal-artikolu.

PS minn traduttur

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment