Cathetan. nerjemahake.: Service meshes mesthi dadi solusi sing relevan ing infrastruktur modern kanggo aplikasi sawise arsitektur microservice. Nalika Istio bisa uga ana ing lambe para insinyur DevOps, iki minangka produk sing cukup anyar sing, sanajan lengkap babagan kemampuan sing diwenehake, mbutuhake wektu sing akeh kanggo kenal. Insinyur Jerman Rinor Maloku, sing tanggung jawab kanggo komputasi awan kanggo klien gedhe ing perusahaan telekomunikasi Orange Networks, wis nulis seri bahan sing apik sing ngidini sampeyan nyilem menyang Istio kanthi cepet lan jero. Dheweke miwiti crita babagan apa sing bisa ditindakake Istio ing umum lan kepiye sampeyan bisa ndeleng kanthi cepet kanthi mripatmu dhewe.
Istio - Proyek Open Source, dikembangake kanthi kolaborasi karo tim saka Google, IBM lan Lyft. Iki ngrampungake kerumitan sing muncul ing aplikasi adhedhasar layanan mikro, contone, kayata:
manajemen lalu lintas: wektu entek, nyoba maneh, load balancing;
Keamanan: otentikasi pangguna pungkasan lan wewenang;
bisa diamati: tracing, monitoring, logging.
Kabeh mau bisa ditanggulangi ing tingkat aplikasi, nanging sawise layanan sampeyan ora bakal "mikro" maneh. Kabeh upaya ekstra kanggo ngatasi masalah kasebut minangka sampah sumber daya perusahaan sing bisa digunakake langsung kanggo nilai bisnis. Coba conto:
Manajer Proyek: Suwene wektu kanggo nambah fitur umpan balik?
Pangembang: Loro sprint.
MP : Opo?.. CRUD wae!
R: Nindakake CRUD minangka bagean sing gampang, nanging kita isih kudu otentikasi lan menehi wewenang pangguna lan layanan. Wiwit jaringan ora bisa dipercaya, sampeyan kudu ngleksanakake panjalukan sing bola-bali, uga pola pemutus sirkuit ing klien. Uga, kanggo mesthekake yen kabeh sistem ora kacilakan, sampeyan kudu wektu entek lan akeh(kanggo rincian liyane babagan pola kasebut, deleng mengko ing artikel - kira-kira transl.), lan kanggo ndeteksi masalah, ngawasi, nelusuri, [...]
MP: Oh, ayo dilebokake fitur iki menyang layanan Produk.
Aku idea iku cetha: jumlah langkah lan gaweyan dibutuhake kanggo nambah siji layanan gedhe tenan. Ing artikel iki, kita bakal ndeleng carane Istio mbusak kabeh kerumitan sing kasebut ing ndhuwur (sing ora dimaksudake minangka logika bisnis) saka layanan.
komentar: Artikel nganggep yen sampeyan duwe kawruh babagan Kubernetes. Yen ora, aku nyaranake maca introduksiku kanggo Kubernetes lan mung sawise terus maca materi iki.
Istio ide
Ing jagad tanpa Istio, siji layanan nggawe panjaluk langsung menyang liyane, lan yen gagal, layanan kasebut kudu ditangani dhewe: nyoba anyar, nyedhiyakake wektu entek, mbukak pemutus sirkuit, lsp.
Lalu lintas jaringan ing Kubernetes
Istio, ing sisih liya, nawakake solusi khusus sing kapisah saka layanan lan fungsi kanthi ngganggu interaksi jaringan. Lan kanthi mangkono nindakake:
Canary rollouts: pangalihan mung persentase tetep saka panjalukan menyang versi anyar saka layanan.
Ngawasi lan Metrik: Suwene suwene layanan nanggapi?
Tracing lan observability: Nambahake header khusus kanggo saben panjalukan lan nglacak ing kluster.
Keamanan: Njupuk token JWT, otentikasi lan menehi wewenang pangguna.
Iki mung sawetara saka kemungkinan (pancen mung sawetara!) Kanggo intrik sampeyan. Saiki ayo nyilem menyang rincian teknis!
Arsitektur Istio
Istio nyegat kabeh lalu lintas jaringan lan ngetrapake aturan kasebut, nglebokake proxy cerdas ing wangun wadhah sidecar menyang saben pod. Proksi sing ngaktifake kabeh kabisan mbentuk a pesawat data, lan bisa dikonfigurasi kanthi dinamis nggunakake Pesawat Kontrol.
pesawat data
Proksi sing dilebokake ing pods ngidini Istio gampang entuk syarat sing dibutuhake. Contone, ayo dipriksa maneh lan fungsi pemutus sirkuit.
Carane nyoba maneh lan nglanggar sirkuit dileksanakake ing Utusan
Ringkes:
Envoy (kita ngomong babagan proxy sing ana ing wadhah sidecar, sing disebarake minangka produk kapisah - kira-kira. transl.) ngirim panjalukan kanggo conto pisanan saka layanan B lan gagal.
Utusan Sidecar nyoba maneh (nyoba maneh). (1)
Panjaluk kasebut gagal lan bali menyang proxy sing diarani.
Iki tegese sampeyan ora kudu nggunakake perpustakaan Coba maneh liyane, sampeyan ora kudu nggawe dhewe implementasine saka Circuit Breaking lan Service Discovery ing basa program X, Y utawa Z. Kabeh iki lan akeh liyane kasedhiya metu saka kothak. ing Istio lan ora mbutuhake ora owah-owahan kode.
apik tenan! Saiki sampeyan bisa uga pengin lelungan karo Istio, nanging sampeyan isih duwe keraguan, pitakonan mbukak. Yen iki minangka solusi universal kanggo kabeh kesempatan ing urip, mula sampeyan duwe anggepan alami: sawise kabeh, kabeh solusi kasebut nyatane ora cocog kanggo kasus apa wae.
Lan pungkasane sampeyan takon: "Apa bisa disesuaikan?"
Saiki sampeyan siyap kanggo lelungan segara - lan ayo kenalan karo Control Plane.
Pesawat Kontrol
Iku kasusun saka telung komponen: pilot, Mixer ΠΈ Benteng, sing kerja bareng kanggo ngatur Utusan kanggo nuntun lalu lintas, ngetrapake kabijakan, lan ngumpulake data telemetri. Secara skematis, kabeh katon kaya iki:
Interaksi bidang kontrol karo bidang data
Utusan (i.e. pesawat data) diatur karo Kubernetes CRD (Definisi Sumber Daya Khusus) sing ditetepake dening Istio lan dirancang khusus kanggo tujuan iki. Apa tegese iki kanggo sampeyan iku mung sumber daya liyane ing Kubernetes karo sintaks menowo. Sawise digawe, sumber daya iki bakal dijupuk dening pesawat kontrol lan ditrapake kanggo Utusan.
Mangkono, sampeyan bisa njupuk kluster sing bisa digunakake lan sawise masang komponen Istio, layanan kasebut bakal terus bisa digunakake, lan sawise ngilangi komponen kasebut, kabeh bakal apik maneh. Cetha yen ing kasus iki sampeyan bakal kelangan kesempatan sing diwenehake dening Istio.
Cukup teori - ayo praktekake kawruh iki!
Istio ing laku
Istio mbutuhake kluster Kubernetes kanthi paling ora 4 vCPU lan 8 GB RAM kasedhiya. Kanggo ngunggahake kluster kanthi cepet lan tindakake pandhuan saka artikel kasebut, aku nyaranake nggunakake Google Cloud Platform, sing nawakake pangguna anyar free $300.
Sawise nggawe kluster lan ngatur akses menyang Kubernetes liwat sarana konsol, sampeyan bisa nginstal Istio liwat manajer paket Helm.
Pemasangan Helm Kab
Instal klien Helm ing komputer, kaya sing diterangake ing dokumentasi resmi. Kita bakal nggunakake iki kanggo ngasilake cithakan kanggo nginstal Istio ing bagean sabanjure.
Nginstal Istio
Ngundhuh sumber daya Istio saka release paling anyar(Link penulis asli menyang versi 1.0.5 wis diganti dadi saiki, yaiku 1.0.6 - kira-kira transl.), ekstrak isi menyang direktori siji, sing bakal dakrujuk minangka [istio-resources].
Kanggo gampang ngenali sumber daya Istio, nggawe namespace ing kluster K8s istio-system:
$ kubectl create namespace istio-system
Rampungake instalasi kanthi navigasi menyang direktori [istio-resources] lan mbukak printah:
Printah iki bakal ngasilake komponen utama Istio menyang file istio.yaml. Kita wis ngowahi cithakan standar kanggo awake dhewe kanthi nemtokake paramèter ing ngisor iki:
global.mtls.enabled dipasang ing false(yaiku otentikasi mTLS dipateni - kira-kira)kanggo menakake proses gendakan kita;
tracing.enabled kalebu panjalukan nelusuri nggunakake Jaeger;
kiali.enabled nginstal Kiali menyang kluster kanggo nggambarake layanan lan lalu lintas;
grafana.enabled nginstal Grafana kanggo nggambarake metrik sing diklumpukake.
Gunakake sumber daya sing digawe kanthi printah:
$ kubectl apply -f istio.yaml
Instalasi Istio ing kluster rampung! Enteni nganti kabeh pods ana ing namespace istio-system bakal bisa Running utawa Completedkanthi mbukak printah ing ngisor iki:
$ kubectl get pods -n istio-system
Saiki kita siyap nerusake ing bagean sabanjure, ing ngendi kita bakal mbukak aplikasi kasebut.
Arsitektur aplikasi Analisis Sentimen
Ayo nggunakake conto aplikasi microservice Analisis Sentimen sing digunakake ing sing wis kasebut Artikel Pambuka kanggo Kubernetes. Cukup rumit kanggo nuduhake kemampuan Istio ing praktik.
Aplikasi kasebut kalebu papat layanan mikro:
layanan SA-Frontend, sing nglayani aplikasi ngarep ing Reactjs;
layanan SA-WebApp, sing nglayani pitakon Analisis Sentimen;
layanan SA-Umpan Balik, sing nampa umpan balik saka pangguna babagan akurasi analisis sing ditindakake.
Ing diagram iki, saliyane layanan, kita uga ndeleng Ingress Controller, sing ing Kubernetes ngarahake panjaluk sing mlebu menyang layanan sing cocog. Istio nggunakake konsep sing padha ing Ingress Gateway, sing luwih rinci bakal diterusake.
Bukak aplikasi kanthi proxy saka Istio
Kanggo operasi luwih sing kasebut ing artikel kasebut, clone repositori sampeyan istio-nguwasani. Isine aplikasi lan manifests kanggo Kubernetes lan Istio.
Nglebokake sidecars
Selipan bisa digawe kanthi otomatis utawa kanthi manual. Kanggo nglebokake kontaner sidecar kanthi otomatis, sampeyan kudu nyetel label menyang ruang jeneng istio-injection=enabled, sing ditindakake kanthi printah ing ngisor iki:
Saiki saben pod sing bakal disebarake ing ruang jeneng standar (default) bakal nampa wadhah sidecar. Kanggo verifikasi iki, ayo masang aplikasi tes kanthi pindhah menyang direktori root saka repositori [istio-mastery] lan mbukak printah ing ngisor iki:
$ kubectl apply -f resource-manifests/kube
persistentvolumeclaim/sqlite-pvc created
deployment.extensions/sa-feedback created
service/sa-feedback created
deployment.extensions/sa-frontend created
service/sa-frontend created
deployment.extensions/sa-logic created
service/sa-logic created
deployment.extensions/sa-web-app created
service/sa-web-app created
Sawise nyebarake layanan kasebut, priksa manawa pod duwe rong wadhah (kanthi layanan kasebut dhewe lan sidecar) kanthi nindakake perintah kasebut. kubectl get pods lan priksa manawa ing ngisor kolom READY nilai sing ditemtokake 2/2, nglambangake yen loro kontaner mlaku:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sa-feedback-55f5dc4d9c-c9wfv 2/2 Running 0 12m
sa-frontend-558f8986-hhkj9 2/2 Running 0 12m
sa-logic-568498cb4d-2sjwj 2/2 Running 0 12m
sa-logic-568498cb4d-p4f8c 2/2 Running 0 12m
sa-web-app-599cf47c7c-s7cvd 2/2 Running 0 12m
Secara visual katon kaya iki:
Proksi utusan ing salah sawijining polong
Saiki yen aplikasi wis aktif, kita kudu ngidini lalu lintas mlebu menyang aplikasi kasebut.
Ingress Gateway
Praktek paling apik kanggo entuk iki (ngidini lalu lintas ing kluster) yaiku liwat Ingress Gateway ing Istio, sing dumunung ing "pinggiran" kluster lan ngidini sampeyan ngaktifake fitur Istio kayata nuntun, imbangan muatan, keamanan, lan ngawasi lalu lintas sing mlebu.
Komponen Ingress Gateway lan layanan sing nerusake metu dipasang ing kluster nalika instalasi Istio. Kanggo ngerteni alamat IP eksternal saka layanan, bukak:
$ kubectl get svc -n istio-system -l istio=ingressgateway
NAME TYPE CLUSTER-IP EXTERNAL-IP
istio-ingressgateway LoadBalancer 10.0.132.127 13.93.30.120
Kita bakal terus ngakses aplikasi kanthi nggunakake IP iki (aku bakal ngrujuk minangka EXTERNAL-IP), supaya gampang kita nulis nilai kasebut dadi variabel:
$ EXTERNAL_IP=$(kubectl get svc -n istio-system
-l app=istio-ingressgateway
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
Yen sampeyan nyoba ngakses IP iki liwat browser saiki, sampeyan bakal nampa kesalahan Service Unavailable, amarga kanthi gawan Istio mblokir kabeh lalu lintas mlebunganti Gateway ditetepake.
sumber daya gateway
Gateway punika CRD (Custom Resource Definition) ing Kubernetes, ditetepake sawise nginstal Istio ing kluster lan mbisakake kemampuan kanggo nemtokake bandar, protokol lan sarwa dumadi sing kita pengin ngidini lalu lintas mlebu.
Ing kasus kita, kita pengin ngidini lalu lintas HTTP ing port 80 kanggo kabeh host. Tugas kasebut ditindakake kanthi definisi ing ngisor iki (http-gateway.yaml):
Konfigurasi iki ora mbutuhake panjelasan kajaba pamilih istio: ingressgateway. Kanthi pamilih iki kita bisa nemtokake Ingress Gateway kanggo aplikasi konfigurasi. Ing kasus kita, iki minangka pengontrol Ingress Gateway, sing diinstal kanthi standar ing Istio.
Konfigurasi ditrapake kanthi nelpon printah ing ngisor iki:
$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created
Gerbang saiki ngidini akses menyang port 80, nanging ora ngerti ngendi kanggo nuntun panjalukan. Kanggo iki sampeyan kudu Layanan Virtual.
Sumber daya VirtualService
VirtualService ngandhani Ingress Gateway carane rute panjalukan sing diijini ing kluster.
Panjaluk kanggo aplikasi kita liwat http-gateway kudu dikirim menyang layanan sa-frontend, sa-web-app lan sa-feedback:
Rute sing kudu dikonfigurasi karo VirtualServices
Coba panjaluk sing kudu dikirim menyang SA-Frontend:
Pertandhingan persis ing dalan / kudu dikirim menyang SA-Frontend kanggo njaluk index.html;
Jalur sing diawali /static/* kudu dikirim menyang SA-Frontend kanggo njaluk file statis sing digunakake ing frontend, kayata CSS lan JavaScript;
Path sing cocog karo ekspresi reguler '^.*.(ico|png|jpg)$', kudu dikirim menyang SA-Frontend, amarga Iki minangka gambar sing ditampilake ing kaca kasebut.
Layanan Virtual iki nuduhake panjaluk sing ditindakake http-gateway;
Π destination nemtokake layanan sing panjalukan dikirim.
komentar: Konfigurasi ing ndhuwur disimpen ing file sa-virtualservice-external.yaml, kang uga ngandhut setelan kanggo nuntun kanggo SA-WebApp lan SA-Umpan Balik, nanging wis shortened kene ing artikel kanggo brevity.
Ayo aplikasi VirtualService kanthi nelpon:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created
komentar: Nalika kita aplikasi sumber daya Istio, Kubernetes API Server murub acara sing Istio Control Plane ditampa, lan sawise iku, konfigurasi anyar Applied kanggo saben proxy Utusan pod. Lan pengontrol Ingress Gateway katon minangka Utusan liyane sing dikonfigurasi ing Control Plane. Kabeh iki katon kaya iki ing diagram:
Konfigurasi Istio-IngressGateway kanggo nuntun panyuwunan
Aplikasi Analisis Sentimen saiki kasedhiya ing http://{EXTERNAL-IP}/. Aja kuwatir yen sampeyan entuk status Not Found: Kadhangkala butuh wektu luwih suwe kanggo konfigurasi bisa ditrapake lan cache Utusan kanggo nganyari.
Sadurunge nerusake, muter sethitik karo aplikasi kanggo generate lalu lintas (Anane perlu kanggo kajelasan ing tumindak sakteruse - kira-kira transl.).
Kiali: bisa diamati
Kanggo pindhah menyang antarmuka administratif Kiali, jalanake printah ing ngisor iki:
$ kubectl port-forward
$(kubectl get pod -n istio-system -l app=kiali
-o jsonpath='{.items[0].metadata.name}')
-n istio-system 20001
Metrik sing diklumpukake ing Istio mlebu ing Prometheus lan digambar nganggo Grafana. Kanggo pindhah menyang antarmuka administratif Grafana, jalanake printah ing ngisor iki banjur bukak http://localhost:3000/:
$ kubectl -n istio-system port-forward
$(kubectl -n istio-system get pod -l app=grafana
-o jsonpath={.items[0].metadata.name}) 3000
Kanthi ngeklik ing menu Home ndhuwur kiwa lan milih Dasbor Layanan Istio ing sudhut kiwa ndhuwur, miwiti karo layanan sa-web-appkanggo ndeleng metrik sing diklumpukake:
Sing nunggu kita ing kene yaiku kinerja sing kosong lan mboseni - manajemen ora bakal nyetujoni iki. Ayo nggawe beban cilik kanthi printah ing ngisor iki:
$ while true; do
curl -i http://$EXTERNAL_IP/sentiment
-H "Content-type: application/json"
-d '{"sentence": "I love yogobella"}';
sleep .8; done
Saiki kita duwe grafik sing luwih apik, lan saliyane, alat Prometheus sing apik kanggo ngawasi lan Grafana kanggo visualisasi metrik, sing bakal ngidini kita sinau babagan kinerja, status kesehatan, perbaikan / degradasi layanan sajrone wektu.
Pungkasan, ayo goleki panjaluk panjaluk ing layanan.
Jaeger: nglacak
Kita kudu nelusuri amarga luwih akeh layanan sing kita duwe, luwih angel tekan penyebab kegagalan kasebut. Ayo katon ing kasus prasaja saka gambar ing ngisor iki:
Conto khas saka panyuwunan gagal acak
Panjaluk teka, tiba - apa sebabe? Layanan pisanan? Utawa kapindho? Ana pangecualian ing loro - ayo ndeleng log saben. Sepira kerepe sampeyan kejiret nindakake iki? Pakaryan kita luwih kaya detektif piranti lunak tinimbang pangembang ...
Iki masalah umum ing microservices lan ditanggulangi dening sistem nelusuri mbagekke, kang layanan pass header unik kanggo saben liyane, sawise informasi iki diterusake kanggo sistem nelusuri, ngendi dibandhingake karo data request. Punika ilustrasi:
TraceId digunakake kanggo ngenali panjalukan
Istio nggunakake Jaeger Tracer, sing ngleksanakake kerangka OpenTracing API independen vendor. Sampeyan bisa ngakses antarmuka panganggo Jaeger kanthi printah ing ngisor iki:
$ kubectl port-forward -n istio-system
$(kubectl get pod -n istio-system -l app=jaeger
-o jsonpath='{.items[0].metadata.name}') 16686
Saiki pindhah menyang http://localhost:16686/ lan pilih layanan sa-web-app. Yen layanan ora ditampilake ing menu gulung mudhun, nuduhake / generate kegiatan ing kaca lan nganyari antarmuka. Sawise iku, klik tombol kasebut Golek jejak, sing bakal nuduhake jejak paling anyar - pilih apa wae - informasi rinci babagan kabeh jejak bakal katon:
Jejak iki nuduhake:
Panjaluk kasebut mlebu istio-ingressgateway (iki minangka interaksi pisanan karo salah sawijining layanan, lan ID Trace digawe kanggo panjaluk kasebut), sawise gateway ngirim panjaluk menyang layanan kasebut. sa-web-app.
Ing layanan sa-web-app panyuwunan kasebut dijupuk dening sidecar Utusan, "bocah" digawe ing span (mulane kita ndeleng ing jejak) lan dialihake menyang wadhah. sa-web-app. (span - unit logis saka karya ing Jaeger, kang duwe jeneng, wektu wiwitan operasi lan dadi. Spans bisa nested lan dhawuh. Grafik asiklik sing diarahake saka span mbentuk jejak. - kira-kira. transl.)
Ing kene panyuwunan diproses kanthi cara sentimenAnalisis. Tilak iki wis digawe dening aplikasi, i.e. padha mbutuhake owah-owahan kode.
Wiwit saiki, panjalukan POST diwiwiti ing sa-logika. Tilak ID kudu diterusake saka sa-web-app.
...
komentar: Ing langkah 4, aplikasi kudu ndeleng header sing digawe dening Istio lan ngirim menyang panjalukan sakteruse kaya sing ditampilake ing gambar ing ngisor iki:
(A) Terusake header minangka tanggung jawab Istio; (B) Layanan tanggung jawab kanggo header
Istio nindakake paling akeh amarga ... ngasilake header kanggo panjalukan mlebu, nggawe span anyar ing saben sidecare lan nerusake. Nanging, tanpa nggarap header ing layanan, path panjalukan lengkap bakal ilang.
Iki dudu tugas sing angel, nanging kanggo nyederhanakake implementasine wis ana akeh perpustakaan - contone, ing layanan sa-web-app, klien RestTemplate nerusake header kasebut yen sampeyan mung nambah perpustakaan Jaeger lan OpenTracing menyang dependensi sawijining.
Elinga yen aplikasi Analisis Sentimen nuduhake implementasi ing Flask, Spring, lan ASP.NET Core.
Saiki wis jelas apa sing bakal ditindakake (utawa meh metu saka kothak), ayo deleng rute sing wis disetel, manajemen lalu lintas jaringan, keamanan, lan liya-liyane!