E hoʻi i nā microservices me Istio. Mahele 2

E hoʻi i nā microservices me Istio. Mahele 2

Nānā. unuhi.: Mahele mua Ua hoʻolaʻa ʻia kēia moʻo no ka hoʻolauna ʻana i nā mana Istio a hōʻike iā lākou i ka hana. I kēia manawa, e kamaʻilio mākou e pili ana i nā ʻano paʻakikī o ka hoʻonohonoho ʻana a me ka hoʻohana ʻana i kēia mesh lawelawe, a ʻo ia hoʻi, e pili ana i ka hoʻokele maikaʻi ʻia a me ka hoʻokele ʻana i ka ʻoihana pūnaewele.

Hoʻomaopopo pū mākou iā ʻoe e hoʻohana ana ka ʻatikala i nā hoʻonohonoho (nā hōʻike no Kubernetes a me Istio) mai ka waihona. istio-mastery.

hooponopono kaapuni

Me Istio, ʻike ʻia nā mana hou i ka hui e hoʻolako:

  • Ka hoʻokele ʻana i ka noi ikaika: nā ʻōwili canary, hoʻāʻo A/B;
  • Kaulike hoʻouka: maʻalahi a kūlike, ma muli o nā hashes;
  • Hoʻihoʻi ma hope o ka hāʻule: manawa pau, ho'āʻo hou, hoʻopau kaapuni;
  • Hoʻokomo hewa: lohi, hāʻule nā ​​noi, etc.

Ke hoʻomau nei ka ʻatikala, e hōʻike ʻia kēia mau mea hiki ke hoʻohana i ka noi i koho ʻia ma ke ʻano he laʻana a e hoʻokomo ʻia nā manaʻo hou ma ke ala. ʻO ia ka manaʻo mua DestinationRules (ʻo ia hoʻi. nā lula e pili ana i ka mea e loaʻa ana i nā kaʻa/noi - ma kahi o. transl.), me ke kōkua o kā mākou hoʻāʻo ʻana i ka hoʻāʻo A/B.

Hoʻāʻo A/B: DestinationRules ma ka hoʻomaʻamaʻa

Hoʻohana ʻia ka hoʻāʻo A/B i nā hihia i loaʻa i ʻelua mau mana o kahi noi (ʻo ka mea maʻamau he ʻokoʻa nā hiʻohiʻona) a ʻaʻole mākou 100% maopopo ka mea e hoʻomaikaʻi i ka ʻike mea hoʻohana. No laila, holo mākou i nā mana ʻelua i ka manawa like a hōʻiliʻili i nā metric.

No ka hoʻolālā ʻana i ka mana ʻelua o ka frontend, koi ʻia no ka hōʻike ʻana i ka hoʻāʻo A/B, e holo i kēia kauoha:

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

ʻOkoʻa ka hōʻike hoʻolaha no ka mana ʻōmaʻomaʻo ma nā wahi ʻelua:

  1. Hoʻokumu ʻia ke kiʻi ma kahi hōʻailona ʻokoʻa - istio-green,
  2. He lepili ko Pods version: green.

No ka mea, loaʻa i nā hoʻolālā ʻelua kahi lepili app: sa-frontend, nā noi i hoʻouna ʻia e ka lawelawe virtual sa-external-services no ka lawelawe sa-frontend, e hoʻihoʻi ʻia i kona mau manawa āpau a e puʻunaue ʻia ka ukana ma o round-robin algorithm, e alakaʻi i kēia kūlana:

E hoʻi i nā microservices me Istio. Mahele 2
ʻAʻole i loaʻa nā faila i noi ʻia

ʻAʻole i loaʻa kēia mau faila no ka mea ua kapa ʻia lākou ma nā ʻano like ʻole o ka noi. E hōʻoia i kēia:

$ 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

ʻO ia ka manaʻo index.html, e noi ana i hoʻokahi mana o nā faila static, hiki ke hoʻouna ʻia e ka mea hoʻohālikelike ukana i nā pods i loaʻa kahi ʻano ʻokoʻa, kahi, no nā kumu maopopo, ʻaʻole i loaʻa ia mau faila. No laila, i mea e hana ai ka noi, pono mākou e kau i kahi palena: "ʻO ka mana like o ka palapala noi i lawelawe i ka index.html pono e lawelawe i nā noi ma hope".

E hōʻea mākou i laila me ka hoʻokau kaulike ʻana i ka hash (Ka Hash Loadbalancing Kūlike)... I kēia hihia hoʻouna ʻia nā noi mai ka mea kūʻai aku i ka laʻana backend like, kahi waiwai i koho mua ʻia - no ka laʻana, he poʻomanaʻo HTTP. Hoʻohana ʻia me ka DestinationRules.

Kūlana Rules

Mahope iho Hana Kūikawā hoʻouna i kahi noi i ka lawelawe i makemake ʻia, me ka hoʻohana ʻana i DestinationRules hiki iā mākou ke wehewehe i nā kulekele e hoʻopili ʻia i nā kaʻa i koho ʻia no nā manawa o kēia lawelawe:

E hoʻi i nā microservices me Istio. Mahele 2
ʻO ka hoʻokele kaʻa me nā kumuwaiwai Istio

i hoʻopuka: Hōʻike ʻia ka hopena o nā kumuwaiwai Istio ma ka ʻoihana pūnaewele ma kahi ala maʻalahi e hoʻomaopopo. ʻO ka pololei, ʻo ka hoʻoholo i kahi manawa e hoʻouna ai i ka noi i hana ʻia e ka ʻelele ma ka Ingress Gateway i hoʻonohonoho ʻia i ka CRD.

Me nā Kūlana Kūlana, hiki iā mākou ke hoʻonohonoho i ka hoʻohālikelike ʻana i ka ukana e hoʻohana i nā hashes maʻamau a hōʻoia i ka pane ʻana o ka lawelawe like i ka mea hoʻohana like. Hiki iā ʻoe ke hoʻokō i kēia (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 - e hana ʻia ka hash ma muli o nā ʻike o ke poʻomanaʻo HTTP version.

E noi i ka hoʻonohonoho me kēia kauoha:

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

I kēia manawa e holo i ke kauoha ma lalo nei a e hōʻoia e loaʻa iā ʻoe nā faila kūpono ke kuhikuhi ʻoe i ke poʻo version:

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

i hoʻopuka: E hoʻohui i nā waiwai like ʻole i ke poʻo a hoʻāʻo pololei i nā hopena i ka polokalamu kele pūnaewele, hiki iā ʻoe ke hoʻohana keia hooloihi iā Chrome (ai ole me keia no Firefox - ma kahi o. unuhi.).

Ma keʻano laulā, ʻoi aku ka nui o ka DestinationRules i ka wahi o ka loaʻa kaulike - e nānā i nā kikoʻī i loko palapala kūhelu.

Ma mua o ke aʻo ʻana i ka VirtualService hou aku, e kāpae i ka "'ōmaʻomaʻo'ōmaʻomaʻo" o ka noi a me ke ʻano alakaʻi alakaʻi e pili ana i ka holo ʻana i kēia mau kauoha:

$ 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: Nā lawelawe Virtual i ka hoʻomaʻamaʻa

Pā Lōlani (“palekana”) a i ʻole ke aniani (“ke aniani ana”) hoʻohana ʻia i nā hihia kahi a mākou e makemake ai e hoʻāʻo i kahi hoʻololi i ka hana ʻana me ka ʻole o ka hoʻopili ʻana i nā mea hoʻohana hope: no ka hana ʻana i kēia, ke kope nei mākou i nā noi ("mirror") i kahi manawa ʻelua kahi i hana ʻia ai nā loli i makemake ʻia, a nānā i nā hopena. ʻO ka waiho wale ʻana, ʻo ia ka manawa e koho ai kāu hoa hana i ka pilikia koʻikoʻi a hana i kahi noi huki ma ke ʻano o kahi puʻupuʻu lepo nui ʻaʻole hiki i kekahi ke nānā maoli.

No ka hoʻāʻo ʻana i kēia hiʻohiʻona i ka hana, e hana mākou i ka lua o ka SA-Logic me nā pōpoki (buggy) ma ka holo ʻana i kēia kauoha:

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

A i kēia manawa e holo kāua i ke kauoha e hōʻoia i nā manawa āpau me app=sa-logic Loaʻa iā lākou nā lepili me nā mana like:

$ 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

hana sa-logic pahu pahu pahu me ka lepili app=sa-logic, no laila e māhele ʻia nā noi a pau i waena o nā manawa a pau:

E hoʻi i nā microservices me Istio. Mahele 2

... akā makemake mākou e hoʻouna ʻia nā noi i nā manawa v1 a hoʻohālikelike ʻia i nā manawa v2:

E hoʻi i nā microservices me Istio. Mahele 2

E hoʻokō mākou i kēia ma o VirtualService i hui pū me DestinationRule, kahi e hoʻoholo ai nā lula i nā subsets a me nā ala o ka VirtualService i kahi ʻāpana kikoʻī.

Ka wehewehe ʻana i nā ʻāpana ʻāpana i nā lula hoʻoholo

Nā ʻāpana ʻāpana (mau ʻāpana) Hoʻoholo ʻia e ka hoʻonohonoho ʻana ma lalo nei (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. Mea hoʻokipa (host) wehewehe e pili ana kēia lula i nā hihia ke hele ke ala i ka lawelawe sa-logic;
  2. Nā inoa (name) hoʻohana ʻia nā subsets i ka wā e hoʻokele ai i nā manawa hoʻonohonoho;
  3. Lepili (label) ka wehewehe ʻana i nā hui waiwai kī e hoʻohālikelike ʻia e lilo i ʻāpana o ka subset.

E noi i ka hoʻonohonoho me kēia kauoha:

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

I kēia manawa ua wehewehe ʻia nā subsets, hiki iā mākou ke neʻe a hoʻonohonoho i ka VirtualService e hoʻopili i nā lula i nā noi i sa-logic i hiki ai iā lākou:

  1. Hoʻoholo ʻia i kahi ʻāpana v1,
  2. Ua aniani ʻia i kahi ʻāpana v2.

ʻO kēia manifesto e hiki ai iā ʻoe ke hoʻokō i kāu mau hoʻolālā (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

ʻAʻole pono ka wehewehe ʻana ma aneʻi, no laila e ʻike kākou i ka hana:

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

E hoʻohui i ka ukana ma ke kāhea ʻana i kēia kauoha:

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

E nānā i nā hopena ma Grafana, kahi āu e ʻike ai i ka mana me nā pōpoki (buggy) ka hopena i ka hāʻule ʻole no ~60% o nā noi, akā ʻaʻohe o kēia mau hemahema e hoʻopilikia i nā mea hoʻohana hope e like me ka pane ʻana iā lākou e kahi lawelawe holo.

E hoʻi i nā microservices me Istio. Mahele 2
Nā pane lanakila o nā mana like ʻole o ka lawelawe sa-logic

Maanei mākou i ʻike mua ai pehea e pili ai ʻo VirtualService i nā ʻelele o kā mākou lawelawe: i ka manawa sa-web-app noi i sa-logic, hele ia ma ka sidecar Envoy, ka mea - ma o VirtualService - ua hoʻonohonoho ʻia e ala i ka noi i ka v1 subset a hoʻohālikelike i ka noi i ka v2 subset o ka lawelawe. sa-logic.

ʻIke wau, manaʻo paha ʻoe he maʻalahi nā lawelawe Virtual. Ma ka ʻāpana aʻe, e hoʻonui mākou i kēlā me ka ʻōlelo ʻana he maikaʻi maoli nō lākou.

ʻO nā Canary Rollouts

ʻO Canary Deployment ke kaʻina o ka ʻōwili ʻana i kahi mana hou o kahi noi i kahi helu liʻiliʻi o nā mea hoʻohana. Hoʻohana ʻia ia e hōʻoia ʻaʻohe pilikia i ka hoʻokuʻu ʻana a ma hope wale nō, ke hilinaʻi nei i kona ʻano (hoʻokuʻu) maikaʻi, e hāʻawi iā ia i nā mea hoʻohana ʻē aʻe.оlehulehu lehulehu.

No ka hōʻike ʻana i nā ʻōwili canary, e hoʻomau mākou e hana me kahi ʻāpana buggy у sa-logic.

Mai hoʻopau i ka manawa ma nā mea liʻiliʻi a hoʻouna koke i ka 20% o nā mea hoʻohana i ka mana me nā pōpoki (e hōʻike kēia i kā mākou canary rollout), a ʻo ke koena 80% i ka lawelawe maʻamau. No ka hana ʻana i kēia, e hoʻohana i kēia 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

ʻO 1 ke kaumaha (weight), e kuhikuhi ana i ka pakeneka o nā noi e kuhikuhi ʻia i ka mea loaʻa a i ʻole kahi hapa o ka mea i loaʻa.

E hōʻano hou i ka hoʻonohonoho VirtualService mua no sa-logic me keia kauoha:

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

... a e ʻike koke mākou i kekahi mau noi e alakaʻi i nā hemahema:

$ 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

Hiki i nā VirtualServices ke hoʻololi i nā canary rollouts: Ma kēia hihia, ua hōʻemi mākou i ka hopena o nā pilikia i 20% o ka waihona mea hoʻohana. Kupaianaha! I kēia manawa, i kēlā me kēia hihia inā ʻaʻole maopopo mākou i kā mākou code (ma nā ʻōlelo ʻē aʻe - mau ...), hiki iā mākou ke hoʻohana i ka mirroring a me nā canary rollouts.

Hoʻopau manawa a hoʻāʻo hou

Akā ʻaʻole pau nā pōpoki i ke code. Ma ka papa inoa mai "8 Manaʻo kuhihewa e pili ana i ka Computing Distributed"ʻO ka mea mua ka manaʻo hewa ʻole" hilinaʻi ka pūnaewele. ʻO kaʻoiaʻiʻo ka pūnaewele ole hilinaʻi, a no kēia kumu e pono ai mākou i nā manawa (manawa pau) a ho'āʻo hou (hoʻāʻo hou).

No ka hōʻike ʻana e hoʻomau mākou i ka hoʻohana ʻana i ka mana pilikia like sa-logic (buggy), a e hoʻohālike mākou i ka hilinaʻi ʻole o ka pūnaewele me nā hemahema.

E loaʻa i kā mākou lawelawe me nā pōpoki he 1/3 manawa lōʻihi e pane ai, he 1/3 manawa e hoʻopau ai me kahi Hapa Kuloko, a he 1/3 manawa e hoʻihoʻi maikaʻi ai i ka ʻaoʻao.

No ka hoʻohaʻahaʻa i ka hopena o ia mau pilikia a hoʻomaikaʻi i ke ola no nā mea hoʻohana, hiki iā mākou ke:

  1. hoʻohui i kahi manawa hoʻopau inā lōʻihi ka lawelawe ma mua o 8 kekona e pane ai,
  2. e ho'āʻo hou inā hāʻule ka noi.

No ka hoʻokō ʻana, e hoʻohana mākou i kēia wehewehe kumu waiwai (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. Hoʻonohonoho ʻia ka manawa pau no ke noi i 8 kekona;
  2. Hoʻāʻo hou ʻia nā noi i 3 mau manawa;
  3. A manaʻo ʻia kēlā me kēia hoʻāʻo ʻaʻole i kūleʻa inā ʻoi aku ka manawa pane ma mua o 3 kekona.

He optimization kēia no ka mea ʻaʻole pono ka mea hoʻohana e kali ma mua o 8 kekona a e hana mākou i ʻekolu mau hoʻāʻo hou e loaʻa i kahi pane i ka hihia o nā hāʻule, e hoʻonui ana i ka manawa o ka pane kūleʻa.

E noi i ka hoʻonohonoho hou ʻana me kēia kauoha:

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

A e nānā i nā kiʻi Grafana ua hoʻonui ʻia ka helu o nā pane kūleʻa ma luna.

E hoʻi i nā microservices me Istio. Mahele 2
ʻO ka hoʻomaikaʻi ʻana i nā helu kūleʻa pane ma hope o ka hoʻohui ʻana i nā manawa pau a me ka hoʻāʻo hou

Ma mua o ka neʻe ʻana i ka ʻāpana aʻe (a i ʻole, i ka ʻaoʻao aʻe o ka ʻatikala, no ka mea, ʻaʻole e loaʻa hou nā hoʻokolohua kūpono - approx. transl.), holoi sa-logic-buggy a me VirtualService ma ka holo ʻana i kēia mau kauoha:

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

Kaapuni Kaapuni a me ka Bulkhead Patterns

Ke kamaʻilio nei mākou e pili ana i ʻelua mau hiʻohiʻona koʻikoʻi i ka microservice architecture e hiki ai iā ʻoe ke hoʻokō iā ʻoe iho (ho'ōla iā ia iho) lawelawe.

Ka Luna Alakaʻi ("kaapuni kaapuni") hoʻohana ʻia no ka hoʻopau ʻana i nā noi e hele mai ana i kahi lawelawe i manaʻo ʻia he maikaʻi ʻole a hoʻihoʻi ʻia i ka wā e hoʻihoʻi ʻia nā noi o nā mea kūʻai aku i nā manawa olakino o kēlā lawelawe (e hoʻonui ai i ka pakeneka o nā pane kūleʻa). (E hoʻomaopopo: Hiki ke loaʻa kahi wehewehe kikoʻī o ke kumu, no ka laʻana, maanei.)

Poʻokela ("ʻāpana") hoʻokaʻawale i nā hemahema o ka lawelawe mai ka hoʻopilikia ʻana i ka ʻōnaehana holoʻokoʻa. No ka laʻana, ua haki ʻo Service B a noi aku kahi lawelawe ʻē aʻe (ka mea kūʻai aku ʻo Service B) i ka Service B, e hoʻopau ai i kāna kolamu thread a hiki ʻole ke lawelawe i nā noi ʻē aʻe (ʻoiai inā ʻaʻole lākou mai Service B). (E hoʻomaopopo: Hiki ke loaʻa kahi wehewehe kikoʻī o ke kumu, no ka laʻana, maanei.)

E haʻalele wau i nā kikoʻī hoʻokō o kēia mau hiʻohiʻona no ka mea maʻalahi lākou e loaʻa i loko palapala kūhelu, a makemake nui au e hōʻike i ka hōʻoia a me ka ʻae ʻana, e kūkākūkā ʻia ma ka ʻaoʻao aʻe o ka ʻatikala.

PS mai ka unuhi

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka