Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Catatan. terjemah: Jaringan perkhidmatan sudah pasti menjadi penyelesaian yang relevan dalam infrastruktur moden untuk aplikasi berikutan seni bina perkhidmatan mikro. Walaupun Istio mungkin berada di bibir ramai jurutera DevOps, ia adalah produk yang agak baru yang, walaupun komprehensif dari segi keupayaan yang disediakannya, mungkin memerlukan banyak masa untuk membiasakan diri. Jurutera Jerman Rinor Maloku, yang bertanggungjawab untuk pengkomputeran awan untuk pelanggan besar di syarikat telekomunikasi Orange Networks, telah menulis satu siri bahan yang menarik yang membolehkan anda menyelami Istio dengan cepat dan mendalam. Dia memulakan ceritanya dengan perkara yang boleh dilakukan oleh Istio secara umum dan cara anda boleh melihatnya dengan mata anda sendiri dengan cepat.

Istio β€” Projek Sumber Terbuka dibangunkan dengan kerjasama pasukan daripada Google, IBM dan Lyft. Ia menyelesaikan kerumitan yang timbul dalam aplikasi berasaskan perkhidmatan mikro, seperti:

  • Pengurusan Trafik: tamat masa, percubaan semula, pengimbangan beban;
  • keselamatan: pengesahan dan kebenaran pengguna akhir;
  • Kebolehlihatan: pengesanan, pemantauan, pembalakan.

Semua ini boleh diselesaikan di peringkat aplikasi, tetapi selepas itu perkhidmatan anda tidak lagi menjadi "mikro". Segala usaha tambahan untuk menyelesaikan masalah ini adalah pembaziran sumber syarikat yang boleh digunakan secara langsung untuk nilai perniagaan. Mari lihat contoh:

Pengurus Projek: Berapa lama masa yang diambil untuk menambah ciri maklum balas?
Pemaju: Dua larian pecut.

MP: Apa?.. Ia hanya CRUD!
R: Melakukan CRUD adalah bahagian yang mudah, tetapi kami masih perlu mengesahkan dan membenarkan pengguna dan perkhidmatan. Oleh kerana rangkaian tidak boleh dipercayai, anda perlu melaksanakan permintaan berulang, serta corak pemutus litar dalam klien. Selain itu, untuk memastikan keseluruhan sistem tidak ranap, anda memerlukan tamat masa dan sekat (untuk butiran lanjut tentang kedua-dua corak yang disebut, lihat kemudian dalam artikel - lebih kurang terjemah), dan untuk mengesan masalah, pemantauan, pengesanan, […]

MP: Oh, mari masukkan saja ciri ini ke dalam perkhidmatan Produk.

Saya rasa idea itu jelas: jumlah langkah dan usaha yang diperlukan untuk menambah satu perkhidmatan adalah sangat besar. Dalam artikel ini, kita akan melihat cara Istio mengalih keluar semua kerumitan yang dinyatakan di atas (yang tidak bertujuan untuk menjadi logik perniagaan) daripada perkhidmatan.

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Nota: Artikel ini menganggap bahawa anda mempunyai pengetahuan tentang Kubernetes. Jika tidak, saya mengesyorkan membaca pengenalan saya kepada Kubernetes dan hanya selepas itu teruskan membaca bahan ini.

Istio idea

Dalam dunia tanpa Istio, satu perkhidmatan membuat permintaan terus kepada yang lain, dan sekiranya berlaku kegagalan, perkhidmatan itu mesti mengendalikannya sendiri: membuat percubaan baharu, menyediakan tamat masa, membuka pemutus litar, dsb.

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Trafik rangkaian dalam Kubernetes

Istio menawarkan penyelesaian khusus, dipisahkan sepenuhnya daripada perkhidmatan dan berfungsi dengan mengganggu komunikasi rangkaian. Dan dengan itu ia melaksanakan:

  • toleransi kesalahan: Berdasarkan kod status dalam respons, ia memahami sama ada permintaan itu gagal dan melaksanakannya semula.
  • Pelancaran kenari: mengubah hala hanya peratusan tetap permintaan ke versi baharu perkhidmatan.
  • Pemantauan dan metrik: Berapa lama masa yang diambil untuk perkhidmatan bertindak balas?
  • Pengesanan dan Kebolehmerhatian: Menambah pengepala khas pada setiap permintaan dan menjejakinya merentasi kluster.
  • keselamatan: Mengambil token JWT, mengesahkan dan membenarkan pengguna.

Ini hanyalah beberapa kemungkinan (benar-benar hanya beberapa!) untuk menarik minat anda. Sekarang mari kita selami butiran teknikal!

Seni bina Istio

Istio memintas semua trafik rangkaian dan menggunakan satu set peraturan padanya, memasukkan proksi pintar dalam bentuk bekas kereta sampingan ke dalam setiap pod. Proksi yang mengaktifkan semua keupayaan membentuk a Satah Data, dan ia boleh dikonfigurasikan secara dinamik menggunakan Pesawat Kawalan.

Satah Data

Proksi yang dimasukkan ke dalam pod membolehkan Istio memenuhi keperluan yang kami perlukan dengan mudah. Sebagai contoh, mari kita semak fungsi cuba semula dan pemutus litar.

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Cara percubaan semula dan pemutus litar dilaksanakan dalam Utusan

Menyusun:

  1. duta (kita bercakap tentang proksi yang terletak dalam bekas kereta sampingan, yang diedarkan sebagai produk berasingan - lebih kurang terjemah.) menghantar permintaan kepada contoh pertama perkhidmatan B dan gagal.
  2. Envoy Sidecar cuba lagi (cuba semula). (1)
  3. Permintaan gagal dan dikembalikan kepada proksi yang memanggilnya.
  4. Ini membuka Pemutus Litar dan memanggil perkhidmatan seterusnya untuk permintaan seterusnya. (2)

Ini bermakna anda tidak perlu menggunakan perpustakaan Cuba Semula yang lain, anda tidak perlu membuat pelaksanaan sendiri Pemutus Litar dan Penemuan Perkhidmatan dalam bahasa pengaturcaraan X, Y atau Z. Semua ini dan banyak lagi tersedia di luar kotak dalam Istio dan tidak memerlukan tidak perubahan dalam kod.

Hebat! Sekarang anda mungkin mahu pergi pelayaran dengan Istio, tetapi anda masih mempunyai beberapa keraguan, soalan terbuka. Jika ini adalah penyelesaian universal untuk semua keadaan dalam kehidupan, maka anda mempunyai kecurigaan semula jadi: selepas semua, semua penyelesaian sedemikian pada hakikatnya ternyata tidak sesuai untuk sebarang kes.

Dan akhirnya anda bertanya: "Adakah ia boleh disesuaikan?"

Sekarang anda sudah bersedia untuk pelayaran laut, mari kita berkenalan dengan Kapal Kawalan.

Pesawat Kawalan

Ia terdiri daripada tiga komponen: Pilot, Mixer ΠΈ Citadel, yang bekerjasama untuk mengkonfigurasi Utusan untuk menghalakan trafik, menguatkuasakan dasar dan mengumpul data telemetri. Secara skematik semuanya kelihatan seperti ini:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Interaksi Satah Kawalan dengan Satah Data

Utusan (iaitu satah data) dikonfigurasikan menggunakan Kubernetes CRD (Definisi Sumber Tersuai) yang ditakrifkan oleh Istio dan bertujuan khusus untuk tujuan ini. Maksudnya kepada anda ialah ia kelihatan seperti sumber lain dalam Kubernetes dengan sintaks yang biasa. Setelah dibuat, sumber ini akan diambil oleh pesawat kawalan dan digunakan untuk Utusan.

Hubungan perkhidmatan kepada Istio

Kami telah menerangkan hubungan Istio dengan perkhidmatan, tetapi bukan sebaliknya: bagaimanakah kaitan perkhidmatan dengan Istio?

Sejujurnya, perkhidmatan menyedari kehadiran Istio sebagaimana ikan adalah air apabila mereka bertanya kepada diri mereka sendiri, "Apakah air itu?"

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Ilustrasi Victoria Dimitrakopoulos: - Bagaimana anda suka air? - Apa itu air?

Oleh itu, anda boleh mengambil kluster yang berfungsi dan selepas menggunakan komponen Istio, perkhidmatan yang terletak di dalamnya akan terus berfungsi, dan selepas mengalih keluar komponen ini, semuanya akan baik semula. Adalah jelas bahawa dalam kes ini anda akan kehilangan keupayaan yang disediakan oleh Istio.

Cukup teori - mari amalkan ilmu ini!

Istio dalam amalan

Istio memerlukan gugusan Kubernetes dengan sekurang-kurangnya 4 vCPU dan 8 GB RAM tersedia. Untuk menyediakan kluster dengan cepat dan mengikut arahan daripada artikel, saya mengesyorkan menggunakan Google Cloud Platform, yang menawarkan pengguna baharu percuma $300.

Selepas membuat kluster dan mengkonfigurasi akses kepada Kubernetes melalui utiliti konsol, anda boleh memasang Istio melalui pengurus pakej Helm.

Pemasangan helm

Pasang klien Helm pada komputer anda, seperti yang diterangkan dalam dokumentasi rasmi. Kami akan menggunakan ini untuk menjana templat untuk memasang Istio dalam bahagian seterusnya.

Memasang Istio

Muat turun sumber Istio daripada keluaran terbaru (pautan pengarang asal ke versi 1.0.5 telah ditukar kepada yang semasa, iaitu 1.0.6 - lebih kurang transl.), ekstrak kandungan ke dalam satu direktori, yang akan saya panggil selepas ini [istio-resources].

Untuk mengenal pasti sumber Istio dengan mudah, cipta ruang nama dalam gugusan K8s istio-system:

$ kubectl create namespace istio-system

Lengkapkan pemasangan dengan pergi ke direktori [istio-resources] dan menjalankan arahan:

$ helm template install/kubernetes/helm/istio 
  --set global.mtls.enabled=false 
  --set tracing.enabled=true 
  --set kiali.enabled=true 
  --set grafana.enabled=true 
  --namespace istio-system > istio.yaml

Perintah ini akan mengeluarkan komponen utama Istio kepada fail istio.yaml. Kami mengubah suai templat standard untuk disesuaikan dengan diri kami sendiri, dengan menyatakan parameter berikut:

  • global.mtls.enabled dipasang di false (iaitu pengesahan mTLS dilumpuhkan - lebih kurang)untuk memudahkan proses temu janji kami;
  • tracing.enabled termasuk pengesanan permintaan menggunakan Jaeger;
  • kiali.enabled memasang Kiali ke dalam kelompok untuk menggambarkan perkhidmatan dan trafik;
  • grafana.enabled memasang Grafana untuk menggambarkan metrik yang dikumpul.

Mari gunakan sumber yang dihasilkan dengan arahan:

$ kubectl apply -f istio.yaml

Pemasangan Istio pada kluster telah selesai! Tunggu sehingga semua pod berada dalam ruang nama istio-system akan dapat Running atau Completeddengan menjalankan arahan di bawah:

$ kubectl get pods -n istio-system

Kini kami bersedia untuk meneruskan di bahagian seterusnya, di mana kami akan menyediakan dan menjalankan aplikasi.

Seni bina aplikasi Analisis Sentimen

Mari kita gunakan contoh aplikasi perkhidmatan mikro Analisis Sentimen yang digunakan dalam yang telah disebutkan Artikel pengenalan kepada Kubernetes. Ia cukup rumit untuk menunjukkan keupayaan Istio dalam amalan.

Aplikasi ini terdiri daripada empat perkhidmatan mikro:

  1. Perkhidmatan SA-Frontend, yang menyediakan bahagian hadapan aplikasi Reactjs;
  2. Perkhidmatan SA-WebApp, yang menyediakan pertanyaan Analisis Sentimen;
  3. Perkhidmatan SA-Logik, yang berfungsi sendiri analisis sentimen;
  4. Perkhidmatan SA-Maklum Balas, yang menerima maklum balas daripada pengguna tentang ketepatan analisis.

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Dalam rajah ini, sebagai tambahan kepada perkhidmatan, kami juga melihat Pengawal Ingress, yang dalam Kubernetes mengarahkan permintaan masuk kepada perkhidmatan yang sesuai. Istio menggunakan konsep serupa dalam Gerbang Ingressnya, butiran lanjut akan menyusul.

Menjalankan aplikasi dengan proksi daripada Istio

Untuk operasi selanjutnya yang disebut dalam artikel, klon repositori anda istio-penguasaan. Ia mengandungi aplikasi dan manifes untuk Kubernetes dan Istio.

Memasukkan sidecars

Penyisipan boleh dilakukan secara automatik atau dengan tangan. Untuk memasukkan bekas kereta sisi secara automatik, anda perlu menetapkan label pada ruang nama istio-injection=enabled, yang dilakukan dengan arahan berikut:

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

Kini setiap pod yang akan digunakan dalam ruang nama lalai (default) akan menerima bekas kereta sampingannya. Untuk mengesahkan ini, mari gunakan aplikasi ujian dengan pergi ke direktori akar repositori [istio-mastery] dan jalankan arahan berikut:

$ 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

Setelah menggunakan perkhidmatan, mari semak sama ada pod mempunyai dua bekas (dengan perkhidmatan itu sendiri dan kereta sampingannya) dengan menjalankan arahan kubectl get pods dan memastikan bahawa di bawah lajur READY nilai yang ditentukan 2/2, melambangkan bahawa kedua-dua bekas sedang berjalan:

$ 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 ia kelihatan seperti ini:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Proksi utusan dalam salah satu pod

Memandangkan aplikasi sedang berjalan dan berjalan, kami perlu membenarkan trafik masuk masuk ke dalam aplikasi.

Gerbang Ingress

Amalan terbaik untuk mencapai ini (benarkan trafik dalam kelompok) adalah melalui Gerbang Ingress dalam Istio, yang terletak di "tepi" kluster dan membolehkan anda mendayakan ciri Istio seperti penghalaan, pengimbangan beban, keselamatan dan pemantauan untuk trafik masuk.

Komponen Ingress Gateway dan perkhidmatan yang memajukannya secara luaran telah dipasang dalam kelompok semasa pemasangan Istio. Untuk mengetahui alamat IP luaran perkhidmatan, jalankan:

$ 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

Kami akan terus mengakses aplikasi menggunakan IP ini (saya akan merujuknya sebagai EXTERNAL-IP), jadi untuk kemudahan kami akan menulis nilai ke dalam pembolehubah:

$ EXTERNAL_IP=$(kubectl get svc -n istio-system 
  -l app=istio-ingressgateway 
  -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')

Jika anda cuba mengakses IP ini melalui penyemak imbas sekarang, anda akan menerima ralat Perkhidmatan Tidak Tersedia, kerana secara lalai Istio menyekat semua trafik masuk, Gateway masih belum ditentukan.

Sumber gerbang

Gateway ialah CRD (Definisi Sumber Tersuai) dalam Kubernetes, ditakrifkan selepas memasang Istio dalam kluster dan membolehkan keupayaan untuk menentukan port, protokol dan hos yang kami ingin benarkan trafik masuk.

Dalam kes kami, kami mahu membenarkan trafik HTTP pada port 80 untuk semua hos. Tugas dilaksanakan mengikut definisi berikut (http-gateway.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
- "*"

Konfigurasi ini tidak memerlukan penjelasan kecuali untuk pemilih istio: ingressgateway. Dengan pemilih ini, kami boleh menentukan Gerbang Ingress untuk menggunakan konfigurasi. Dalam kes kami, ini ialah pengawal Ingress Gateway, yang dipasang secara lalai dalam Istio.

Konfigurasi digunakan dengan memanggil arahan berikut:

$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created

Gerbang itu kini membenarkan akses ke port 80, tetapi tidak tahu ke mana hendak menghalakan permintaan. Untuk ini anda perlukan Perkhidmatan Maya.

Sumber Perkhidmatan Maya

Perkhidmatan Maya memberitahu Gerbang Ingress cara menghalakan permintaan yang dibenarkan dalam kluster.

Permintaan kepada aplikasi kami yang datang melalui http-gateway mesti dihantar ke sa-frontend, sa-web-app dan perkhidmatan maklum balas selamat:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Laluan yang perlu dikonfigurasikan dengan VirtualServices

Mari lihat permintaan yang harus dihantar kepada SA-Frontend:

  • Perlawanan tepat sepanjang perjalanan / hendaklah dihantar ke SA-Frontend untuk mendapatkan index.html;
  • Laluan awalan /static/* mesti dihantar ke SA-Frontend untuk menerima fail statik yang digunakan dalam bahagian hadapan, seperti CSS dan JavaScript;
  • Laluan dipadankan dengan ungkapan biasa '^.*.(ico|png|jpg)$', mesti dihantar ke SA-Frontend, kerana Ini adalah gambar-gambar yang dipaparkan pada halaman.

Pelaksanaan dicapai dengan konfigurasi berikut (sa-virtualservice-external.yaml):

kind: VirtualService
metadata:
  name: sa-external-services
spec:
  hosts:
  - "*"
  gateways:
  - http-gateway                      # 1
  http:
  - match:
    - uri:
        exact: /
    - uri:
        exact: /callback
    - uri:
        prefix: /static
    - uri:
        regex: '^.*.(ico|png|jpg)

Π’Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

  1. Π­Ρ‚ΠΎΡ‚ VirtualService относится ΠΊ запросам, приходящим Ρ‡Π΅Ρ€Π΅Π· http-gateway;
  2. Π’ destination опрСдСляСтся сСрвис, ΠΊΡƒΠ΄Π° ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ запросы.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π²Ρ‹ΡˆΠ΅ хранится Π² Ρ„Π°ΠΉΠ»Π΅ sa-virtualservice-external.yaml, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ содСрТит настройки для ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² SA-WebApp ΠΈ SA-Feedback, Π½ΠΎ Π±Ρ‹Π» сокращён здСсь Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ для лаконичности. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ VirtualService Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ:
$ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
virtualservice.networking.istio.io/sa-external-services created

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Когда ΠΌΡ‹ примСняСм рСсурсы Istio, Kubernetes API Server создаёт событиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Istio Control Plane, ΠΈ ΡƒΠΆΠ΅ послС этого новая конфигурация примСняСтся ΠΊ прокси-сСрвСрам Envoy ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ pod'Π°. А ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Ingress Gateway прСдставляСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ Envoy, сконфигурированным Π² Control Plane. Всё это Π½Π° схСмС выглядит Ρ‚Π°ΠΊ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Istio-IngressGateway для ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ запросов

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Sentiment Analysis стало доступным ΠΏΠΎ http://{EXTERNAL-IP}/. НС ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅, Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ статус Not Found: ΠΈΠ½ΠΎΠ³Π΄Π° трСбуСтся Ρ‡ΡƒΡ‚ΡŒ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ конфигурация вступила Π² силу ΠΈ кэши Envoy обновились.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ, ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ (Π΅Π³ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для наглядности Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… дСйствиях β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².).

Kialiβ€Š: Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΠΎΡΡ‚ΡŒ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² административный интСрфСйс Kiali, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ kubectl port-forward 
    $(kubectl get pod -n istio-system -l app=kiali 
    -o jsonpath='{.items[0].metadata.name}') 
    -n istio-system 20001

… ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ http://localhost:20001/, залогинившись ΠΏΠΎΠ΄ admin/admin. Π—Π΄Π΅ΡΡŒ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… возмоТностСй, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Istio, Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвисов ΠΏΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, собранной ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ сСтСвых запросов, получСния ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° вопросы Β«ΠšΡ‚ΠΎ ΠΊ ΠΊΠΎΠΌΡƒ обращаСтся?Β», Β«Π£ ΠΊΠ°ΠΊΠΎΠΉ вСрсии сСрвиса Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ сбои?Β» ΠΈ Ρ‚.ΠΏ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ возмоТности Kiali ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС β€” ΠΊ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ с Grafana.

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1

Grafana: визуализация ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ

Π‘ΠΎΠ±Ρ€Π°Π½Π½Ρ‹Π΅ Π² Istio ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Prometheus ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с Grafana. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² административный интСрфСйс Grafana, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π½ΠΈΠΆΠ΅, послС Ρ‡Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ 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

ΠšΠ»ΠΈΠΊΠ½ΡƒΠ² Π½Π° мСню Home слСва свСрху ΠΈ Π²Ρ‹Π±Ρ€Π°Π² Istio Service Dashboard Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с сСрвиса sa-web-app, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° собранныС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1

Π—Π΄Π΅ΡΡŒ нас ΠΆΠ΄Ρ‘Ρ‚ пустоС ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ скучноС прСдставлСниС β€” руководство Π½ΠΈΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠ΅ Π½Π΅ ΠΎΠ΄ΠΎΠ±Ρ€ΠΈΡ‚. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΆΠ΅ создадим Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

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

Π’ΠΎΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ симпатичныС Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Π° Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈΠΌ β€” Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ инструмСнты Prometheus для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ Grafana для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ, Ρ‡Ρ‚ΠΎ позволят Π½Π°ΠΌ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, состоянии Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ, ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΡ…/Π΄Π΅Π³Ρ€Π°Π΄Π°Ρ†ΠΈΠΈ Π² Ρ€Π°Π±ΠΎΡ‚Π΅ сСрвисов Π½Π° протяТСнии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

НаконСц, посмотрим Π½Π° трассировку запросов Π² сСрвисах.

Jaegerβ€Š: трассировка

Врассировка Π½Π°ΠΌ потрСбуСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‡Π΅ΠΌ большС Ρƒ нас сСрвисов, Ρ‚Π΅ΠΌ слоТнСС Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ сбоя. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° простой случай ΠΈΠ· ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½ΠΈΠΆΠ΅:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
Π’ΠΈΠΏΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ случайного Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ запроса

Запрос ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚, ΠΏΠ°Π΄Π°Π΅Ρ‚ β€” Π² Ρ‡Ρ‘ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°? ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ сСрвис? Или Π²Ρ‚ΠΎΡ€ΠΎΠΉ? Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Π² ΠΎΠ±ΠΎΠΈΡ… β€” Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π»ΠΎΠ³ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ. Как часто Π²Ρ‹ Π»ΠΎΠ²ΠΈΠ»ΠΈ сСбя Π·Π° Ρ‚Π°ΠΊΠΈΠΌ занятиСм? Наша Ρ€Π°Π±ΠΎΡ‚Π° большС ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, Π° Π½Π΅ разработчиков…

Π­Ρ‚ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространённая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² микросСрвисах ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ½Π° распрСдСлёнными систСмами трассировки, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сСрвисы ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, послС Ρ‡Π΅Π³ΠΎ эта информация пСрСнаправляСтся Π² систСму трассировки, Π³Π΄Π΅ ΠΎΠ½Π° сопоставляСтся с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ запроса. Π’ΠΎΡ‚ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
Для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ запроса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ TraceId

Π’ Istio ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Jaeger Tracer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ нСзависимый ΠΎΡ‚ Π²Π΅Π½Π΄ΠΎΡ€ΠΎΠ² Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ OpenTracing API. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйсу Jaeger ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

$ kubectl port-forward -n istio-system 
    $(kubectl get pod -n istio-system -l app=jaeger 
    -o jsonpath='{.items[0].metadata.name}') 16686

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° http://localhost:16686/ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ сСрвис sa-web-app. Если сСрвис Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ мСню β€” проявитС/сгСнСрируйтС Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π½Π° страницС ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ интСрфСйс. ПослС этого Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Find Traces, которая ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ самыС послСдниС трСйсы β€” Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ любой β€” покаТСтся дСтализированная информация ΠΏΠΎ всСм трСйсам:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1

Π­Ρ‚ΠΎΡ‚ трСйс ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚:

  1. Запрос ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² istio-ingressgateway (это ΠΏΠ΅Ρ€Π²ΠΎΠ΅ взаимодСйствиС с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· сСрвисов, ΠΈ для запроса гСнСрируСтся Trace ID), послС Ρ‡Π΅Π³ΠΎ шлюз направляСт запрос Π² сСрвис sa-web-app.
  2. Π’ сСрвисС sa-web-app запрос подхватываСтся Envoy sidecar'ΠΎΠΌ, создаётся Β«Ρ€Π΅Π±Ρ‘Π½ΠΎΠΊΒ» Π² span'Π΅ (поэтому ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π² трСйсах) ΠΈ пСрСнаправляСтся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ sa-web-app. (Span β€” логичСская Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Jaeger, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, врСмя Π½Π°Ρ‡Π°Π»ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ Π΅Ρ‘ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Span'Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ упорядочСнными. ΠžΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ацикличСский Π³Ρ€Π°Ρ„ ΠΈΠ· span'ΠΎΠ² ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ trace. β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².)
  3. Π—Π΄Π΅ΡΡŒ запрос обрабатываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ sentimentAnalysis. Π­Ρ‚ΠΈ трСйсы ΡƒΠΆΠ΅ сгСнСрированы ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚.Π΅. для Π½ΠΈΡ… ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ измСнСния Π² ΠΊΠΎΠ΄Π΅.
  4. Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° инициируСтся POST-запрос Π² sa-logic. Trace ID Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Ρ€ΠΎΡˆΠ΅Π½ ΠΈΠ· sa-web-app.
  5. …

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: На 4 шагС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, сгСнСрированныС Istio, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ запросы, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π½ΠΈΠΆΠ΅:

Назад ΠΊ микросСрвисам вмСстС с Istio. Π§Π°ΡΡ‚ΡŒ 1
(A) Π—Π° проброс Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Istio; (B) Π—Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ сСрвисы

Istio Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‚.ΠΊ. Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ для входящих запросов, создаёт Π½ΠΎΠ²Ρ‹Π΅ span'Ρ‹ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ sidecare'Π΅ ΠΈ пробрасываСт ΠΈΡ…. Однако Π±Π΅Π· Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвисов ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ трассировки запроса Π±ΡƒΠ΄Π΅Ρ‚ утСрян.

НСобходимо ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ (ΠΏΡ€ΠΎΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ:

x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context

Π­Ρ‚ΠΎ нСслоТная Π·Π°Π΄Π°Ρ‡Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ для упрощСния Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ сущСствуСт мноТСство Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² сСрвисС sa-web-app ΠΊΠ»ΠΈΠ΅Π½Ρ‚ RestTemplate пробрасываСт эти Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Ссли просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Jaeger ΠΈ OpenTracing Π² Π΅Π³ΠΎ зависимости.

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Sentiment Analysis дСмонстрируСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Flask, Spring ΠΈ ASP.NET Core.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° стало ясно, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ (ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ»), рассмотрим вопросы Ρ‚ΠΎΠ½ΠΊΠΎ настраиваСмой ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, управлСния сСтСвым Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ, бСзопасности ΠΈ Ρ‚.ΠΏ.!

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠΎΠ± этом Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΏΠΎ Istio ΠΎΡ‚ Rinor Maloku, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π² нашСм Π±Π»ΠΎΠ³Π΅ Π² блиТайшСС врСмя. UPDATE (14 ΠΌΠ°Ρ€Ρ‚Π°): Вторая Ρ‡Π°ΡΡ‚ΡŒ ΡƒΠΆΠ΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π°.

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

route:
- destination:
host: sa-frontend # 2
port:
number: 80

perkara penting:

  1. Perkhidmatan Maya ini merujuk kepada permintaan yang datang http-gerbang;
  2. Π’ destination Perkhidmatan yang permintaan dihantar ditentukan.

Nota: Konfigurasi di atas disimpan dalam fail sa-virtualservice-external.yaml, yang juga mengandungi tetapan untuk penghalaan dalam SA-WebApp dan SA-Maklum Balas, tetapi telah dipendekkan di sini dalam artikel untuk ringkas.

Mari gunakan Perkhidmatan Maya dengan menghubungi:


Nota: Apabila kami menggunakan sumber Istio, Pelayan API Kubernetes mencipta acara yang diterima oleh Satah Kawalan Istio, dan selepas itu konfigurasi baharu digunakan pada setiap proksi Utusan pod. Dan pengawal Ingress Gateway nampaknya adalah Utusan lain yang dikonfigurasikan dalam Pesawat Kawalan. Semua ini kelihatan seperti ini dalam rajah:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Konfigurasi Istio-IngressGateway untuk penghalaan permintaan

Aplikasi Analisis Sentimen kini tersedia di http://{EXTERNAL-IP}/. Jangan risau jika anda mendapat status Tidak Ditemui: Kadangkala ia mengambil masa lebih lama untuk konfigurasi berkuat kuasa dan cache Envoy untuk dikemas kini.

Sebelum meneruskan, bermain dengan apl itu sedikit untuk menjana trafik. (kehadirannya adalah perlu untuk kejelasan dalam tindakan seterusnya - lebih kurang transl.).

Kiali: kebolehmerhatian

Untuk pergi ke antara muka pentadbiran Kiali, jalankan arahan berikut:


... dan buka http://localhost:20001/, log masuk sebagai pentadbir/pentadbir. Di sini anda akan menemui banyak ciri berguna, contohnya, untuk menyemak konfigurasi komponen Istio, memvisualisasikan perkhidmatan menggunakan maklumat yang dikumpul daripada memintas permintaan rangkaian, mendapatkan jawapan kepada soalan "Siapa yang menghubungi siapa?", "Versi perkhidmatan yang manakah mengalami. kegagalan?” dan sebagainya. Secara umum, terokai keupayaan Kiali sebelum beralih kepada menggambarkan metrik dengan Grafana.

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Grafana: visualisasi metrik

Metrik yang dikumpul di Istio pergi ke Prometheus dan divisualisasikan dengan Grafana. Untuk pergi ke antara muka pentadbiran Grafana, jalankan arahan di bawah dan kemudian buka http://localhost:3000/:


Mengklik pada menu Laman Utama kiri atas dan memilih Papan Pemuka Perkhidmatan Istio di penjuru kiri sebelah atas, mulakan dengan perkhidmatan sa-web-appuntuk melihat metrik yang dikumpul:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Apa yang menanti kami di sini ialah prestasi yang kosong dan membosankan - pihak pengurusan tidak akan sekali-kali bersetuju dengan perkara ini. Mari buat beban kecil dengan arahan berikut:


Kini kami mempunyai graf yang lebih bagus, dan sebagai tambahan kepada mereka, alat Prometheus yang hebat untuk pemantauan dan Grafana untuk memvisualisasikan metrik yang akan membolehkan kami mempelajari tentang prestasi, kesihatan, peningkatan / kemerosotan dalam perkhidmatan dari semasa ke semasa.

Akhir sekali, mari kita lihat permintaan pengesanan dalam perkhidmatan.

Jaeger: mengesan

Kami memerlukan pengesanan kerana lebih banyak perkhidmatan yang kami ada, lebih sukar untuk mendapatkan punca kegagalan. Mari lihat kes mudah dari gambar di bawah:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
Contoh biasa permintaan gagal rawak

Permintaan datang, jatuh - apa sebabnya? Perkhidmatan pertama? Atau yang kedua? Terdapat pengecualian dalam kedua-duanya - mari kita lihat log setiap satu. Berapa kerapkah anda mendapati diri anda melakukan ini? Kerja kami lebih seperti pengesan perisian berbanding pembangun...

Ini adalah masalah biasa dalam perkhidmatan mikro dan diselesaikan dengan sistem pengesanan teragih, di mana perkhidmatan menghantar pengepala unik antara satu sama lain, selepas itu maklumat ini dimajukan ke sistem pengesanan, di mana ia dibandingkan dengan data permintaan. Berikut adalah ilustrasi:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
TraceId digunakan untuk mengenal pasti permintaan

Istio menggunakan Jaeger Tracer, yang melaksanakan rangka kerja API OpenTracing bebas vendor. Anda boleh mengakses antara muka pengguna Jaeger dengan arahan berikut:


Sekarang pergi ke http://localhost:16686/ dan pilih perkhidmatan sa-web-app. Jika perkhidmatan tidak ditunjukkan dalam menu lungsur, tunjukkan/jana aktiviti pada halaman dan kemas kini antara muka. Selepas itu, klik pada butang Cari Jejak, yang akan menunjukkan jejak terkini - pilih mana-mana - maklumat terperinci tentang semua jejak akan muncul:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1

Jejak ini menunjukkan:

  1. Permintaan itu masuk istio-ingressgateway (ini ialah interaksi pertama dengan salah satu perkhidmatan dan ID Trace dijana untuk permintaan), selepas itu get laluan menghantar permintaan kepada perkhidmatan sa-web-app.
  2. Dalam perkhidmatan sa-web-app permintaan itu diambil oleh sidecar Utusan, "kanak-kanak" dibuat dalam rentang (itu sebabnya kita melihatnya dalam jejak) dan dihalakan semula ke bekas sa-web-app. (Span - unit kerja logik di Jaeger, yang mempunyai nama, masa mula operasi dan tempohnya. Span boleh bersarang dan dipesan. Graf asiklik berarah bagi rentang membentuk surih. - lebih kurang terjemah.)
  3. Di sini permintaan diproses dengan kaedah sentimenAnalisis. Jejak ini sudah dijana oleh aplikasi, i.e. mereka memerlukan perubahan kod.
  4. Mulai saat ini, permintaan POST dimulakan dalam sa-logik. ID jejak mesti dimajukan daripada sa-web-app.
  5. ...

Nota: Dalam langkah 4, aplikasi harus melihat pengepala yang dijana oleh Istio dan menyerahkannya kepada permintaan seterusnya seperti yang ditunjukkan dalam imej di bawah:

Kembali ke perkhidmatan mikro dengan Istio. Bahagian 1
(A) Istio bertanggungjawab untuk memajukan pengepala; (B) Perkhidmatan bertanggungjawab untuk pengepala

Istio melakukan kebanyakan kerja kerana... menjana pengepala untuk permintaan masuk, mencipta rentang baharu dalam setiap penjagaan sisi dan memajukannya. Walau bagaimanapun, tanpa menggunakan pengepala dalam perkhidmatan, laluan jejak permintaan penuh akan hilang.

Tajuk berikut mesti diambil kira:


Ini bukan tugas yang sukar, tetapi untuk memudahkan pelaksanaannya sudah ada banyak perpustakaan - contohnya, dalam perkhidmatan sa-web-app, klien RestTemplate memajukan pengepala ini jika anda hanya menambah perpustakaan Jaeger dan OpenTracing ke ketagihannya.

Ambil perhatian bahawa aplikasi Analisis Sentimen menunjukkan pelaksanaan dalam Flask, Spring dan ASP.NET Core.

Memandangkan sudah jelas apa yang kita dapat daripada kotak (atau hampir keluar dari kotak), mari kita lihat pada penghalaan yang diperhalusi, pengurusan trafik rangkaian, keselamatan, dsb.!

Catatan. terjemah: Baca tentang ini di bahagian seterusnya bahan di Istio daripada Rinor Maloku, terjemahannya akan menyusul di blog kami dalam masa terdekat. UPDATE (14 Mac): Bahagian kedua telah pun diterbitkan.

PS daripada penterjemah

Baca juga di blog kami:

Sumber: www.habr.com