Balik sa microservices kauban si Istio. Bahin 2

Balik sa microservices kauban si Istio. Bahin 2

Nota. transl.: Una nga bahin Kini nga serye gipahinungod sa pagpaila sa mga kapabilidad sa Istio ug pagpakita niini sa aksyon. Karon maghisgot kami bahin sa labi ka komplikado nga mga aspeto sa pag-configure ug paggamit sa kini nga mesh sa serbisyo, ug labi na, bahin sa maayong pagka-tune nga ruta ug pagdumala sa trapiko sa network.

Gipahinumdoman ka usab namo nga ang artikulo naggamit sa mga pag-configure (mga pagpakita alang sa Kubernetes ug Istio) gikan sa repositoryo istio-mastery.

pagdumala sa trapiko

Uban sa Istio, ang mga bag-ong kapabilidad makita sa cluster aron mahatagan:

  • Dynamic nga pag-ruta sa hangyo: canary rollouts, A/B testing;
  • Pagbalanse sa load: yano ug makanunayon, base sa mga hash;
  • Pagbawi human sa pagkahulog: mga timeout, pagsulay pag-usab, mga circuit breaker;
  • Pagsal-ot sa mga sayup: mga paglangan, gihulog nga mga hangyo, ug uban pa.

Samtang nagpadayon ang artikulo, kini nga mga kapabilidad i-ilustrar gamit ang gipili nga aplikasyon ingon usa ka pananglitan ug ang mga bag-ong konsepto ipakilala sa dalan. Ang una sa ingon nga konsepto mao ang DestinationRules (i.e. mga lagda bahin sa nakadawat sa trapiko/mga hangyo - gibanabana nga transl.), uban sa tabang nga atong gi-activate ang A/B testing.

A/B testing: DestinationRules sa praktis

Ang pagsulay sa A/B gigamit sa mga kaso diin adunay duha ka bersyon sa usa ka aplikasyon (kasagaran lahi sila sa panan-aw) ug dili kami 100% sigurado kung kinsa ang makapauswag sa kasinatian sa gumagamit. Busa, dungan namo nga gipadagan ang duha ka bersyon ug gikolekta ang mga sukatan.

Aron i-deploy ang ikaduhang bersyon sa frontend, gikinahanglan alang sa pagpakita sa A/B testing, padagana ang mosunod nga sugo:

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

Ang deployment manifest para sa green nga bersyon lahi sa duha ka lugar:

  1. Ang hulagway gibase sa laing tag - istio-green,
  2. Ang mga pod adunay label version: green.

Tungod kay ang duha nga pag-deploy adunay label app: sa-frontend, mga hangyo nga gipaagi sa virtual nga serbisyo sa-external-services para sa serbisyo sa-frontend, i-redirect sa tanan nga mga higayon niini ug ang load iapud-apod pinaagi sa round-robin algorithm, nga mosangpot sa mosunod nga sitwasyon:

Balik sa microservices kauban si Istio. Bahin 2
Ang gipangayo nga mga file wala makit-an

Kini nga mga file wala makit-an tungod kay kini lainlain ang ngalan sa lainlaing mga bersyon sa aplikasyon. Atong siguroon kini:

$ 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

Kini gipasabut nga index.html, nga naghangyo og usa ka bersyon sa static nga mga file, mahimong ipadala sa load balancer ngadto sa mga pod nga adunay lahi nga bersyon, diin, alang sa klaro nga mga rason, ang maong mga file wala maglungtad. Busa, aron ang aplikasyon molihok, kinahanglan namon nga magbutang usa ka pagdili: "ang parehas nga bersyon sa aplikasyon nga nagsilbi sa index.html kinahanglan nga magsilbi sa sunod nga mga hangyo".

Moabut kami didto uban ang makanunayon nga pagbalanse sa pag-load nga nakabase sa hash (Makanunayon nga Hash Loadbalancing). Sa kini nga kaso Ang mga hangyo gikan sa parehas nga kliyente gipadala sa parehas nga backend nga pananglitan, diin gigamit ang usa ka predefined property - pananglitan, usa ka HTTP header. Gipatuman gamit ang DestinationRules.

Destination Rules

human sa VirtualService nagpadala usa ka hangyo sa gusto nga serbisyo, gamit ang DestinationRules mahimo naton mahibal-an ang mga palisiya nga magamit sa trapiko nga gitakda alang sa mga higayon sa kini nga serbisyo:

Balik sa microservices kauban si Istio. Bahin 2
Pagdumala sa trapiko nga adunay mga kapanguhaan sa Istio

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ang epekto sa mga kapanguhaan sa Istio sa trapiko sa network gipresentar dinhi sa paagi nga dali masabtan. Aron tukma, ang desisyon kung asa ipadala ang hangyo gihimo sa Envoy sa Ingress Gateway nga gi-configure sa CRD.

Uban sa Destination Rules, mahimo namong i-configure ang pagbalanse sa load aron magamit ang makanunayon nga mga hash ug masiguro nga ang parehas nga instance sa serbisyo motubag sa parehas nga tiggamit. Ang mosunod nga configuration nagtugot kanimo sa pagkab-ot niini (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 mamugna base sa sulod sa HTTP header version.

Ibutang ang configuration gamit ang mosunod nga sugo:

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

Karon padagana ang sugo sa ubos ug siguruha nga makuha nimo ang husto nga mga file kung imong gitakda ang header version:

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Aron makadugang sa lain-laing mga kantidad sa header ug sulayan ang mga resulta direkta sa browser, mahimo nimong gamiton kini nga extension sa Chrome (o uban niini para sa Firefox - gibanabana. transl.).

Sa kinatibuk-an, ang DestinationRules adunay daghang mga kapabilidad sa lugar sa pagbalanse sa pagkarga - susihon ang mga detalye sa opisyal nga dokumentasyon.

Sa dili pa tun-an pa ang VirtualService, atong tangtangon ang "green nga bersyon" sa aplikasyon ug ang katugbang nga lagda sa direksyon sa trapiko pinaagi sa pagpadagan sa mosunod nga mga sugo:

$ 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: Virtual nga Serbisyo sa Practice

Gipauyog (β€œpanalipdi”) o Pagsalamin (β€œpagsalamin”) gigamit sa mga kaso diin gusto namon nga sulayan ang usa ka pagbag-o sa produksiyon nga dili makaapekto sa mga tiggamit sa katapusan: aron mahimo kini, among gi-duplicate ang mga hangyo ("salamin") sa usa ka ikaduha nga higayon kung diin nahimo ang gitinguha nga mga pagbag-o, ug tan-awon ang mga sangputanan. Sa yanong pagkasulti, mao kini kung gipili sa imong kauban ang labing kritikal nga isyu ug naghimo usa ka hangyo sa pagbitad sa dagway sa usa ka dako nga bukol sa hugaw nga wala’y bisan kinsa nga makasusi niini.

Aron masulayan kini nga senaryo sa aksyon, maghimo kita usa ka ikaduhang higayon sa SA-Logic nga adunay mga bug (buggy) pinaagi sa pagpadagan sa mosunod nga sugo:

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

Ug karon atong padaganon ang sugo aron masiguro nga ang tanan nga mga higayon adunay app=sa-logic Adunay usab sila mga label nga adunay katugbang nga mga bersyon:

$ 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

nga pag-alagad sa-logic gipunting ang mga pod nga adunay label app=sa-logic, mao nga ang tanan nga mga hangyo ipanghatag sa tanan nga mga higayon:

Balik sa microservices kauban si Istio. Bahin 2

... apan gusto namon nga ipadala ang mga hangyo sa v1 nga mga higayon ug i-mirror sa v2 nga mga higayon:

Balik sa microservices kauban si Istio. Bahin 2

Atong makab-ot kini pinaagi sa VirtualService inubanan sa DestinationRule, diin ang mga lagda magtino sa mga subset ug mga ruta sa VirtualService ngadto sa usa ka piho nga subset.

Pagpatin-aw sa mga Subset sa mga Lagda sa Destinasyon

Mga subset (mga subset) gitino pinaagi sa mosunod nga configuration (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) naghubit nga kini nga lagda magamit lamang sa mga kaso kung ang ruta padulong sa serbisyo sa-logic;
  2. Mga titulo (name) ang mga subset gigamit sa pag-routing sa subset nga mga instance;
  3. Label (label) naghubit sa key-value pairs nga ang mga instance kinahanglang motakdo aron mahimong bahin sa subset.

Ibutang ang configuration gamit ang mosunod nga sugo:

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

Karon nga gihubit na ang mga subset, mahimo na naton ipadayon ug i-configure ang VirtualService aron magamit ang mga lagda sa mga hangyo sa sa-logic aron sila:

  1. Gidala sa usa ka subset v1,
  2. Gisalamin sa usa ka subset v2.

Ang mosunod nga manifesto nagtugot kanimo sa pagkab-ot sa imong mga plano (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

Wala’y kinahanglan nga katin-awan dinhi, busa tan-awon naton kini sa aksyon:

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

Atong idugang ang load pinaagi sa pagtawag sa mosunod nga sugo:

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

Atong tan-awon ang mga resulta sa Grafana, diin imong makita nga ang bersyon nga adunay mga bug (buggy) moresulta sa kapakyasan sa ~60% sa mga hangyo, apan walay bisan usa niini nga mga kapakyasan ang makaapekto sa mga end user samtang sila gitubag sa usa ka nagdagan nga serbisyo.

Balik sa microservices kauban si Istio. Bahin 2
Malampuson nga mga tubag sa lain-laing mga bersyon sa sa-logic nga serbisyo

Dinhi una namong nakita kung giunsa ang VirtualService gipadapat sa mga Envoy sa among mga serbisyo: kanus-a sa-web-app naghangyo sa sa-logic, moagi kini sa sidecar Envoy, nga - pinaagi sa VirtualService - gi-configure aron i-ruta ang hangyo sa v1 subset ug salamin ang hangyo sa v2 subset sa serbisyo sa-logic.

Nahibal-an ko, mahimo nimong hunahunaon nga ang mga Serbisyo sa Virtual yano ra. Sa sunod nga seksyon, atong palapdan kana pinaagi sa pag-ingon nga sila usab tinuod nga maayo.

Canary Rollouts

Ang Canary Deployment mao ang proseso sa paglansad og bag-ong bersyon sa usa ka aplikasyon ngadto sa gamay nga gidaghanon sa mga tiggamit. Gigamit kini aron masiguro nga wala’y mga problema sa pagpagawas ug pagkahuman, nga masaligon na sa kalidad niini (pagpagawas), ipanghatag kini sa ubang mga tiggamit.ΠΎmas dako nga audience.

Aron ipakita ang mga canary rollout, magpadayon kami sa pagtrabaho sa usa ka subset buggy Ρƒ sa-logic.

Ayaw usiki ang oras sa mga butang nga wala’y hinungdan ug ipadala dayon ang 20% ​​sa mga tiggamit sa bersyon nga adunay mga bug (kini magrepresentar sa among canary rollout), ug ang nahabilin nga 80% sa normal nga serbisyo. Aron mahimo kini, gamita ang mosunod nga VirtualService (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 ang gibug-aton (weight), nga nagtino sa porsyento sa mga hangyo nga idirekta sa usa ka nakadawat o usa ka subset sa nakadawat.

Atong i-update ang miaging VirtualService configuration para sa sa-logic uban sa mosunod nga sugo:

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

... ug atong makita dayon nga ang pipila ka mga hangyo mosangpot sa mga kapakyasan:

$ 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

Ang VirtualServices makahimo sa canary rollouts: Sa kini nga kaso, among gipakunhod ang potensyal nga epekto sa mga isyu ngadto sa 20% sa user base. Nindot! Karon, sa matag kaso kung dili kami sigurado sa among code (sa laing pagkasulti - kanunay ...), magamit namon ang pag-mirror ug pag-rollout sa canary.

Mga timeout ug pagsulay pag-usab

Apan ang mga bug dili kanunay nga naa sa code. Sa listahan gikan sa "8 Sayop nga pagsabot bahin sa Distributed Computing"Sa una mao ang sayop nga pagtuo nga" kasaligan ang network. Sa pagkatinuod ang network dili kasaligan, ug tungod niini kinahanglan namon ang mga timeout (timeouts) ug pagsulay pag-usab (gisulayan pag-usab).

Alang sa demonstrasyon magpadayon kami sa paggamit sa parehas nga bersyon sa problema sa-logic (buggy), ug atong i-simulate ang dili kasaligan sa network nga adunay random nga mga kapakyasan.

Himoa nga ang among serbisyo nga adunay mga bug adunay 1/3 nga higayon nga magdugay sa pagtubag, usa ka 1/3 nga higayon nga matapos sa usa ka Internal Server Error, ug usa ka 1/3 nga higayon nga malampuson nga ibalik ang panid.

Aron maminusan ang epekto sa ingon nga mga problema ug mahimong mas maayo ang kinabuhi sa mga tiggamit, mahimo namon:

  1. pagdugang og timeout kung ang serbisyo molungtad og mas taas kay sa 8 segundos sa pagtubag,
  2. sulayi pag-usab kung mapakyas ang hangyo.

Para sa pagpatuman, atong gamiton ang mosunod nga resource definition (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. Ang timeout alang sa hangyo gitakda sa 8 segundos;
  2. Ang mga hangyo gisulayan pag-usab 3 ka beses;
  3. Ug ang matag pagsulay giisip nga dili molampos kung ang oras sa pagtubag molapas sa 3 segundos.

Kini usa ka pag-optimize tungod kay ang tiggamit dili kinahanglan nga maghulat labaw pa sa 8 segundos ug maghimo kami tulo ka bag-ong pagsulay aron makakuha usa ka tubag kung adunay mga kapakyasan, nga nagdugang ang higayon sa usa ka malampuson nga tubag.

I-apply ang updated nga configuration gamit ang mosunod nga command:

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

Ug susiha sa mga graph sa Grafana nga ang gidaghanon sa malampuson nga mga tubag misaka sa ibabaw:

Balik sa microservices kauban si Istio. Bahin 2
Mga pag-uswag sa malampuson nga mga estadistika sa pagtubag pagkahuman sa pagdugang sa mga timeout ug pagsulay pag-usab

Sa dili pa mopadayon sa sunod nga seksyon (o hinoon, sa sunod nga bahin sa artikulo, tungod kay niini wala nay praktikal nga mga eksperimento - gibanabana nga transl.), tangtangon sa-logic-buggy ug VirtualService pinaagi sa pagpadagan sa mosunod nga mga sugo:

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

Circuit Breaker ug Bulkhead Patterns

Naghisgot kami bahin sa duha ka hinungdanon nga mga sumbanan sa arkitektura sa microservice nga nagtugot kanimo nga makab-ot ang pagkaayo sa kaugalingon (pag-ayo sa kaugalingon) mga serbisyo.

Paglabay sa Circuit ("circuit breaker") gigamit sa paghunong sa mga hangyo nga moabut sa usa ka pananglitan sa usa ka serbisyo nga giisip nga dili maayo ug ibalik kini samtang ang mga hangyo sa kliyente gi-redirect sa himsog nga mga higayon sa kana nga serbisyo (nga nagdugang sa porsyento sa malampuson nga mga tubag). (Pahinumdom: Ang usa ka mas detalyado nga paghulagway sa sumbanan makita, pananglitan, dinhi.)

Bulkhead ("partisyon") gilain ang mga kapakyasan sa serbisyo nga makaapekto sa tibuuk nga sistema. Pananglitan, ang Serbisyo B naguba ug ang laing serbisyo (kliyente sa Serbisyo B) mihangyo sa Serbisyo B, hinungdan nga nahurot ang thread pool ug dili na makaserbisyo sa ubang mga hangyo (bisan kung dili sila gikan sa Serbisyo B). (Pahinumdom: Ang usa ka mas detalyado nga paghulagway sa sumbanan makita, pananglitan, dinhi.)

Akong laktawan ang mga detalye sa pagpatuman niini nga mga sumbanan tungod kay kini sayon ​​​​nga pangitaon opisyal nga dokumentasyon, ug gusto ko usab nga ipakita ang panghimatuud ug pagtugot, nga hisgutan sa sunod nga bahin sa artikulo.

PS gikan sa tighubad

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment