Бозгашт ба microservices бо Istio. Қисми 2

Бозгашт ба microservices бо Istio. Қисми 2

Шарҳ. тарҷума.: Қисми якум Ин силсила ба ҷорӣ кардани қобилиятҳои Истио ва нишон додани онҳо дар амал бахшида шуда буд. Ҳоло мо дар бораи ҷанбаҳои мураккабтари конфигуратсия ва истифодаи ин шабакаи хидматрасонӣ ва аз ҷумла, дар бораи масири дақиқ танзимшуда ва идоракунии трафики шабака сӯҳбат хоҳем кард.

Мо инчунин ба шумо хотиррасон мекунем, ки мақола конфигуратсияҳоро (манифестҳо барои Kubernetes ва Istio) аз анбор истифода мебарад истио-матй.

Идоракунии трафик

Бо Istio, дар кластер қобилиятҳои нав пайдо мешаванд, то:

  • Масири дархости динамикӣ: rollouts canary, санҷиши A/B;
  • Мувозинати сарборӣ: оддӣ ва пайваста, дар асоси hashes;
  • Барқароршавӣ пас аз афтидан: танаффусҳо, кӯшишҳои такрорӣ, сӯзандоруҳо;
  • Ворид кардани хатогиҳо: таъхирҳо, рад кардани дархостҳо ва ғайра.

Дар идомаи мақола, ин қобилиятҳо бо истифода аз барномаи интихобшуда ҳамчун намуна тасвир карда мешаванд ва дар ин роҳ мафҳумҳои нав ҷорӣ карда мешаванд. Аввалин чунин консепсия хоҳад буд DestinationRules (яъне қоидаҳо дар бораи қабулкунандаи трафик/дархостҳо - тақрибан тарҷума.), бо ёрии он мо санҷиши A/B-ро фаъол мекунем.

Санҷиши A/B: Қоидаҳои таъинот дар амал

Санҷиши A/B дар ҳолатҳое истифода мешавад, ки ду версияи барнома вуҷуд дорад (одатан онҳо аз ҷиҳати визуалӣ фарқ мекунанд) ва мо 100% мутмаин нестем, ки кадоме аз онҳо таҷрибаи корбарро беҳтар мекунад. Аз ин рӯ, мо ҳарду версияро ҳамзамон иҷро мекунем ва ченакҳоро ҷамъ мекунем.

Барои ҷойгиркунии версияи дуюми фронтент, ки барои намоиши санҷиши A/B лозим аст, фармони зеринро иҷро кунед:

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

Манифести густариши версияи сабз дар ду ҷой фарқ мекунад:

  1. Тасвир ба теги дигар асос ёфтааст - istio-green,
  2. Подшоҳҳо тамға доранд version: green.

Азбаски ҳарду ҷойгиркунӣ тамға доранд app: sa-frontend,дархостҳое, ки тавассути хидмати виртуалӣ равона карда мешаванд sa-external-services барои хизмат sa-frontend, ба ҳамаи мисолҳои он равона карда мешавад ва сарборӣ тавассути он тақсим карда мешавад алгоритми мудаввар, ки ба вазъияти зерин оварда мерасонад:

Бозгашт ба microservices бо Istio. Қисми 2
Файлҳои дархостшуда ёфт нашуд

Ин файлҳо ёфт нашуд, зеро онҳо дар версияҳои гуногуни барнома ба таври гуногун номгузорӣ шудаанд. Биёед ба ин боварӣ ҳосил кунем:

$ 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

Ин маънои онро дорад, ки index.html, дархости як версияи файлҳои статикӣ, метавонад аз ҷониби мувозинат сарборӣ ба подкастҳое, ки версияи дигар доранд, фиристода шавад, ки дар он ҷо бо сабабҳои маълум чунин файлҳо вуҷуд надоранд. Аз ин рӯ, барои кор кардани барнома, мо бояд маҳдудият муқаррар кунем: "ҳамон версияи барномае, ки ба index.html хидмат мекард, бояд ба дархостҳои минбаъда хидмат расонад".

Мо ба он ҷо бо мувозинати доимии бар асоси хэш мерасем (Тавозуни доимии Hash). Дар ин ҳолат дархостҳо аз як муштарӣ ба як нусхаи пуштибонӣ фиристода мешаванд, ки барои он амволи пешакӣ муайяншуда истифода мешавад - масалан, сарлавҳаи HTTP. Бо истифода аз DestinationRules амалӣ карда мешавад.

Қоидаҳои таъинот

Пас аз он ки VirtualService ба хидмати дилхоҳ дархост фиристод, бо истифода аз Қоидаҳои Destination, мо метавонем сиёсатҳоеро муайян кунем, ки ба трафики барои мисолҳои ин хидмат таъиншуда татбиқ карда мешаванд:

Бозгашт ба microservices бо Istio. Қисми 2
Идоракунии трафик бо захираҳои Istio

эрод гирифтан: Таъсири захираҳои Истио ба трафики шабакавӣ дар ин ҷо тавре оварда шудааст, ки барои фаҳмидан осон аст. Аниқтараш, қарор дар бораи ба кадом инстансия фиристодани дархост аз ҷониби фиристода дар Gateway Ingress, ки дар CRD танзим шудааст, қабул карда мешавад.

Бо Қоидаҳои таъинот, мо метавонем мувозинати сарборро барои истифодаи хэшҳои пайваста танзим кунем ва боварӣ ҳосил кунем, ки ҳамон як хидматрасонӣ ба ҳамон корбар посух медиҳад. Конфигуратсияи зерин ба шумо имкон медиҳад, ки ба ин ноил шавед (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 дар асоси мундариҷаи сарлавҳаи HTTP тавлид мешавад version.

Конфигуратсияро бо фармони зерин татбиқ кунед:

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

Акнун фармони зерро иҷро кунед ва боварӣ ҳосил кунед, ки ҳангоми муайян кардани сарлавҳа файлҳои дурустро мегиред version:

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

эрод гирифтан: Барои илова кардани арзишҳои гуногун дар сарлавҳа ва санҷиши натиҷаҳо бевосита дар браузер, шумо метавонед истифода баред ин тамдид ба Chrome бо ин барои Firefox - тақрибан. тарҷума.).

Умуман, DestinationRules дар соҳаи мувозинати сарборӣ қобилиятҳои бештар дорад - тафсилотро дар ҳуҷҷатҳои расмӣ.

Пеш аз омӯзиши минбаъдаи VirtualService, биёед "версияи сабз" -и барнома ва қоидаи мувофиқи самти ҳаракатро бо иҷрои фармонҳои зерин нест кунем:

$ 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: Хидматҳои виртуалӣ дар амал

Сояи («сипар») ё Mirroring ("оинакунӣ") дар ҳолатҳое истифода мешавад, ки мо мехоҳем тағиротро дар истеҳсолот бидуни таъсир ба корбарони ниҳоӣ санҷем: барои ин, мо дархостҳоро такрор мекунем ("ойина") ба инстансияи дуюм, ки тағйироти дилхоҳ ворид карда шудаанд ва ба оқибатҳои он нигаред. Оддӣ карда гӯем, ин вақтест, ки ҳамкасбони шумо масъалаи муҳимтаринро интихоб мекунад ва дар шакли як пораи бузурги лой дархост мекунад, ки ҳеҷ кас наметавонад онро баррасӣ кунад.

Барои санҷидани ин сенария дар амал, биёед як мисоли дуюми SA-Logic-ро бо хатоҳо (buggy) бо иҷро кардани фармони зерин:

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

Ва акнун биёед фармонро иҷро кунем, то боварӣ ҳосил кунем, ки ҳама ҳолатҳо бо app=sa-logic Онҳо инчунин тамғакоғазҳоро бо версияҳои мувофиқ доранд:

$ 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

хизматрасонӣ sa-logic тупҳоро бо нишона нишон медиҳад app=sa-logic, бинобар ин ҳама дархостҳо дар байни ҳама ҳолатҳо тақсим карда мешаванд:

Бозгашт ба microservices бо Istio. Қисми 2

... аммо мо мехоҳем, ки дархостҳо ба нусхаҳои v1 фиристода шаванд ва ба нусхаҳои v2 инъикос карда шаванд:

Бозгашт ба microservices бо Istio. Қисми 2

Мо инро тавассути VirtualService дар якҷоягӣ бо DestinationRule ба даст меорем, ки дар он қоидаҳо зермаҷмӯаҳо ва масирҳои VirtualService ба зермаҷмӯаи мушаххасро муайян мекунанд.

Муайян кардани зермаҷмӯаҳо дар Қоидаҳои таъинот

Зергурӯҳҳо (зергурӯҳҳо) бо конфигуратсияи зерин муайян карда мешаванд (sa-мантиқ- зермаҷмӯаҳои-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) муайян мекунад, ки ин коида танхо ба мавридхое дахл дорад, ки хатсайр ба суи хизмат меравад sa-logic;
  2. Унвонҳо (name) зермаҷмӯаҳо ҳангоми масир ба мисолҳои зермаҷмӯа истифода мешаванд;
  3. Нишон (label) ҷуфтҳои калид-арзишро муайян мекунад, ки мисолҳо бояд барои қисми зермаҷмӯа шудан мувофиқ бошанд.

Конфигуратсияро бо фармони зерин татбиқ кунед:

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

Акнун, ки зермаҷмӯаҳо муайян шудаанд, мо метавонем VirtualService-ро идома диҳем ва танзим кунем, то қоидаҳоро ба дархостҳо ба sa-logic татбиқ кунад, то онҳо:

  1. Ба зермаҷмӯа равона карда шудааст v1,
  2. Ба зермаҷмӯа инъикосшуда v2.

Манифести зерин ба шумо имкон медиҳад, ки нақшаҳои худро амалӣ кунед (sa-мантиқ- зергурӯҳҳо-соягӣ-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

Дар ин ҷо тавзеҳот лозим нест, пас биёед онро дар амал бубинем:

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

Биёед бо занги фармони зерин сарборро илова кунем:

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

Биёед ба натиҷаҳо дар Grafana назар кунем, ки дар он шумо мебинед, ки версияи хатогиҳо (buggy) боиси нокомии ~60% дархостҳо мегардад, аммо ҳеҷ яке аз ин нокомиҳо ба корбарони ниҳоӣ таъсир намерасонанд, зеро ба онҳо хидмати иҷрошаванда посух медиҳад.

Бозгашт ба microservices бо Istio. Қисми 2
Ҷавобҳои бомуваффақияти версияҳои гуногуни хидмати са-логӣ

Дар ин ҷо мо бори аввал дидем, ки чӣ тавр VirtualService ба фиристодагони хидматҳои мо татбиқ карда мешавад: кай sa-web-app дархост мекунад sa-logic, он тавассути фиристодаи паҳлӯ мегузарад, ки тавассути VirtualService танзим шудааст, ки дархостро ба зермаҷмӯаи v1 равона кунад ва дархостро ба зермаҷмӯаи v2 хидмат инъикос кунад. sa-logic.

Ман медонам, шумо аллакай фикр мекунед, ки Хидматҳои виртуалӣ оддӣ аст. Дар фасли оянда, мо онро васеъ карда, мегӯем, ки онҳо дар ҳақиқат бузурганд.

Намоиши канарӣ

Canary Deployment раванди паҳн кардани версияи нави барнома барои шумораи ками корбарон мебошад. Он барои боварӣ ҳосил кардан истифода мешавад, ки дар нашр ягон мушкилот вуҷуд надорад ва танҳо пас аз он, ки аллакай ба сифати (барориши) он боварӣ дошта, онро ба корбарони дигар паҳн кунед.оаудиторияи калонтар.

Барои намоиш додани канарияҳо, мо кор бо зермаҷмӯаро идома медиҳем buggy у sa-logic.

Биёед вақтро ба чизҳои ночиз беҳуда сарф накунем ва фавран 20% корбаронро ба версияи хатогиҳо фиристем (ин паҳншавии канарияи моро ифода мекунад) ва 80% боқимондаро ба хидмати муқаррарӣ. Барои ин, хидмати зеринро истифода баред VirtualService (sa-мантиқи зергурӯҳҳои-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 вазн (weight), ки фоизи дархостҳоро, ки ба қабулкунанда ё зергурӯҳи қабулкунанда равона карда мешаванд, муайян мекунад.

Биёед конфигуратсияи қаблии VirtualService-ро барои sa-logic бо фармони зерин:

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

... ва мо фавран мебинем, ки баъзе дархостҳо ба нокомиҳо оварда мерасонанд:

$ 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 имкон медиҳад, ки паҳнкунии канарияҳо: Дар ин ҳолат, мо таъсири эҳтимолии мушкилотро то 20% базаи корбар кам кардем. Аҷоиб! Ҳоло, дар ҳама ҳолат, вақте ки мо ба коди худ боварӣ надорем (ба ибораи дигар - ҳамеша...), мо метавонем аз оинасозӣ ва rollouts canary истифода барем.

Танаффусҳо ва кӯшишҳои такрорӣ

Аммо хатогиҳо на ҳамеша дар код хотима меёбанд. Дар рӯйхат аз "8 Ақидаҳои нодуруст дар бораи компютерҳои тақсимшуда"Дар ҷои аввал эътиқоди нодуруст дар бораи "шабака боэътимод аст". Дар асл шабака не боэътимод, ва аз ин сабаб ба мо лозим аст тайм-аутҳои (таърих) ва дубора кӯшиш мекунад (такрор).

Барои намоиш мо истифодаи ҳамон версияи мушкилотро идома медиҳем sa-logic (buggy), ва мо беэътимодии шабакаро бо нокомиҳои тасодуфӣ тақлид хоҳем кард.

Бигзор хидмати мо бо хатогиҳо 1/3 имкони гирифтани посухи хеле тӯлонӣ, 1/3 имкони анҷоми хатои сервери дохилӣ ва 1/3 имкони бомуваффақият баргардонидани саҳифа дошта бошад.

Барои кам кардани таъсири чунин мушкилот ва беҳтар кардани зиндагии корбарон, мо метавонем:

  1. мӯҳлат илова кунед, агар барои посух додан ба хидмат аз 8 сония бештар вақт лозим бошад,
  2. дубора кӯшиш кунед, агар дархост иҷро нашавад.

Барои татбиқ, мо таърифи захираҳои зеринро истифода мебарем (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. Давомнокии дархост ба 8 сония муқаррар карда шудааст;
  2. Дархостҳо 3 маротиба такрор карда мешаванд;
  3. Ва ҳар як кӯшиш бемуваффақ дониста мешавад, агар вақти посух аз 3 сония зиёд бошад.

Ин як оптимизатсия аст, зеро корбар набояд беш аз 8 сония интизор шавад ва мо се кӯшиши навро барои гирифтани посух дар сурати нокомиҳо анҷом медиҳем, ки имкони посухи муваффақро афзоиш медиҳем.

Конфигуратсияи навшударо бо фармони зерин татбиқ кунед:

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

Ва дар графикҳои Grafana тафтиш кунед, ки шумораи посухҳои муваффақ дар боло афзоиш ёфтааст:

Бозгашт ба microservices бо Istio. Қисми 2
Беҳбудиҳо дар омори бомуваффақияти посухҳо пас аз илова кардани мӯҳлатҳо ва кӯшишҳои такрорӣ

Пеш аз гузаштан ба фасли оянда (ё дурусттараш, ба қисми навбатии мақола, зеро дар ин ҷо дигар таҷрибаҳои амалӣ нахоҳад буд - тақрибан тарҷума.), нест кунед sa-logic-buggy ва VirtualService тавассути иҷро кардани фармонҳои зерин:

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

Намунаҳои ҷудокунаки барқӣ ва қалъа

Мо дар бораи ду намунаи муҳими меъмории микросервис сухан меронем, ки ба шумо имкон медиҳанд, ки ба худ барқарорсозӣ ноил шавед (худшифоӣ) хизматрасонӣ.

Роҳи оҳан («шиканка») барои қатъ кардани дархостҳое, ки ба як хидмате, ки носолим ҳисобида мешавад, ва барқарор кардани он дар ҳоле истифода мешавад, ки дархостҳои муштарӣ ба мисолҳои солими ин хидмат равона карда мешаванд (ки фоизи посухҳои муваффақро зиёд мекунад). (Эзоҳ: Тавсифи муфассали намунаро метавон пайдо кард, масалан, дар ин ҷо.)

Пойгоҳ ("қисм") нокомиҳои хидматро аз таъсир ба тамоми система ҷудо мекунад. Масалан, Хидмати B шикаста аст ва хидмати дигар (муштарии Хадамоти В) ба Хадамоти В дархост мекунад, ки он ҳавзи риштаи худро тамом мекунад ва наметавонад ба дархостҳои дигар хидмат расонад (ҳатто агар онҳо аз Хадамоти B набошанд). (Эзоҳ: Тавсифи муфассали намунаро метавон пайдо кард, масалан, дар ин ҷо.)

Ман тафсилоти татбиқи ин намунаҳоро сарфи назар мекунам, зеро онҳоро ёфтан осон аст ҳуҷҷатҳои расмӣ, ва ман инчунин дар ҳақиқат мехоҳам тасдиқ ва иҷозатро нишон диҳам, ки дар қисми навбатии мақола муҳокима хоҳанд шуд.

PS аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ