Retounen nan microservices ak Istio. Pati 2

Retounen nan microservices ak Istio. Pati 2

Remak. trad.: Pati nan premye Seri sa a te dedye a entwodwi kapasite Istio ak demontre yo nan aksyon. Koulye a, nou pral pale sou aspè ki pi konplèks nan konfigirasyon an ak itilizasyon may sèvis sa a, ak an patikilye, sou routage tise byen branche ak jesyon trafik rezo a.

Nou raple w tou ke atik la sèvi ak konfigirasyon (manifest pou Kubernetes ak Istio) nan repozitwa a. istio-mesi.

jesyon trafik

Avèk Istio, nouvo kapasite parèt nan gwoup la pou bay:

  • Routage demann dinamik: lansman Canary, tès A/B;
  • Balanse chaj: senp ak konsistan, ki baze sou hash;
  • Rekiperasyon apre tonbe: timeouts, retry, disjoncteurs;
  • Mete defo: reta, demann tonbe, elatriye.

Kòm atik la ap kontinye, kapasite sa yo pral ilistre lè l sèvi avèk aplikasyon an chwazi kòm yon egzanp ak nouvo konsèp yo pral prezante sou wout la. Premye konsèp sa yo pral DestinationRules (sa vle di règ sou moun k ap resevwa trafik/demann - apeprè tradiksyon), avèk èd nan ki nou aktive tès A / B.

Tès A/B: Règ Destinasyon an pratik

Tès A/B yo itilize nan ka kote gen de vèsyon nan yon aplikasyon (anjeneral yo vizyèlman diferan) epi nou pa 100% sèten ki youn pral amelyore eksperyans itilizatè a. Se poutèt sa, nou kouri tou de vèsyon an menm tan ak kolekte mezi.

Pou deplwaye dezyèm vèsyon an nan entèfas, ki nesesè pou demontre tès A/B, kouri lòd sa a:

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

Manifest deplwaman pou "vèsyon an vèt" diferan nan de kote:

  1. Imaj la baze sou yon tag diferan - istio-green,
  2. Gous yo gen yon etikèt version: green.

Depi tou de deplwaman yo gen yon etikèt app: sa-frontend,demann yo voye pa sèvis vityèl sa-external-services pou sèvis sa-frontend, yo pral redireksyon sou tout ka li yo epi yo pral distribye chaj la nan round-robin algorithm, ki pral mennen nan sitiyasyon sa a:

Retounen nan microservices ak Istio. Pati 2
Dosye yo mande yo pa jwenn

Fichye sa yo pa te jwenn paske yo rele yo yon fason diferan nan diferan vèsyon aplikasyon an. Ann asire w ke sa a:

$ 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

Sa vle di sa index.html, mande yon vèsyon nan fichye estatik, yo ka voye balans chaj la nan gous ki gen yon vèsyon diferan, kote, pou rezon evidan, dosye sa yo pa egziste. Se poutèt sa, pou aplikasyon an fonksyone, nou bezwen mete yon restriksyon: "menm vèsyon aplikasyon an ki te sèvi index.html ta dwe sèvi demann ki vin apre yo'.

Nou pral rive la ak balanse chaj konsistan ki baze sou hash (Balans chaj konsistan Hash)... Nan ka sa demann ki soti nan menm kliyan an yo voye nan menm egzanp backend la, pou yo itilize yon pwopriyete predefini - pou egzanp, yon header HTTP. Aplike lè l sèvi avèk  DestinationRules.

Règ Destinasyon

Apre VirtualService voye yon demann bay sèvis la vle, lè l sèvi avèk DestinationRules nou ka defini règleman ki pral aplike nan trafik ki destine pou egzanp sèvis sa a:

Retounen nan microservices ak Istio. Pati 2
Jesyon trafik ak resous Istio

Note: Enpak resous Istio yo sou trafik rezo a prezante isit la nan yon fason ki fasil pou konprann. Pou yo ka presi, desizyon an sou ki egzanp yo voye demann lan se pa Envoy la pran nan Ingress Gateway konfigirasyon nan CRD la.

Avèk Règ Destinasyon, nou ka configured balans chaj pou itilize hash ki konsistan epi asire ke menm egzanp sèvis la reponn a menm itilizatè a. Konfigirasyon sa a pèmèt ou reyalize sa a (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 - yo pral pwodwi hash ki baze sou sa ki nan header HTTP a version.

Aplike konfigirasyon an ak lòd sa a:

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

Koulye a, kouri lòd ki anba a epi asire w ke ou jwenn dosye yo dwa lè ou presize header la version:

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

Note: Pou ajoute valè diferan nan header la epi teste rezilta yo dirèkteman nan navigatè a, ou ka itilize ekstansyon sa a nan Chrome (Oswa ak sa pou Firefox - approx. trad.).

An jeneral, DestinationRules gen plis kapasite nan zòn nan balans chaj - tcheke pou plis detay nan dokiman ofisyèl yo.

Anvan ou etidye VirtualService plis, ann retire "vèsyon an vèt" aplikasyon an ak règ korespondan direksyon trafik la nan kouri kòmandman sa yo:

$ 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: Sèvis Virtuel nan Pratik

Lonbraj ("pwoteksyon") oswa Mirroring ("mirroir") itilize nan ka kote nou vle teste yon chanjman nan pwodiksyon san yo pa afekte itilizatè fen yo: pou fè sa, nou kopi ("glas") demann nan yon dezyèm egzanp kote chanjman yo vle yo te fè, epi gade nan konsekans yo. Senpleman mete, sa a se lè kòlèg ou a chwazi pwoblèm ki pi kritik la epi li fè yon demann rale nan fòm lan nan tankou yon gwo moso pousyè tè ke pèsonn pa ka aktyèlman revize li.

Pou teste senaryo sa a an aksyon, ann kreye yon dezyèm egzanp SA-Logic ak pinèz (buggy) pa kouri lòd sa a:

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

Epi, koulye a kite a kouri lòd la asire w ke tout ka ak app=sa-logic Yo gen tou etikèt ak vèsyon ki koresponn yo:

$ 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

Lapòs sa-logic vize gous ak yon etikèt app=sa-logic, kidonk tout demann yo pral distribye nan tout ka:

Retounen nan microservices ak Istio. Pati 2

... men nou vle yo voye demann nan v1 ka epi reflete nan v2 ka:

Retounen nan microservices ak Istio. Pati 2

Nou pral reyalize sa a atravè VirtualService nan konbinezon ak DestinationRule, kote règ yo pral detèmine sous-ansanm ak wout nan VirtualService la nan yon sous-ensemble espesifik.

Defini sou-ansanm nan Règ Destinasyon

Sou-ansanm (sou-ansanm) yo detèmine pa konfigirasyon sa a (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. Lame (host) defini ke règ sa a aplike sèlman nan ka lè wout la ale nan direksyon sèvis la sa-logic;
  2. Tit (name) yo itilize sou-ansanm yo lè w ap fè wout nan enstans sou-ansanm yo;
  3. Etikèt (label) defini pè kle-valè ke ka yo dwe matche pou yo vin fè pati sou-ansanm yo.

Aplike konfigirasyon an ak lòd sa a:

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

Kounye a ke subsets yo defini, nou ka avanse ak konfigirasyon VirtualService la pou aplike règ nan demann sa-lojik pou yo:

  1. Wout nan yon sou-ansanm v1,
  2. Reflete nan yon sou-ansanm v2.

Manifest sa a pèmèt ou reyalize plan ou yo (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

Pa gen okenn eksplikasyon ki nesesè isit la, kidonk ann jis wè li an aksyon:

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

Ann ajoute chaj la lè w rele lòd sa a:

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

Ann gade rezilta yo nan Grafana, kote ou ka wè ke vèsyon an ak pinèz (buggy) rezilta nan echèk pou ~ 60% nan demann, men pa youn nan echèk sa yo afekte itilizatè final yo kòm yo reponn a pa yon sèvis k ap kouri.

Retounen nan microservices ak Istio. Pati 2
Repons siksè nan diferan vèsyon nan sèvis la sa-lojik

Isit la nou te premye wè ki jan VirtualService aplike nan Anvwaye yo nan sèvis nou yo: ki lè sa-web-app fè yon demann pou sa-logic, li ale nan sidecar Envoy la, ki - atravè VirtualService - se configuré pou wout demann lan nan v1 sous-ensemble a epi reflete demann lan nan v2 sous-ensemble nan sèvis la. sa-logic.

Mwen konnen, ou ta ka deja panse ke Virtual Services se senp. Nan pwochen seksyon an, nou pral elaji sou sa lè nou di ke yo ap tou vrèman gwo.

Sou entènèt jwèt Canary Rollouts

Canary Deployment se pwosesis pou woule yon nouvo vèsyon aplikasyon pou yon ti kantite itilizatè. Yo itilize li pou asire w ke pa gen okenn pwoblèm nan lage a epi sèlman apre sa, deja gen konfyans nan bon jan kalite li yo (lage a), distribye li bay lòt itilizatè.оpi gwo odyans lan.

Pou demontre deplwaye Canary, nou pral kontinye travay ak yon sous-ensemble buggy у sa-logic.

Ann pa gaspiye tan nan vetiy epi imedyatman voye 20% itilizatè yo nan vèsyon an ak pinèz (sa a pral reprezante deplwaye Canary nou an), ak rès 80% nan sèvis nòmal la. Pou fè sa, sèvi ak VirtualService sa a (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 se pwa a (weight), ki presize pousantaj demann ki pral dirije bay yon moun k ap resevwa oswa yon pati nan moun k ap resevwa a.

Ann mete ajou konfigirasyon VirtualService anvan an pou sa-logic ak lòd sa a:

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

... epi nou pral imedyatman wè ke kèk demann mennen nan echèk:

$ 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 pèmèt lansman Canary: Nan ka sa a, nou redwi enpak potansyèl pwoblèm yo a 20% nan baz itilizatè a. Bèl bagay! Koulye a, nan chak ka lè nou pa sèten nan kòd nou an (nan lòt mo - toujou ...), nou ka itilize mirwar ak deplwaye Canary.

Timeouts ak retay

Men, pinèz pa toujou fini nan kòd la. Nan lis ki soti nan "8 Move konsepsyon sou enfòmatik distribiye"An premye plas se kwayans inègza ke "rezo a se serye." An reyalite rezo a pa gen okenn serye, e pou rezon sa a nou bezwen timeouts (timeout) ak reesye (reesye).

Pou demonstrasyon nou pral kontinye sèvi ak vèsyon an menm pwoblèm sa-logic (buggy), epi nou pral simulation enfiyabilite rezo a ak echèk o aza.

Kite sèvis nou an ki gen pinèz gen 1/3 chans pou l pran twòp tan pou reponn, 1/3 chans pou l fini ak yon Erè Sèvè Entèn, ak 1/3 chans pou l retounen paj la avèk siksè.

Pou diminye enpak pwoblèm sa yo epi fè lavi pi bon pou itilizatè yo, nou kapab:

  1. ajoute yon delè si sèvis la pran plis pase 8 segonn pou reponn,
  2. reesye si demann lan echwe.

Pou aplikasyon an, nou pral itilize definisyon resous sa a (sa-logic-retry-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. Delè pou demann lan mete sou 8 segonn;
  2. Demann yo reesye 3 fwa;
  3. Epi chak tantativ konsidere kòm san siksè si tan repons lan depase 3 segonn.

Sa a se yon optimize paske itilizatè a pa pral oblije rete tann plis pase 8 segonn epi nou pral fè twa nouvo tantativ jwenn yon repons nan ka ta gen echèk, ogmante chans pou yon repons siksè.

Aplike konfigirasyon ki ajou ak lòd sa a:

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

Epi tcheke nan graf Grafana yo ke kantite repons ki gen siksè te ogmante pi wo a:

Retounen nan microservices ak Istio. Pati 2
Amelyorasyon nan estatistik repons siksè apre yo fin ajoute timeouts ak retay

Anvan w ale nan pwochen seksyon an (oswa pito, nan pwochen pati nan atik la, paske nan sa a pa pral gen plis eksperyans pratik - approx. trad.), efase sa-logic-buggy ak VirtualService pa kouri kòmandman sa yo:

$ 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 ak Bulkhead Modèl

Nou ap pale de de modèl enpòtan nan achitekti mikwosèvis ki pèmèt ou reyalize oto-rekiperasyon (gerizon pwòp tèt ou) sèvis yo.

Awondisman disjonkteur ("disjoncteur sikwi") yo itilize pou mete fen nan demann ki vini nan yon egzanp yon sèvis ki konsidere kòm malsen epi retabli li pandan y ap redireksyon demann kliyan an nan ka an sante nan sèvis sa a (ki ogmante pousantaj repons ki gen siksè). (Remak: Ou ka jwenn yon deskripsyon pi detaye sou modèl la, pou egzanp, isit la.)

Boulèt ("patisyon") izole echèk sèvis ki afekte tout sistèm nan. Pa egzanp, Sèvis B kase epi yon lòt sèvis (kliyan Sèvis B) fè yon demann nan Sèvis B, sa ki lakòz li fin itilize pisin fil li yo epi li pa kapab fè sèvis lòt demann (menm si yo pa soti nan Sèvis B). (Remak: Ou ka jwenn yon deskripsyon pi detaye sou modèl la, pou egzanp, isit la.)

Mwen pral omisyon detay aplikasyon modèl sa yo paske yo fasil pou jwenn yo dokiman ofisyèl yo, epi mwen vle tou reyèlman montre otantifikasyon ak otorizasyon, ki pral diskite nan pwochen pati nan atik la.

PS soti nan tradiktè

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè