Laghachi na microservices na Istio. Akụkụ 2

Laghachi na microservices na Istio. Akụkụ 2

Rịba ama. ntụgharị asụsụ.: Akụkụ mbụ Enyere usoro isiokwu a iji webata ikike Istio na igosipụta ha n'ọrụ. Ugbu a, anyị ga-ekwu maka akụkụ ndị ọzọ dị mgbagwoju anya nke nhazi na ojiji nke ntupu ọrụ a, na karịsịa, gbasara nhazi nke ọma na njikwa okporo ụzọ netwọk.

Anyị na-echetakwara gị na akụkọ ahụ na-eji nhazi (ihe ngosi maka Kubernetes na Istio) site na ebe nchekwa. istio-isi.

njikwa okporo ụzọ

Site na Istio, ikike ọhụrụ pụtara na ụyọkọ iji nye:

  • Ntugharị arịrịọ dị ike: canary rollouts, A/B ule;
  • Ndozi ibu: dị mfe ma na-agbanwe agbanwe, dabere na hashes;
  • Iweghachite mgbe ọdịda: nkwụsị oge, nwughari, ihe nkwụsị sekit;
  • Ịtinye mmejọ: igbu oge, ịrịọ arịrịọ, wdg.

Ka akụkọ ahụ na-aga n'ihu, a ga-egosipụta ike ndị a site na iji ngwa ahọpụtara dị ka ihe atụ na echiche ọhụrụ ga-ewebata n'ụzọ. Echiche mbụ dị otú ahụ ga-abụ DestinationRules (ya bụ iwu gbasara onye nnata okporo ụzọ/arịrịọ - ihe ruru transl.), site n'enyemaka nke anyị na-arụ ọrụ A / B ule.

Nnwale A/B: Iwu ebe n'omume

A na-eji ule A/B mee ihe n'ọnọdụ ebe enwere nsụgharị abụọ nke ngwa (na-emekarị ha dị iche iche) na anyị ejighị n'aka 100% nke ga-eme ka ahụmịhe onye ọrụ dịkwuo mma. Ya mere, anyị na-agba ọsọ abụọ nsụgharị n'out oge na-anakọta metrics.

Iji wepụta ụdị nke abụọ nke frontend, achọrọ maka igosipụta nnwale A/B, mee iwu a:

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

Ngosipụta nke mbugharị maka ụdị akwụkwọ ndụ akwụkwọ ndụ dị iche na ebe abụọ:

  1. Ihe onyonyo a dabere na mkpado dị iche - istio-green,
  2. Pods nwere akara version: green.

Ebe ọ bụ na mbugharị abụọ ahụ nwere akara app: sa-frontend,Arịrịọ nke ọrụ mebere sa-external-services maka ọrụ sa-frontend, a ga-ebugharị ya na ọnọdụ ya niile ma kesaa ibu ahụ gburugburu-robin algọridim, nke ga-eduga n'ọnọdụ ndị a:

Laghachi na microservices na Istio. Akụkụ 2
Achọtaghị faịlụ ndị a rịọrọ

Achọtaghị faịlụ ndị a n'ihi na aha ha dị iche iche na ụdị ngwa dị iche iche. Ka anyị hụ nke 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

Ọ pụtara na index.html, na-arịọ otu ụdị faịlụ static, nwere ike izipu ya site na onye na-ebu ibu na pọd ndị nwere ụdị dị iche, ebe, n'ihi ihe doro anya, faịlụ ndị dị otú ahụ adịghị. Ya mere, ka ngwa ahụ rụọ ọrụ, anyị kwesịrị ịtọ ihe mgbochi: "Otu ụdị ngwa nke na-enye index.html kwesịrị ịrịọ arịrịọ na-esote".

Anyị ga-erute ebe ahụ yana ndozi ibu dabere na hash na-agbanwe agbanwe (Hash Load balancement). Na nke a A na-eziga arịrịọ sitere n'aka otu onye ahịa n'otu ihe atụ azụ azụ, nke a na-eji ihe eburu ụzọ mee ihe - dịka ọmụmaatụ, nkụnye eji isi mee HTTP. Ejiri ya site na iji DestinationRules.

Iwu ebe njedebe

Emechaa Ọrụ Virtual zigara arịrịọ na ọrụ achọrọ, na-eji DestinationRules anyị nwere ike ịkọwapụta atumatu a ga-etinye na okporo ụzọ a kara aka maka ihe atụ nke ọrụ a:

Laghachi na microservices na Istio. Akụkụ 2
Njikwa okporo ụzọ na akụrụngwa Istio

Примечание: A na-egosi mmetụta nke akụrụngwa Istio na okporo ụzọ netwọkụ ebe a n'ụzọ dị mfe nghọta. Iji bụrụ nke ziri ezi, mkpebi nke ihe atụ iziga arịrịọ bụ nke onye nnọchi anya n'ọnụ ụzọ Ingress ahazi na CRD mere.

Site na Iwu ebe aga, anyị nwere ike hazie nha nha ka ọ jiri hashes na-agbanwe agbanwe wee hụ na otu ihe atụ ọrụ na-anabata otu onye ọrụ. Nhazi a na-enye gị ohere ime nke a (ebe iwu-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 - A ga-emepụta hash dabere na ọdịnaya nke isi HTTP version.

Jiri iwu a tinye nhazi ahụ:

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

Ugbu a na-agba ọsọ iwu n'okpuru ma hụ na ị nwetara faịlụ ziri ezi mgbe ị na-akọwapụta nkụnye eji isi mee version:

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

Примечание: Iji tinye ụkpụrụ dị iche iche na nkụnye eji isi mee ma nwalee nsonaazụ ozugbo na ihe nchọgharị ahụ, ịnwere ike iji ndọtị a na Chrome (ma ọ bụ na nke a maka Firefox - ihe ruru. ntụgharị asụsụ.).

N'ozuzu, DestinationRules nwere ikike ndị ọzọ na mpaghara nhazi ibu - lelee maka nkọwa n'ime akwụkwọ ikike.

Tupu ịmụọ VirtualService n'ihu, ka anyị hichapụ “ụdị akwụkwọ ndụ akwụkwọ ndụ” nke ngwa yana iwu ntụzịaka okporo ụzọ kwekọrọ site na ịme iwu ndị a:

$ 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

Ngosipụta: Ọrụ Virtual na Omume

Ndo ("ihe nchekwa") ma ọ bụ mirroring ("enyo") eji mee ihe n'ọnọdụ ebe anyị chọrọ ịnwale mgbanwe na mmepụta na-enweghị emetụta ndị ọrụ njedebe: iji mee nke a, anyị na-emeghachi arịrịọ ("enyo") na-arịọ arịrịọ nke abụọ ebe a na-eme mgbanwe ndị a chọrọ, ma lelee nsonaazụ ya. N'ikwu ya n'ụzọ dị mfe, nke a bụ mgbe onye ọrụ ibe gị na-ahọrọ okwu kachasị mkpa wee rịọ arịrịọ n'ụdị nnukwu unyi nke na ọ dịghị onye nwere ike nyochaa ya n'ezie.

Iji nwalee ọnọdụ a n'omume, ka anyị mepụta ihe atụ nke abụọ nke SA-Logic na ahụhụ (buggy) site n'ịgba iwu a:

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

Ma ugbu a, ka anyị na-agba ọsọ iwu iji jide n'aka na niile ikpe na app=sa-logic Ha nwekwara akara ndị nwere ụdị ndị kwekọrọ:

$ 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

ọrụ sa-logic lebe anya pods nwere akara app=sa-logic, yabụ a ga-ekesa arịrịọ niile n'ọnọdụ niile:

Laghachi na microservices na Istio. Akụkụ 2

... mana anyị chọrọ ka eziga arịrịọ na v1 ma gosipụta ya na v2:

Laghachi na microservices na Istio. Akụkụ 2

Anyị ga-enweta nke a site na VirtualService yana njikọ DestinationRule, ebe iwu ga-ekpebi subsets na ụzọ VirtualService gaa na mpaghara akọwapụtara.

Ịkọwapụta ihe ntinye aka na Iwu ebe ebe

Ihe ntinye ( subsets ) a na-ekpebi site na nhazi ndị a (sa-logic- subset-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. Onye ọbịa (host) na-akọwa na iwu a na-emetụta naanị ikpe mgbe ụzọ na-aga n'ihu ọrụ sa-logic;
  2. Aha (name) a na-eji subsets eme ihe mgbe a na-eme njem gaa n'ọnọdụ nke obere;
  3. akara (label) na-akọwapụta igodo-uru ụzọ abụọ nke ihe atụ ga-adakọrịrị iji bụrụ akụkụ nke ntinye.

Jiri iwu a tinye nhazi ahụ:

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

Ugbu a na-akọwapụta subsets, anyị nwere ike ịga n'ihu ma hazie VirtualService iji tinye iwu na arịrịọ maka sa-logic ka ha:

  1. Edere ya na ntinye v1,
  2. Egosipụtara ya na mpaghara mpaghara v2.

Ihe ngosi na-esonụ na-enye gị ohere imezu atụmatụ gị (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

Enweghị nkọwa achọrọ ebe a, yabụ ka anyị hụ ya ka ọ na-arụ ọrụ:

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

Ka anyị tinye ibu ahụ site n'ịkpọ iwu a:

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

Ka anyị leba anya na nsonaazụ ya na Grafana, ebe ị nwere ike ịhụ na ụdị ahụ nwere ahụhụ (buggy) na-ebute ọdịda maka ~ 60% nke arịrịọ, mana ọ nweghị nke ọdịda ndị a na-emetụta ndị ọrụ njedebe ka ọrụ na-agba ọsọ na-aza ha.

Laghachi na microservices na Istio. Akụkụ 2
Nzaghachi nke ọma nke ụdị dị iche iche nke ọrụ sa-logic

N'ebe a, anyị buru ụzọ hụ ka e si etinye VirtualService na ndị ozi nke ọrụ anyị: mgbe sa-web-app na-arịọ arịrịọ ka sa-logic, ọ na-aga site na sidecar Envoy, nke - site na VirtualService - ahaziri iji mee ka arịrịọ ahụ gaa na mpaghara v1 ma gosipụta arịrịọ ahụ na mpaghara v2 nke ọrụ ahụ. sa-logic.

Amaara m, ị nwere ike iche na ọrụ Virtual dị mfe. Na ngalaba na-esote, anyị ga-agbasawanye na nke ahụ site n'ikwu na ha dịkwa oke mma n'ezie.

Canary Rollouts

Canary Deployment bụ usoro nke ibugharị ụdị ngwa ọhụrụ nye ọnụ ọgụgụ dị nta nke ndị ọrụ. A na-eji ya iji jide n'aka na ọ dịghị nsogbu ọ bụla na ntọhapụ na naanị mgbe nke ahụ gasịrị, na-enwebu ntụkwasị obi na àgwà ya (nhapụta), kesaa ya na ndị ọrụ ndị ọzọ.оnnukwu ndị na-ege ntị.

Iji gosi mpịakọta canary, anyị ga-aga n'ihu na-arụ ọrụ na obere ihe buggy у sa-logic.

Ka anyị ghara igbu oge na obere ihe na-eziga 20% nke ndị ọrụ ozugbo na ụdị ahụ nwere ahụhụ (nke a ga-anọchi anya mpịakọta canary anyị), yana 80% fọdụrụ na ọrụ nkịtị. Iji mee nke a, jiri VirtualService na-esonụ (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 bụ arọ (weight), nke na-akọwapụta pasentị arịrịọ nke a ga-eduru onye nnata ma ọ bụ akụkụ nke onye nnata ya.

Ka anyị kwalite nhazi VirtualService gara aga maka sa-logic jiri iwu a:

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

... ma anyị ga-ahụ ozugbo na arịrịọ ụfọdụ na-eduga na ọdịda:

$ 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

Ọrụ Virtual na-enyere aka ịtụgharị canary: N'okwu a, anyị ebelatala mmetụta ndị nwere ike ịdị na 20% nke ntọala onye ọrụ. magburu onwe ya! Ugbu a, n'ọnọdụ ọ bụla mgbe anyị ejighị n'aka koodu anyị (na okwu ndị ọzọ - mgbe niile ...), anyị nwere ike iji mirroring na canary rollouts.

Oge nkwụsị na nnwagharị

Mana chinchi anaghị akwụsị mgbe niile na koodu. N'ime ndepụta si "Echiche 8 na-ezighi ezi gbasara Kọmputa ekesara"Na mbụ bụ nkwenye na-ezighị ezi na" netwọk ahụ bụ nke a pụrụ ịdabere na ya." N'ezie, netwọk bụghị a pụrụ ịdabere na ya, n'ihi nke a, anyị chọrọ oge nkwụsị (Oge agwụla) wee malitegharịa (na-agbagharị).

Maka ngosipụta anyị ga-aga n'ihu na-eji otu ụdị nsogbu ahụ sa-logic (buggy), na anyị ga-eṅomi enweghị ntụkwasị obi nke netwọk na ọdịda ọdịda.

Ka ọrụ anyị nwere chinchi nwee ohere 1/3 nke iwepụta ogologo oge iji zaghachi, ohere 1/3 nke ejedebe na mperi nke ime ime, yana ohere 1/3 nke iweghachi ibe ahụ nke ọma.

Iji belata mmetụta nke nsogbu ndị dị otú ahụ ma mee ka ndụ dịkwuo mma maka ndị ọrụ, anyị nwere ike:

  1. tinye oge nkwụsịtụ ma ọ bụrụ na ọrụ ahụ na-ewe ihe karịrị 8 sekọnd iji zaghachi,
  2. nwaa ọzọ ma ọ bụrụ na arịrịọ ahụ adaghị.

Maka mmejuputa iwu, anyị ga-eji nkọwa akụrụngwa ndị a (sa-logic-na-agba mbọ-oge-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. A na-edozi oge nkwụsị maka arịrịọ ahụ ka 8 sekọnd;
  2. A na-anwalegharị arịrịọ ugboro 3;
  3. A na-ewerekwa mbọ ọ bụla enweghị ihe ịga nke ọma ma ọ bụrụ na oge nzaghachi karịrị 3 sekọnd.

Nke a bụ njikarịcha n'ihi na onye ọrụ agaghị echere ihe karịrị 8 sekọnd ma anyị ga-eme mgbalị ọhụrụ atọ iji nweta nzaghachi n'ọnọdụ ọdịda, na-abawanye ohere nke nzaghachi na-aga nke ọma.

Jiri iwu a tinye nhazi emelitere:

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

Ma lelee na eserese Grafana na ọnụọgụ nzaghachi na-aga nke ọma abawanyela n'elu:

Laghachi na microservices na Istio. Akụkụ 2
Mmelite na ọnụ ọgụgụ nzaghachi na-aga nke ọma ka agbakwunyere oge nkwụsị na nwegharịa

Tupu ịga n'ihu na ngalaba na-esote (ma ọ bụ kama nke ahụ, gaa n'akụkụ nke ọzọ nke isiokwu ahụ, n'ihi na na nke a agaghị enwe nnwale ndị bara uru - approx. transl.), hichapụ sa-logic-buggy na VirtualService site na iji iwu ndị a:

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

Nhazi sekit na nnukwu isi

Anyị na-ekwu maka ụkpụrụ abụọ dị mkpa na ụlọ ọrụ microservice nke na-enye gị ohere nwetaghachi onwe gị (ịgwọ onwe) ọrụ.

Onye na-eme njem na circuit ("Crcuit breaker") A na-eji akwụsị arịrịọ na-abịa na ihe atụ nke ọrụ a na-ewere na adịghị mma ma weghachi ya mgbe a na-ebugharị arịrịọ ndị ahịa gaa na ọnọdụ ahụike nke ọrụ ahụ (nke na-abawanye pasent nke nzaghachi na-aga nke ọma). (Rịba ama: Enwere ike ịchọta nkọwa zuru ezu nke ụkpụrụ ahụ, dịka ọmụmaatụ, ebe a.)

Nnukwu isi ("nkebi") na-ewepụ ọdịda ọrụ site na imetụta sistemu niile. Dịka ọmụmaatụ, ọrụ B agbajiri na ọrụ ọzọ (onye ahịa B) na-arịọ arịrịọ maka ọrụ B, na-eme ka ọ gwụchaa ọdọ mmiri eri ya na enweghị ike ịnye arịrịọ ndị ọzọ (ọbụlagodi ma ọ bụrụ na ha esighị na Ọrụ B). (Rịba ama: Enwere ike ịchọta nkọwa zuru ezu nke ụkpụrụ ahụ, dịka ọmụmaatụ, ebe a.)

M ga-ahapụ nkọwa mmejuputa iwu nke ụkpụrụ ndị a n'ihi na ha dị mfe ịchọta akwụkwọ ikike, na achọkwara m n'ezie igosi nkwenye na ikike, nke a ga-atụle n'akụkụ nke ọzọ nke isiokwu ahụ.

PS sitere na onye ntụgharị

Gụọkwa na blọọgụ anyị:

isi: www.habr.com

Tinye a comment