Catetan. narjamahkeun.: Bagian munggaran Séri ieu dikhususkeun pikeun ngenalkeun kamampuan Istio sareng nunjukkeun aranjeunna dina aksi. Ayeuna urang bakal ngobrol ngeunaan aspék leuwih kompleks tina konfigurasi sarta pamakéan bolong jasa ieu, sarta hususna, ngeunaan finely katala routing sarta manajemén lalulintas jaringan.
Kami ogé ngingetan yén tulisan éta ngagunakeun konfigurasi (manifestasi pikeun Kubernetes sareng Istio) tina gudang. istio-ngawasaan.
Manajemén Lalu Lintas
Kalayan Istio, kamampuan anyar muncul dina kluster pikeun nyayogikeun:
Routing pamundut dinamis: rollouts kanaria, nguji A / B;
Balancing beban: basajan tur konsisten, dumasar kana hashes;
Pamulihan sanggeus ragrag: timeouts, retries, circuit breakers;
Nalika tulisan diteruskeun, kamampuan ieu bakal diilustrasi nganggo aplikasi anu dipilih salaku conto sareng konsép anyar bakal diwanohkeun sapanjang jalan. Konsep sapertos anu munggaran bakal DestinationRules(nyaéta aturan ngeunaan panarima patalimarga/paménta - kira-kira transl.), kalayan bantuan anu urang ngaktipkeun A / B nguji.
A / B nguji: DestinationRules dina prakna
A / B nguji dipaké dina kasus dimana aya dua versi tina hiji aplikasi (biasana aranjeunna visually béda) sarta kami henteu 100% yakin mana nu bakal ngaronjatkeun pangalaman pamaké. Ku alatan éta, urang ngajalankeun duanana versi sakaligus tur ngumpulkeun metrics.
Pikeun nyebarkeun versi kadua frontend, anu diperyogikeun pikeun nunjukkeun tés A / B, jalankeun paréntah di handap ieu:
$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created
Manifestasi panyebaran pikeun "vérsi héjo" béda dina dua tempat:
Gambar dumasar kana tag anu béda - istio-green,
Pods gaduh labél version: green.
Kusabab duanana deployments boga labél a app: sa-frontend,paménta dialihkeun ku jasa virtual sa-external-services pikeun layanan sa-frontend, bakal dialihkeun ka sadaya instansi sarta beban bakal disebarkeun ngaliwatan algoritma round-robin, anu bakal ngakibatkeun kaayaan di handap ieu:
Berkas anu dipénta henteu kapendak
Berkas-berkas ieu henteu kapendak sabab namina béda dina vérsi aplikasi anu béda. Hayu urang pastikeun ieu:
Ieu ngandung harti yén index.html, requesting hiji versi file statik, bisa dikirim ku load balancer ka pods nu boga versi béda, dimana, alesan atra, file sapertos teu aya. Janten, supados aplikasi tiasa dianggo, urang kedah netepkeun larangan: "versi sarua tina aplikasi nu dilayanan index.html kedah ngawula requests saterusna".
Urang bakal ka ditu ku kasaimbangan beban dumasar-hash anu konsisten (Konsisten Hash Loadbalancing)... Dina hal ieu requests ti klien sarua dikirim ka conto backend sarua, pikeun nu sipat geus siap dipaké - contona, hiji lulugu HTTP. Dilaksanakeun nganggo DestinationRules.
Aturan Tujuan
sanggeus VirtualService dikirim pamundut ka layanan nu dipikahoyong, ngagunakeun DestinationRules urang bisa nangtukeun kawijakan anu bakal dilarapkeun ka lalulintas ditakdirkeun pikeun instansi jasa ieu:
Manajemén lalulintas kalawan sumberdaya Istio
nyarios: Dampak sumberdaya Istio on lalulintas jaringan dibere dieu dina cara anu gampang ngartos. Janten tepatna, kaputusan ngeunaan conto anu ngirim pamenta dilakukeun ku Utusan di Ingress Gateway anu dikonpigurasi dina CRD.
Kalayan Aturan Tujuan, urang tiasa ngonpigurasikeun kasaimbangan beban pikeun ngagunakeun hashes anu konsisten sareng mastikeun yén conto jasa anu sami ngaréspon ka pangguna anu sami. Konfigurasi di handap ieu ngamungkinkeun anjeun pikeun ngahontal ieu (destinationrule-sa-frontend.yaml):
nyarios: Pikeun nambahkeun nilai béda dina lulugu jeung nguji hasil langsung dina browser, Anjeun bisa make extension ieu kana Chrome (atawa kalawan ieu pikeun Firefox - approx. tarjamah.).
Sacara umum, DestinationRules gaduh langkung seueur kamampuan dina bidang balancing beban - pariksa detil dina dokuméntasi resmi.
Sateuacan ngulik VirtualService langkung jauh, hayu urang ngahapus "versi héjo" tina aplikasi sareng aturan arah lalu lintas anu saluyu ku ngajalankeun paréntah di handap ieu:
Bayangan (“ngalindungan”) atawa Mirroring (“ngeunteung”) dipaké dina kasus dimana urang rék nguji parobahan dina produksi tanpa mangaruhan pamaké tungtung: ngalakukeun ieu, urang duplikat ("eunteung") requests ka conto kadua dimana parobahan nu dipikahoyong geus dijieun, sarta kasampak di konsékuansi. Kantun nempatkeun, ieu nalika batur sapagawean anjeun milih masalah anu paling kritis sareng ngadamel pamenta tarik dina bentuk kokotor anu ageung anu teu aya anu tiasa marios deui.
Pikeun nguji skenario ieu dina aksi, hayu urang nyieun conto kadua SA-Logic kalawan bug (buggy) ku ngajalankeun paréntah di handap ieu:
$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created
Tur ayeuna hayu urang ngajalankeun paréntah pikeun mastikeun yén sakabéh instansi kalawan app=sa-logic Éta ogé gaduh labél sareng versi anu saluyu:
palayanan sa-logic nargétkeun pods kalawan labél a app=sa-logic, ku kituna sadaya pamundut bakal disebarkeun ka sadaya instansi:
... tapi kami hoyong pamundut dikirim ka instansi v1 sareng dicerminkeun kana instansi v2:
Kami bakal ngahontal ieu ngaliwatan VirtualService dina kombinasi sareng DestinationRule, dimana aturan bakal nangtukeun subset sareng rute VirtualService ka subset khusus.
Host (host) ngahartikeun yén aturan ieu manglaku ngan pikeun kasus nalika jalur mana arah jasa sa-logic;
Judul (name) subset dipaké nalika routing ka subset instansi;
Label (label) nangtukeun pasangan konci-nilai nu instansi kudu cocog pikeun jadi bagian tina subset.
Larapkeun konfigurasi kalayan paréntah di handap ieu:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created
Ayeuna yén subset diartikeun, urang tiasa ngaléngkah sareng ngonpigurasikeun VirtualService pikeun nerapkeun aturan pikeun pamundut ka sa-logika supados aranjeunna:
Henteu aya katerangan anu diperyogikeun di dieu, janten hayu urang tingali dina tindakan:
$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic created
Hayu urang tambahkeun beban ku nelepon paréntah di handap ieu:
$ while true; do curl -v http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
Hayu urang tingali hasil dina Grafana, dimana anjeun tiasa ningali yén versi ku bug (buggy) nyababkeun kagagalan pikeun ~ 60% tina pamundut, tapi henteu aya kagagalan ieu mangaruhan pangguna akhir sabab direspon ku jasa anu ngajalankeun.
réspon suksés tina versi béda tina layanan sa-logika
Di dieu urang mimiti ningali kumaha VirtualService diterapkeun ka Envoys tina jasa kami: iraha sa-web-app ngajadikeun pamundut ka sa-logic, éta ngaliwatan sidecar Utusan, nu - via VirtualService - geus ngonpigurasi kana jalur pamundut ka sawaréh v1 jeung eunteung pamundut ka sawaréh v2 tina jasa. sa-logic.
Kuring terang, anjeun panginten panginten yén Layanan Virtual saderhana. Dina bagian salajengna, urang bakal ngalegaan éta ku nyarios yén aranjeunna ogé saé pisan.
Kanaria rollouts
Canary Deployment mangrupikeun prosés ngaluncurkeun vérsi énggal tina aplikasi ka sajumlah leutik pangguna. Hal ieu dianggo pikeun mastikeun yén teu aya masalah dina sékrési sareng ngan saatos éta, parantos yakin kana kualitasna (pelepasan), nyebarkeun éta ka pangguna sanés.оpanongton gedé.
Pikeun demonstrate rollouts kanaria, urang bakal neruskeun gawé bareng subset a buggy у sa-logic.
Hayu urang ulah runtah waktu on trifles sarta geura-giru ngirim 20% pamaké pikeun versi kalawan bug (ieu bakal ngagambarkeun rollout kenari urang), sarta sésana 80% ka layanan normal. Jang ngalampahkeun ieu, paké VirtualService di handap ieu (sa-logika-subset-canary-vs.yaml):
... sareng urang bakal langsung ningali yén sababaraha pamundut ngakibatkeun gagal:
$ 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 ngaktifkeun rollouts kanaria: Dina hal ieu, kami geus ngahususkeun dampak poténsi masalah pikeun 20% tina basa pamaké. Éndah! Ayeuna, dina unggal kasus nalika urang teu yakin kana kode urang (dina kecap sejen - salawasna ...), urang tiasa nganggo mirroring na rollouts kanaria.
Timeouts na retries
Tapi bug henteu salawasna mungkas dina kode. Dina daptar ti "8 Misconceptions ngeunaan komputasi disebarkeun"Di tempat munggaran nyaéta kapercayaan anu salah yén" jaringan tiasa dipercaya. Dina kanyataanana jaringan teu dipercaya, jeung alesan ieu urang kudu timeouts (waktuna) sareng nyobian deui (nyobian deui).
Pikeun demonstrasi kami bakal terus nganggo versi masalah anu sami sa-logic (buggy), sarta kami bakal simulate unreliability tina jaringan jeung gagal acak.
Hayu jasa kami kalawan bug boga 1/3 kasempetan nyandak panjang teuing pikeun ngabales, 1/3 kasempetan tungtung hiji Kasalahan Server internal, sarta 1/3 kasempetan junun balik kaca.
Pikeun ngirangan dampak masalah sapertos kitu sareng ngajantenkeun kahirupan langkung saé pikeun pangguna, urang tiasa:
tambahkeun waktosna upami palayanan peryogi langkung lami ti 8 detik kanggo ngaréspon,
Sarta unggal usaha dianggap gagal lamun waktu respon ngaleuwihan 3 detik.
Ieu mangrupikeun optimasi sabab pangguna henteu kedah ngantosan langkung ti 8 detik sareng kami bakal ngadamel tilu usaha anyar pikeun kéngingkeun réspon upami gagal, ningkatkeun kasempetan réspon anu suksés.
Larapkeun konfigurasi anu diropéa nganggo paréntah di handap ieu:
Sareng parios dina grafik Grafana yén jumlah réspon anu suksés parantos ningkat di luhur:
Perbaikan dina statistik respon suksés sanggeus nambahkeun timeouts na retries
Sateuacan ngaléngkah ka bagian salajengna (atawa rada, ka bagian saterusna artikel, sabab dina ieu moal aya deui percobaan praktis - approx. transl.), mupus sa-logic-buggy sareng VirtualService ku ngajalankeun paréntah di handap ieu:
Urang ngobrol ngeunaan dua pola penting dina arsitektur microservice nu ngidinan Anjeun pikeun ngahontal recovery diri (nyageurkeun diri) jasa.
circuit breaker("pemutus sirkuit") dipaké pikeun nungtungan requests datang ka hiji conto ladenan nu dianggap teu damang tur malikkeun eta bari requests klien dialihkeun ka instansi cageur tina jasa éta (anu ngaronjatkeun persentase réspon suksés). (Catetan: Katerangan anu langkung rinci ngeunaan pola tiasa dipendakan, contona, di dieu.)
Bulkhead("partisi") ngasingkeun gagal jasa tina mangaruhan sakabéh sistem. Salaku conto, Service B rusak sareng jasa anu sanés (klien Service B) naroskeun ka Service B, nyababkeun éta béakna kolam renang benang sareng teu tiasa ngalayanan pamundut anu sanés (sanaos sanés ti Service B). (Catetan: Katerangan anu langkung rinci ngeunaan pola tiasa dipendakan, contona, di dieu.)
Kuring bakal ngaleungitkeun rinci palaksanaan pola ieu sabab gampang pikeun manggihan di dokuméntasi resmi, Sareng kuring ogé hoyong nunjukkeun kaaslianana sareng otorisasina, anu bakal dibahas dina bagian salajengna tulisan.