Atgriezties uz mikropakalpojumiem ar Istio. 2. daļa
PiezÄ«me. tulk.: PirmÄ daļa Å Ä« sÄrija bija veltÄ«ta Istio iespÄju ievieÅ”anai un demonstrÄÅ”anai darbÄ«bÄ. Tagad mÄs runÄsim par sarežģītÄkiem Ŕī pakalpojuma tÄ«kla konfigurÄcijas un izmantoÅ”anas aspektiem, un jo Ä«paÅ”i par precÄ«zi noregulÄtu marÅ”rutÄÅ”anu un tÄ«kla trafika pÄrvaldÄ«bu.
TÄpat atgÄdinÄm, ka rakstÄ tiek izmantotas konfigurÄcijas (manifesti Kubernetes un Istio) no repozitorija istio-meistarÄ«ba.
Satiksmes vadība
Izmantojot Istio, klasterÄ« parÄdÄs jaunas iespÄjas, lai nodroÅ”inÄtu:
Kļūdu ievietoÅ”ana: kavÄÅ”anÄs, noraidÄ«ti pieprasÄ«jumi utt.
Turpinot rakstu, Ŕīs iespÄjas tiks ilustrÄtas, izmantojot atlasÄ«to lietojumprogrammu kÄ piemÄru, un pa ceļam tiks ieviesti jauni jÄdzieni. PirmÄ Å”Äda koncepcija bÅ«s DestinationRules(t.i., noteikumi par trafika/pieprasÄ«jumu saÅÄmÄju - apm. tulk.), ar kuras palÄ«dzÄ«bu aktivizÄjam A/B testÄÅ”anu.
A/B testÄÅ”ana: DestinationRules praksÄ
A/B testÄÅ”ana tiek izmantota gadÄ«jumos, kad ir divas aplikÄcijas versijas (parasti tÄs ir vizuÄli atŔķirÄ«gas) un mÄs neesam 100% pÄrliecinÄti, kura no tÄm uzlabos lietotÄja pieredzi. TÄpÄc mÄs vienlaikus palaižam abas versijas un apkopojam metriku.
Lai izvietotu otro priekÅ”gala versiju, kas nepiecieÅ”ama A/B testÄÅ”anas demonstrÄÅ”anai, palaidiet Å”o komandu:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created
ZaļÄs versijas izvietoÅ”anas manifests atŔķiras divÄs vietÄs:
AttÄls ir balstÄ«ts uz citu tagu - istio-green,
PÄkstÄ«m ir etiÄ·ete version: green.
TÄ kÄ abiem izvietojumiem ir etiÄ·ete app: sa-frontend,pieprasÄ«jumi, ko marÅ”rutÄ virtuÄlais pakalpojums sa-external-services par apkalpoÅ”anu sa-frontend, tiks novirzÄ«ts uz visiem gadÄ«jumiem, un slodze tiks izplatÄ«ta apļa algoritms, kas novedÄ«s pie Å”Ädas situÄcijas:
Pieprasītie faili netika atrasti
Å ie faili netika atrasti, jo dažÄdÄs lietojumprogrammas versijÄs tiem ir atŔķirÄ«gi nosaukumi. PÄrliecinÄsimies par to:
Tas nozÄ«mÄ, ka index.html, pieprasot vienu statisko failu versiju, slodzes lÄ«dzsvarotÄjs var nosÅ«tÄ«t uz podiem, kuriem ir cita versija, kur acÄ«mredzamu iemeslu dÄļ Å”Ädi faili nepastÄv. TÄpÄc, lai lietojumprogramma darbotos, mums ir jÄiestata ierobežojums: ātai paÅ”ai lietojumprogrammas versijai, kas apkalpoja index.html, vajadzÄtu apkalpot turpmÄkos pieprasÄ«jumus'.
MÄs to sasniegsim, izmantojot konsekventu uz jaucÄjkodu balstÄ«tu slodzes lÄ«dzsvaroÅ”anu (Konsekventa hash slodzes lÄ«dzsvaroÅ”ana). Å ajÄ gadÄ«jumÄ pieprasÄ«jumi no tÄ paÅ”a klienta tiek nosÅ«tÄ«ti uz vienu un to paÅ”u aizmugursistÄmas gadÄ«jumu, kuram tiek izmantots iepriekÅ” definÄts rekvizÄ«ts ā piemÄram, HTTP galvene. Ieviests, izmantojot DestinationRules.
GalamÄrÄ·a noteikumi
PÄc VirtuÄlais pakalpojums nosÅ«tÄ«ja pieprasÄ«jumu vajadzÄ«gajam pakalpojumam, izmantojot DestinationRules, mÄs varam definÄt politikas, kas tiks piemÄrotas trafikam, kas paredzÄts Ŕī pakalpojuma gadÄ«jumiem:
Satiksmes vadība ar Istio resursiem
PiezÄ«me: Istio resursu ietekme uz tÄ«kla trafiku Å”eit ir parÄdÄ«ta viegli saprotamÄ veidÄ. PrecÄ«zÄk sakot, lÄmumu par to, uz kuru instanci nosÅ«tÄ«t pieprasÄ«jumu, pieÅem sÅ«tnis CRD konfigurÄtajÄ ieejas vÄrtejÄ.
Izmantojot galamÄrÄ·a noteikumus, mÄs varam konfigurÄt slodzes lÄ«dzsvaroÅ”anu, lai izmantotu konsekventus jaucÄjus un nodroÅ”inÄtu, ka viena un tÄ pati pakalpojuma instance reaÄ£Ä vienam un tam paÅ”am lietotÄjam. Å Äda konfigurÄcija ļauj to sasniegt (destinationrule-sa-frontend.yaml):
PiezÄ«me: lai pievienotu dažÄdas vÄrtÄ«bas galvenÄ un pÄrbaudÄ«tu rezultÄtus tieÅ”i pÄrlÅ«kprogrammÄ, varat izmantot Å”is paplaÅ”inÄjums pÄrlÅ«kam Chrome (Vai ar Å”o Firefox - apm. tulk.).
Änojums (āaizsardzÄ«baā) vai SpoguļoÅ”ana (āspoguļoÅ”anaā) izmanto gadÄ«jumos, kad mÄs vÄlamies pÄrbaudÄ«t ražoÅ”anas izmaiÅas, neietekmÄjot galalietotÄjus: lai to izdarÄ«tu, mÄs dublÄjam (āspoguļoā) pieprasÄ«jumus otrajÄ instancÄ, kur ir veiktas vÄlamÄs izmaiÅas, un aplÅ«kojam sekas. VienkÄrÅ”i sakot, tas ir tad, kad jÅ«su kolÄÄ£is izvÄlas vissvarÄ«gÄko problÄmu un izsaka pieprasÄ«jumu tik liela netÄ«ruma veidÄ, ka neviens to nevar pÄrskatÄ«t.
Lai pÄrbaudÄ«tu Å”o scenÄriju darbÄ«bÄ, izveidosim otru SA-Logic gadÄ«jumu ar kļūdÄm (buggy), izpildot Å”Ädu komandu:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created
Un tagad izpildÄ«sim komandu, lai pÄrliecinÄtos, ka visi gadÄ«jumi ar app=sa-logic ViÅiem ir arÄ« etiÄ·etes ar atbilstoÅ”Äm versijÄm:
ApkalpoÅ”ana sa-logic mÄrÄ·auditorija ir pÄkstis ar etiÄ·eti app=sa-logic, tÄpÄc visi pieprasÄ«jumi tiks sadalÄ«ti starp visiem gadÄ«jumiem:
... bet mÄs vÄlamies, lai pieprasÄ«jumi tiktu nosÅ«tÄ«ti uz v1 gadÄ«jumiem un atspoguļoti v2 instancÄs:
MÄs to sasniegsim, izmantojot VirtualService kombinÄcijÄ ar DestinationRule, kur noteikumi noteiks VirtualService apakÅ”kopas un marÅ”rutus uz konkrÄtu apakÅ”kopu.
Å eit nav nepiecieÅ”ams paskaidrojums, tÄpÄc redzÄsim to darbÄ«bÄ:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic created
Pievienosim slodzi, izsaucot Å”Ädu komandu:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
ApskatÄ«sim rezultÄtus programmÄ Grafana, kur var redzÄt, ka versija ar kļūdÄm (buggy).
VeiksmÄ«gas atbildes uz dažÄdÄm sa-logic pakalpojuma versijÄm
Å eit mÄs pirmo reizi redzÄjÄm, kÄ VirtualService tiek piemÄrots mÅ«su pakalpojumu sÅ«tÅiem: kad sa-web-app izsaka lÅ«gumu sa-logic, tas iet caur blakusvÄÄ£i Envoy, kas, izmantojot VirtualService, ir konfigurÄts, lai novirzÄ«tu pieprasÄ«jumu uz v1 apakÅ”kopu un atspoguļotu pieprasÄ«jumu pakalpojuma v2 apakÅ”kopÄ. sa-logic.
Es zinu, jÅ«s jau domÄjat, ka virtuÄlie pakalpojumi ir vienkÄrÅ”i. NÄkamajÄ sadaÄ¼Ä mÄs to izvÄrsÄ«sim, sakot, ka tie ir arÄ« patieÅ”Äm lieliski.
KanÄrijputniÅi
Canary Deployment ir process, kurÄ nelielam lietotÄju skaitam tiek izlaista jauna lietojumprogrammas versija. To izmanto, lai pÄrliecinÄtos, ka laidienÄ nav problÄmu un tikai pÄc tam, jau pÄrliecinoties par tÄ (laidiena) kvalitÄti, izplatÄ«t to citiem lietotÄjiem.Š¾lielÄka auditorija.
Lai demonstrÄtu kanÄrijputnu izlaiÅ”anu, mÄs turpinÄsim strÄdÄt ar apakÅ”kopu buggy Ń sa-logic.
NetÄrÄsim laiku sÄ«kumiem un nekavÄjoties nosÅ«tÄ«sim 20% lietotÄju uz versiju ar kļūdÄm (tas atspoguļos mÅ«su Canary izlaiÅ”anu), bet atlikuÅ”os 80% uz parasto pakalpojumu. Lai to izdarÄ«tu, izmantojiet Å”o VirtualService (sa-logic-subsets-canary-vs.yaml):
... un mÄs uzreiz redzÄsim, ka daži pieprasÄ«jumi noved pie kļūmÄm:
$ 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
VirtuÄlie pakalpojumi nodroÅ”ina Canary izlaiÅ”anu: Å”ajÄ gadÄ«jumÄ esam samazinÄjuÅ”i problÄmu iespÄjamo ietekmi lÄ«dz 20% no lietotÄju bÄzes. BrÄ«niŔķīgi! Tagad visos gadÄ«jumos, kad neesam pÄrliecinÄti par savu kodu (citiem vÄrdiem sakot - vienmÄr...), mÄs varam izmantot spoguļoÅ”anu un kanÄrijas izlaiÅ”anu.
Noildze un mÄÄ£inÄjumi
TaÄu kļūdas ne vienmÄr nonÄk kodÄ. SarakstÄ no "8 maldÄ«gi priekÅ”stati par dalÄ«to skaitļoÅ”anu"PirmkÄrt, ir kļūdains uzskats, ka "tÄ«kls ir uzticams". PatiesÄ«bÄ tÄ«kls nÄ uzticami, un Ŕī iemesla dÄļ mums ir nepiecieÅ”ams taimauts (taimauts) un mÄÄ£ina vÄlreiz (mÄÄ£ina vÄlreiz).
DemonstrÄÅ”anai mÄs turpinÄsim izmantot to paÅ”u problÄmu versiju sa-logic (buggy), un mÄs simulÄsim tÄ«kla neuzticamÄ«bu ar nejauÅ”Äm kļūmÄm.
Ä»aujiet mÅ«su pakalpojumam ar kļūdÄm reaÄ£Ät pÄrÄk ilgi, 1/3 iespÄjas, ka tas beigsies ar iekÅ”Äju servera kļūdu, un 1/3 iespÄjas, ka lapa tiks veiksmÄ«gi atgriezta.
Lai mazinÄtu Å”Ädu problÄmu ietekmi un uzlabotu lietotÄju dzÄ«vi, mÄs varam:
pievienot taimautu, ja pakalpojumam ir nepiecieÅ”amas vairÄk nekÄ 8 sekundes, lai atbildÄtu,
PieprasÄ«juma taimauts ir iestatÄ«ts uz 8 sekundÄm;
PieprasÄ«jumi tiek izskatÄ«ti atkÄrtoti 3 reizes;
Un katrs mÄÄ£inÄjums tiek uzskatÄ«ts par neveiksmÄ«gu, ja reakcijas laiks pÄrsniedz 3 sekundes.
Å Ä« ir optimizÄcija, jo lietotÄjam nebÅ«s jÄgaida vairÄk par 8 sekundÄm un mÄs veiksim trÄ«s jaunus mÄÄ£inÄjumus saÅemt atbildi kļūmju gadÄ«jumÄ, palielinot veiksmÄ«gas atbildes iespÄju.
Lietojiet atjauninÄto konfigurÄciju ar Å”Ädu komandu:
Un pÄrbaudiet Grafana diagrammÄs, vai veiksmÄ«go atbilžu skaits ir palielinÄjies iepriekÅ”:
Uzlabojumi veiksmÄ«gu atbilžu statistikÄ pÄc taimautu un atkÄrtotu mÄÄ£inÄjumu pievienoÅ”anas
Pirms pÄriet uz nÄkamo sadaļu (pareizÄk sakot, uz nÄkamo raksta daļu, jo Å”ajÄ vairs nebÅ«s praktisku eksperimentu - apm. tulk.), dzÄst sa-logic-buggy un VirtualService, izpildot Å”Ädas komandas:
MÄs runÄjam par diviem svarÄ«giem mikropakalpojumu arhitektÅ«ras modeļiem, kas ļauj sasniegt paÅ”atjaunoÅ”anos (paÅ”dziedinÄÅ”anÄs) pakalpojumi.
Circuit Breaker("automÄtiskais slÄdzis") izmanto, lai pÄrtrauktu pieprasÄ«jumus, kas tiek saÅemti pakalpojuma gadÄ«jumam, kas tiek uzskatÄ«ts par neveselÄ«gu, un atjaunotu to, kamÄr klientu pieprasÄ«jumi tiek novirzÄ«ti uz veselÄ«giem Ŕī pakalpojuma gadÄ«jumiem (kas palielina veiksmÄ«go atbilžu procentuÄlo daļu). (PiezÄ«me: sÄ«kÄku modeļa aprakstu var atrast, piemÄram, Å”eit.)
Starpsiena("nodalÄ«jums") izolÄ pakalpojuma kļūmes, lai tÄs neietekmÄtu visu sistÄmu. PiemÄram, pakalpojums B ir bojÄts un cits pakalpojums (pakalpojuma B klients) iesniedz pieprasÄ«jumu pakalpojumam B, kÄ rezultÄtÄ tas izsmels savu pavedienu kopu un nevar apkalpot citus pieprasÄ«jumus (pat ja tie nav no pakalpojuma B). (PiezÄ«me: sÄ«kÄku modeļa aprakstu var atrast, piemÄram, Å”eit.)
Es izlaidÄ«Å”u Å”o modeļu ievieÅ”anas informÄciju, jo tos ir viegli atrast oficiÄlÄ dokumentÄcija, un es arÄ« ļoti vÄlos parÄdÄ«t autentifikÄciju un autorizÄciju, kas tiks apspriesta nÄkamajÄ raksta daļÄ.