Yn ôl i microservices gydag Istio. Rhan 2

Yn ôl i microservices gydag Istio. Rhan 2

Nodyn. traws.: Rhan gyntaf Roedd y gyfres hon yn ymroddedig i gyflwyno galluoedd Istio a'u harddangos ar waith. Nawr byddwn yn siarad am agweddau mwy cymhleth ar ffurfweddiad a defnydd y rhwyll gwasanaeth hwn, ac yn benodol, am lwybrau manwl gywir a rheoli traffig rhwydwaith.

Rydym hefyd yn eich atgoffa bod yr erthygl yn defnyddio ffurfweddiadau (maniffestau ar gyfer Kubernetes ac Istio) o'r ystorfa istio-feistrolaeth.

rheoli traffig

Gydag Istio, mae galluoedd newydd yn ymddangos yn y clwstwr i ddarparu:

  • Llwybro ceisiadau deinamig: cyflwyno caneri, profion A/B;
  • Cydbwyso llwyth: syml a chyson, yn seiliedig ar hashes;
  • Adferiad ar ôl cwympo: goramser, ail-geisio, torwyr cylched;
  • Mewnosod diffygion: oedi, ceisiadau a ollyngwyd, ac ati.

Wrth i'r erthygl barhau, bydd y galluoedd hyn yn cael eu darlunio gan ddefnyddio'r cymhwysiad a ddewiswyd fel enghraifft a bydd cysyniadau newydd yn cael eu cyflwyno ar hyd y ffordd. Y cysyniad cyntaf o'r fath fydd DestinationRules (h.y. rheolau ynghylch y sawl sy’n derbyn traffig/ceisiadau - tua. transl.), gyda chymorth yr ydym yn actifadu profion A/B.

Profi A/B: Rheolau Cyrchfan ar waith

Defnyddir profion A/B mewn achosion lle mae dwy fersiwn o raglen (fel arfer maent yn weledol wahanol) ac nid ydym 100% yn siŵr pa un fydd yn gwella profiad y defnyddiwr. Felly, rydym yn rhedeg y ddwy fersiwn ar yr un pryd ac yn casglu metrigau.

I ddefnyddio ail fersiwn y frontend, sy'n ofynnol ar gyfer dangos profion A / B, rhedwch y gorchymyn canlynol:

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

Mae'r maniffest lleoli ar gyfer y fersiwn werdd yn wahanol mewn dau le:

  1. Mae'r ddelwedd yn seiliedig ar dag gwahanol - istio-green,
  2. Mae label ar godennau version: green.

Gan fod gan y ddau ddefnydd label app: sa-frontend, ceisiadau wedi'u cyfeirio gan wasanaeth rhithwir sa-external-services am wasanaeth sa-frontend, yn cael ei ailgyfeirio i'w holl achosion a bydd y llwyth yn cael ei ddosbarthu drwodd algorithm rownd-robin, a fydd yn arwain at y sefyllfa ganlynol:

Yn ôl i microservices gydag Istio. Rhan 2
Ni ddaethpwyd o hyd i'r ffeiliau y gofynnwyd amdanynt

Ni ddaethpwyd o hyd i'r ffeiliau hyn oherwydd eu bod wedi'u henwi'n wahanol mewn gwahanol fersiynau o'r cais. Gadewch i ni wneud yn siŵr o hyn:

$ 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

Mae hyn yn golygu bod index.html, yn gofyn am un fersiwn o ffeiliau statig, gellir ei anfon gan y balancer llwyth i godennau sydd â fersiwn wahanol, lle, am resymau amlwg, nid yw ffeiliau o'r fath yn bodoli. Felly, er mwyn i’r cais weithio, mae angen i ni osod cyfyngiad: “dylai'r un fersiwn o'r cais a gyflwynwyd index.html gyflwyno ceisiadau dilynol'.

Byddwn yn cyrraedd yno gyda chydbwyso llwyth cyson yn seiliedig ar hash (Cydbwyso Llwyth Hash Cyson). Yn yr achos hwn mae ceisiadau gan yr un cleient yn cael eu hanfon i'r un enghraifft wrth gefn, y mae eiddo rhagddiffiniedig yn cael ei ddefnyddio ar ei gyfer - er enghraifft, pennawd HTTP. Wedi'i weithredu gan ddefnyddio Rheolau Cyrchfan.

Rheolau Cyrchfan

Ar ôl Gwasanaeth Rhithwir anfon cais at y gwasanaeth a ddymunir, gan ddefnyddio DestinationRules gallwn ddiffinio polisïau a fydd yn cael eu cymhwyso i draffig a fwriedir ar gyfer achosion o'r gwasanaeth hwn:

Yn ôl i microservices gydag Istio. Rhan 2
Rheoli traffig gydag adnoddau Istio

Nodyn: Cyflwynir yma effaith adnoddau Istio ar draffig rhwydwaith mewn ffordd hawdd ei deall. I fod yn fanwl gywir, y Llysgennad ym Mhorth Ingress sydd wedi'i ffurfweddu yn y CRD sy'n penderfynu i ba achos y dylid anfon y cais.

Gyda Rheolau Cyrchfan, gallwn ffurfweddu cydbwyso llwythi i ddefnyddio hashes cyson a sicrhau bod yr un enghraifft gwasanaeth yn ymateb i'r un defnyddiwr. Mae'r ffurfweddiad canlynol yn caniatáu ichi gyflawni hyn (cyrchfanrule-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 - bydd hash yn cael ei gynhyrchu yn seiliedig ar gynnwys y pennawd HTTP version.

Cymhwyswch y ffurfweddiad gyda'r gorchymyn canlynol:

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

Nawr rhedwch y gorchymyn isod a gwnewch yn siŵr eich bod chi'n cael y ffeiliau cywir pan fyddwch chi'n nodi'r pennawd version:

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

Nodyn: I ychwanegu gwerthoedd gwahanol yn y pennawd a phrofi'r canlyniadau yn uniongyrchol yn y porwr, gallwch chi ddefnyddio yr estyniad hwn i Chrome (Neu gyda hyn ar gyfer Firefox - tua. cyfieithu.).

Yn gyffredinol, mae gan DestinationRules fwy o alluoedd ym maes cydbwyso llwyth - gwiriwch am fanylion yn dogfennaeth swyddogol.

Cyn astudio VirtualService ymhellach, gadewch i ni ddileu “fersiwn werdd” y cais a'r rheol cyfeiriad traffig cyfatebol trwy redeg y gorchmynion canlynol:

$ 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

Adlewyrchu: Gwasanaethau Rhithwir ar Waith

Cysgodi (“gwarchod”) neu Drychio (“drych”) a ddefnyddir mewn achosion lle rydym am brofi newid mewn cynhyrchiad heb effeithio ar ddefnyddwyr terfynol: i wneud hyn, rydym yn dyblygu ceisiadau (“drych”) i ail achos lle mae’r newidiadau dymunol wedi’u gwneud, ac yn edrych ar y canlyniadau. Yn syml, dyma pan fydd eich cydweithiwr yn dewis y mater mwyaf hanfodol ac yn gwneud cais tynnu ar ffurf lwmp mor enfawr o faw fel na all neb ei adolygu mewn gwirionedd.

I brofi'r senario hwn ar waith, gadewch i ni greu ail enghraifft o SA-Logic gyda chwilod (buggy) trwy redeg y gorchymyn canlynol:

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

Ac yn awr gadewch i ni redeg y gorchymyn i wneud yn siŵr bod pob achos gyda app=sa-logic Mae ganddyn nhw hefyd labeli gyda'r fersiynau cyfatebol:

$ 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

Gwasanaeth sa-logic targedu codennau gyda label app=sa-logic, felly bydd pob cais yn cael ei ddosbarthu ymhlith pob achos:

Yn ôl i microservices gydag Istio. Rhan 2

... ond rydym am i geisiadau gael eu hanfon i achosion v1 a'u hadlewyrchu i achosion v2:

Yn ôl i microservices gydag Istio. Rhan 2

Byddwn yn cyflawni hyn trwy VirtualService ar y cyd â DestinationRule, lle bydd y rheolau yn pennu is-setiau a llwybrau'r Gwasanaeth Rhithwir i is-set benodol.

Diffinio Is-setiau mewn Rheolau Cyrchfan

Is-setiau (is-setiau) yn cael eu pennu gan y ffurfweddiad canlynol (sa-rhesymeg-is-setiau-cyrchfan.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. gwesteiwr (host) yn diffinio bod y rheol hon ond yn berthnasol i achosion pan fydd y llwybr yn mynd tuag at y gwasanaeth sa-logic;
  2. Teitlau (name) defnyddir is-setiau wrth lwybro i achosion o is-setiau;
  3. Label (label) yn diffinio'r parau gwerth allweddol y mae'n rhaid i enghreifftiau eu cyfateb i ddod yn rhan o'r is-set.

Cymhwyswch y ffurfweddiad gyda'r gorchymyn canlynol:

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

Nawr bod yr is-setiau wedi'u diffinio, gallwn symud ymlaen a ffurfweddu'r Gwasanaeth Rhithwir i gymhwyso rheolau i geisiadau i sa-logic fel eu bod yn:

  1. Wedi'i lwybro i is-set v1,
  2. Wedi'i adlewyrchu i is-set v2.

Mae’r maniffesto canlynol yn caniatáu ichi gyflawni eich cynlluniau (sa-logic-is-setiau-cysgodi-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

Nid oes angen esboniad yma, felly gadewch i ni ei weld ar waith:

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

Gadewch i ni ychwanegu'r llwyth trwy ffonio'r gorchymyn canlynol:

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

Gadewch i ni edrych ar y canlyniadau yn Grafana, lle gallwch weld bod y fersiwn gyda chwilod (buggy) yn arwain at fethiant ar gyfer ~60% o geisiadau, ond nid yw'r un o'r methiannau hyn yn effeithio ar ddefnyddwyr terfynol gan fod gwasanaeth rhedeg yn ymateb iddynt.

Yn ôl i microservices gydag Istio. Rhan 2
Ymatebion llwyddiannus o wahanol fersiynau o'r gwasanaeth sa-logic

Yma gwelsom gyntaf sut mae Gwasanaeth Rhithwir yn cael ei gymhwyso i Genhadon ein gwasanaethau: pryd sa-web-app yn gwneud cais i sa-logic, mae'n mynd trwy'r Cennad car ochr, sydd - trwy VirtualService - wedi'i ffurfweddu i gyfeirio'r cais i is-set v1 ac adlewyrchu'r cais i is-set v2 y gwasanaeth sa-logic.

Gwn, efallai eich bod eisoes yn meddwl bod Gwasanaethau Rhithwir yn syml. Yn yr adran nesaf, byddwn yn ymhelaethu ar hynny drwy ddweud eu bod nhw hefyd yn wirioneddol wych.

Rholiadau Dedwydd

Canary Deployment yw'r broses o gyflwyno fersiwn newydd o raglen i nifer fach o ddefnyddwyr. Fe'i defnyddir i sicrhau nad oes unrhyw broblemau yn y datganiad a dim ond ar ôl hynny, eisoes yn hyderus yn ei ansawdd (rhyddhau), ei ddosbarthu i ddefnyddwyr eraill.оcynulleidfa fwy.

Er mwyn dangos bod caneri'n cael ei gyflwyno, byddwn yn parhau i weithio gydag is-set buggy у sa-logic.

Gadewch i ni beidio â gwastraffu amser ar drifles ac anfon 20% o ddefnyddwyr i'r fersiwn gyda chwilod ar unwaith (bydd hyn yn cynrychioli ein cyflwyniad caneri), a'r 80% sy'n weddill i'r gwasanaeth arferol. I wneud hyn, defnyddiwch y Gwasanaeth Rhithwir canlynol (sa-logic-is-setiau-caneri-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 yw'r pwysau (weight), sy'n nodi canran y ceisiadau a fydd yn cael eu cyfeirio at dderbynnydd neu is-set o'r derbynnydd.

Gadewch i ni ddiweddaru'r cyfluniad VirtualService blaenorol ar gyfer sa-logic gyda'r gorchymyn canlynol:

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

... a byddwn yn gweld ar unwaith bod rhai ceisiadau yn arwain at fethiannau:

$ 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

Mae Gwasanaethau Rhithwir yn galluogi cyflwyno caneris: Yn yr achos hwn, rydym wedi lleihau effaith bosibl y problemau i 20% o'r sylfaen defnyddwyr. Gwych! Nawr, ym mhob achos pan nad ydym yn siŵr o'n cod (mewn geiriau eraill - bob amser ...), gallwn ddefnyddio adlewyrchu a chyflwyno caneri.

Seibiant ac ailgeisiadau

Ond nid yw bygiau bob amser yn y pen draw yn y cod. Yn y rhestr o "8 Camsyniadau am Gyfrifiadura Dosranedig“Yn y lle cyntaf yw’r gred gyfeiliornus bod “y rhwydwaith yn ddibynadwy.” Mewn gwirionedd y rhwydwaith dim dibynadwy, ac am y rheswm hwn mae angen seibiannau arnom (seibiannau) ac yn ail geisio (ailgeisio).

Ar gyfer arddangosiad byddwn yn parhau i ddefnyddio'r un fersiwn problem sa-logic (buggy), a byddwn yn efelychu annibynadwyedd y rhwydwaith gyda methiannau ar hap.

Gadewch i'n gwasanaeth gyda chwilod gael siawns 1/3 o gymryd gormod o amser i ymateb, siawns 1/3 o ddod i ben gyda Gwall Gweinydd Mewnol, a siawns 1/3 o ddychwelyd y dudalen yn llwyddiannus.

Er mwyn lliniaru effaith problemau o'r fath a gwneud bywyd yn well i ddefnyddwyr, gallwn:

  1. ychwanegu terfyn amser os bydd y gwasanaeth yn cymryd mwy nag 8 eiliad i ymateb,
  2. ceisiwch eto os bydd y cais yn methu.

Er mwyn gweithredu, byddwn yn defnyddio'r diffiniad adnoddau canlynol (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. Mae'r terfyn amser ar gyfer y cais wedi'i osod i 8 eiliad;
  2. Ceisiadau yn cael eu hailadrodd 3 gwaith;
  3. Ac ystyrir bod pob ymgais yn aflwyddiannus os yw'r amser ymateb yn fwy na 3 eiliad.

Mae hwn yn optimeiddio oherwydd ni fydd yn rhaid i'r defnyddiwr aros mwy nag 8 eiliad a byddwn yn gwneud tri ymgais newydd i gael ymateb rhag ofn y bydd methiannau, gan gynyddu'r siawns o ymateb llwyddiannus.

Cymhwyswch y ffurfweddiad wedi'i ddiweddaru gyda'r gorchymyn canlynol:

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

A gwiriwch yn y graffiau Grafana fod nifer yr ymatebion llwyddiannus wedi cynyddu uchod:

Yn ôl i microservices gydag Istio. Rhan 2
Gwelliannau mewn ystadegau ymateb llwyddiannus ar ôl ychwanegu seibiannau ac ailgeisiadau

Cyn symud ymlaen i'r adran nesaf (neu yn hytrach, i ran nesaf yr erthygl, oherwydd yn hyn ni fydd mwy o arbrofion ymarferol - tua. transl.), dileu sa-logic-buggy a VirtualService trwy redeg y gorchmynion canlynol:

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

Torrwr Cylchdaith a Phatrymau Swmp Pen

Rydym yn sôn am ddau batrwm pwysig mewn pensaernïaeth microwasanaeth sy'n eich galluogi i gyflawni hunan-adferiad (hunan-iachau) gwasanaethau.

Torrwr cylched ("torrwr cylched") yn cael ei ddefnyddio i derfynu ceisiadau sy’n dod i enghraifft o wasanaeth sy’n cael ei ystyried yn afiach a’i adfer tra bod ceisiadau cleientiaid yn cael eu hailgyfeirio i achosion iach o’r gwasanaeth hwnnw (sy’n cynyddu canran yr ymatebion llwyddiannus). (Sylwer: Gellir dod o hyd i ddisgrifiad manylach o'r patrwm, er enghraifft, yma.)

Swmp pen ("rhaniad") yn ynysu methiannau gwasanaeth rhag effeithio ar y system gyfan. Er enghraifft, mae Gwasanaeth B wedi torri ac mae gwasanaeth arall (cleient Gwasanaeth B) yn gwneud cais i Wasanaeth B, gan achosi iddo ddisbyddu ei gronfa edau a methu â gwasanaethu ceisiadau eraill (hyd yn oed os nad ydynt o Wasanaeth B). (Sylwer: Gellir dod o hyd i ddisgrifiad manylach o'r patrwm, er enghraifft, yma.)

Byddaf yn hepgor manylion gweithredu’r patrymau hyn oherwydd eu bod yn hawdd dod o hyd iddynt dogfennaeth swyddogol, ac rwyf hefyd wir eisiau dangos dilysu ac awdurdodi, a fydd yn cael ei drafod yn rhan nesaf yr erthygl.

PS gan y cyfieithydd

Darllenwch hefyd ar ein blog:

Ffynhonnell: hab.com

Ychwanegu sylw