Kembali ke layanan mikro dengan Istio. Bagian 1

Kembali ke layanan mikro dengan Istio. Bagian 1

Catatan. terjemahan: Jejaring layanan telah menjadi topik hangat dalam infrastruktur saat ini untuk aplikasi yang mengikuti arsitektur layanan mikro. Meskipun Istio mungkin menarik perhatian banyak insinyur DevOps, ini adalah produk yang cukup baru, meskipun kompleks dalam hal fitur yang disediakannya, namun memerlukan banyak waktu untuk mengenalnya. Insinyur Jerman Rinor Maloku, yang bertanggung jawab atas komputasi awan untuk klien besar di perusahaan telekomunikasi Orange Networks, telah menulis serangkaian materi luar biasa yang memungkinkan Anda menyelami Istio dengan cepat dan mendalam. Dia memulai ceritanya dengan apa yang dapat dilakukan Istio dan bagaimana Anda dapat dengan cepat melihatnya dengan mata kepala sendiri.

Istio β€” Proyek Sumber Terbuka, dikembangkan bekerja sama dengan tim dari Google, IBM, dan Lyft. Ini memecahkan kompleksitas yang muncul dalam aplikasi berbasis layanan mikro, misalnya seperti:

  • manajemen lalu lintas: batas waktu, percobaan ulang, penyeimbangan beban;
  • keamanan: otentikasi dan otorisasi pengguna akhir;
  • kemampuan observasi: penelusuran, pemantauan, pencatatan.

Semuanya bisa diselesaikan di level aplikasi, namun setelah itu layanan Anda tidak lagi bersifat "mikro". Segala upaya ekstra untuk mengatasi masalah ini merupakan pemborosan sumber daya perusahaan yang sebenarnya dapat digunakan secara langsung untuk nilai bisnis. Perhatikan sebuah contoh:

Manajer Proyek: Berapa lama waktu yang dibutuhkan untuk menambahkan fitur umpan balik?
Pengembang: Dua sprint.

MP: Apa?.. Cuma CRUD!
R: Melakukan CRUD adalah bagian tugas yang mudah, namun kita masih perlu mengautentikasi dan mengotorisasi pengguna dan layanan. Karena jaringan tidak dapat diandalkan, Anda juga perlu menerapkan permintaan berulang pola pemutus sirkuit pada klien. Juga, untuk memastikan bahwa seluruh sistem tidak crash, timeout dan sekat (Untuk informasi lebih lanjut tentang kedua pola yang disebutkan, lihat artikel selanjutnya - kira-kira terjemahan), dan untuk mendeteksi masalah, memantau, menelusuri, […]

MP: Oh, kalau begitu, mari kita masukkan fitur ini ke dalam layanan Produk.

Saya pikir idenya jelas: jumlah langkah dan upaya yang diperlukan untuk menambahkan satu layanan sangatlah besar. Pada artikel ini, kita akan melihat bagaimana Istio menghilangkan semua kompleksitas yang disebutkan di atas (tidak ditargetkan oleh logika bisnis) dari layanan.

Kembali ke layanan mikro dengan Istio. Bagian 1

Catatan: Artikel ini mengasumsikan bahwa Anda memiliki pengetahuan tentang Kubernetes. Jika tidak, saya sarankan membaca perkenalan saya dengan Kubernetes dan baru kemudian melanjutkan membaca materi ini.

Ide istio

Di dunia tanpa Istio, satu layanan membuat permintaan langsung ke layanan lain, dan jika terjadi kegagalan, layanan harus menanganinya sendiri: melakukan upaya baru, memberikan waktu tunggu, membuka pemutus sirkuit, dll.

Kembali ke layanan mikro dengan Istio. Bagian 1
Lalu lintas jaringan di Kubernetes

Istio, di sisi lain, menawarkan solusi khusus yang sepenuhnya terpisah dari layanan dan fungsi dengan mengganggu interaksi jaringan. Dan dengan demikian ia mengimplementasikan:

  • toleransi kesalahan: berdasarkan kode status dalam respons, ia memahami jika permintaan gagal dan mengirimkannya kembali.
  • Peluncuran Canary: hanya mengalihkan persentase permintaan yang tetap ke versi layanan yang baru.
  • Pemantauan dan Metrik: berapa lama waktu yang dibutuhkan hingga layanan merespons?
  • Penelusuran dan observasi: Menambahkan header khusus ke setiap permintaan dan melacaknya di seluruh cluster.
  • keamanan: Mengambil token JWT, mengautentikasi dan memberi otorisasi kepada pengguna.

Ini hanyalah beberapa kemungkinan (sebenarnya hanya beberapa!) yang membuat Anda penasaran. Sekarang mari selami detail teknisnya!

Arsitektur

Istio mencegat semua lalu lintas jaringan dan menerapkan serangkaian aturan padanya, memasukkan proxy cerdas dalam bentuk wadah sespan ke dalam setiap pod. Proxy yang mengaktifkan semua kemungkinan membentuk a Pesawat Data, dan dapat disesuaikan secara dinamis Kontrol Pesawat.

Pesawat Data

Proxy yang dimasukkan ke dalam pod memungkinkan Istio dengan mudah mencapai persyaratan yang kita butuhkan. Misalnya, mari kita periksa fungsi percobaan ulang dan pemutus sirkuit.

Kembali ke layanan mikro dengan Istio. Bagian 1
Bagaimana percobaan ulang dan pemutusan sirkuit diterapkan di Envoy

Untuk meringkas:

  1. Utusan (kita berbicara tentang proxy yang terletak di wadah sespan, yang didistribusikan dan bagaimana caranya produk terpisah - kira-kira. terjemahkan) mengirimkan permintaan ke instance pertama layanan B dan gagal.
  2. Utusan Sidecar mencoba lagi (mencoba kembali). (1)
  3. Permintaan yang gagal dikembalikan ke proksi yang memanggilnya.
  4. Ini membuka Pemutus Sirkuit dan memanggil layanan berikutnya untuk permintaan berikutnya. (2)

Ini berarti Anda tidak perlu menggunakan perpustakaan Retry berikutnya, Anda tidak perlu membuat implementasi Circuit Breaking dan Service Discovery Anda sendiri dalam bahasa pemrograman X, Y atau Z. Semua ini dan lebih banyak lagi tersedia dari kotak di Istio dan tidak memerlukan tidak perubahan kode.

Besar! Sekarang Anda mungkin ingin melakukan perjalanan dengan Istio, tetapi masih ada keraguan, pertanyaan terbuka. Jika ini adalah solusi universal untuk semua kesempatan dalam hidup, maka Anda memiliki kecurigaan yang sah: bagaimanapun juga, semua solusi tersebut sebenarnya tidak cocok untuk kasus apa pun.

Dan akhirnya Anda bertanya: β€œApakah ini dapat disesuaikan?”

Sekarang Anda siap untuk perjalanan laut - dan mari berkenalan dengan Control Plane.

Kontrol Pesawat

Ini terdiri dari tiga komponen: Pilot, Pengaduk ΠΈ Benteng, yang bersama-sama mengonfigurasi Utusan untuk merutekan lalu lintas, menerapkan kebijakan, dan mengumpulkan data telemetri. Secara skematis, semuanya terlihat seperti ini:

Kembali ke layanan mikro dengan Istio. Bagian 1
Interaksi Control Plane dengan Data Plane

Utusan (yaitu bidang data) dikonfigurasi dengan CRD Kubernetes (Definisi Sumber Daya Kustom) yang ditentukan oleh Istio dan dirancang khusus untuk tujuan ini. Artinya bagi Anda adalah bahwa mereka hanyalah sumber daya lain di Kubernetes dengan sintaksis yang familier. Setelah dibuat, sumber daya ini akan diambil oleh bidang kendali dan diterapkan ke Utusan.

Hubungan layanan dengan Istio

Kami telah menjelaskan hubungan Istio dengan layanan, namun tidak sebaliknya: bagaimana hubungan layanan dengan Istio?

Jujur saja, pihak jasa mengetahui keberadaan Istio seperti halnya ikan mengetahui tentang air, ketika mereka bertanya pada diri sendiri: β€œApa itu air?”.

Kembali ke layanan mikro dengan Istio. Bagian 1
Ilustrasi Victoria Dimitrakopoulos: Bagaimana kamu menyukai air? - Apa sebenarnya air itu?

Dengan demikian, Anda dapat mengambil cluster yang berfungsi dan setelah menerapkan komponen Istio, layanan di dalamnya akan terus berfungsi, dan setelah menghapus komponen ini, semuanya akan baik-baik saja kembali. Jelas dalam hal ini Anda akan kehilangan peluang yang diberikan oleh Istio.

Cukup teorinya - mari kita praktikkan pengetahuan ini!

Istio dalam praktek

Istio memerlukan cluster Kubernetes dengan setidaknya 4 vCPU dan RAM 8 GB. Untuk meningkatkan cluster dengan cepat dan mengikuti petunjuk dari artikel, saya sarankan menggunakan Google Cloud Platform, yang menawarkan pengguna baru gratis $300.

Setelah membuat cluster dan mengatur akses ke Kubernetes melalui utilitas konsol, Anda dapat menginstal Istio melalui manajer paket Helm.

Pemasangan Helm

Instal klien Helm di komputer Anda seperti yang dijelaskan di dokumentasi resmi. Kami akan menggunakannya untuk menghasilkan template untuk menginstal Istio di bagian selanjutnya.

Instalasi

Unduh sumber daya Istio dari rilis terbaru (tautan penulis asli ke versi 1.0.5 telah diubah ke versi sekarang, yaitu 1.0.6 - kira-kira terjemahan), ekstrak isinya ke satu direktori, yang akan saya sebut sebagai [istio-resources].

Untuk memudahkan identifikasi sumber daya Istio, buat namespace di kluster K8s istio-system:

$ kubectl create namespace istio-system

Selesaikan instalasi dengan menavigasi ke direktori [istio-resources] dan menjalankan perintah:

$ 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 menampilkan komponen kunci Istio ke sebuah file istio.yaml. Kami telah memodifikasi template standar untuk diri kami sendiri dengan menentukan parameter berikut:

  • global.mtls.enabled dipasang di false (yaitu otentikasi mTLS dinonaktifkan - kira-kira terjemahan)untuk menyederhanakan proses kencan kami;
  • tracing.enabled mengaktifkan penelusuran permintaan dengan Jaeger;
  • kiali.enabled menginstal Kiali ke dalam cluster untuk memvisualisasikan layanan dan lalu lintas;
  • grafana.enabled menginstal Grafana untuk memvisualisasikan metrik yang dikumpulkan.

Terapkan sumber daya yang dihasilkan dengan perintah:

$ kubectl apply -f istio.yaml

Instalasi Istio di cluster selesai! Tunggu hingga semua pod di namespace istio-system akan dapat Running ΠΈΠ»ΠΈ Completeddengan menjalankan perintah di bawah ini:

$ kubectl get pods -n istio-system

Kami sekarang siap untuk melanjutkan ke bagian berikutnya, di mana kami akan menaikkan dan menjalankan aplikasi.

Arsitektur Aplikasi Analisis Sentimen

Mari kita gunakan contoh aplikasi layanan mikro Analisis Sentimen yang digunakan di atas Artikel pengantar Kubernetes. Ini cukup kompleks untuk menunjukkan kemungkinan Istio dalam praktiknya.

Aplikasi ini terdiri dari empat layanan mikro:

  1. Layanan SA-Depan, yang melayani aplikasi front-end di Reactjs;
  2. Layanan Aplikasi Web SA, yang melayani kueri Analisis Sentimen;
  3. Layanan Logika SAyang melakukan dirinya sendiri analisis sentimen;
  4. Layanan Umpan Balik SA, yang menerima umpan balik dari pengguna mengenai keakuratan analisis yang dilakukan.

Kembali ke layanan mikro dengan Istio. Bagian 1

Dalam diagram ini, selain layanan, kita juga melihat Ingress Controller, yang di Kubernetes merutekan permintaan masuk ke layanan terkait. Istio menggunakan konsep serupa sebagai bagian dari Ingress Gateway, rinciannya akan menyusul.

Meluncurkan aplikasi dengan proxy dari Istio

Untuk operasi lebih lanjut yang disebutkan dalam artikel, kloning repositori Anda penguasaan istio. Ini berisi aplikasi dan manifes untuk Kubernetes dan Istio.

Memasukkan sespan

Penyisipan dapat dilakukan автоматичСски ΠΈΠ»ΠΈ dengan tangan. Untuk menyisipkan kontainer sespan secara otomatis, Anda perlu menyetel label ke namespace istio-injection=enabled, yang dilakukan dengan perintah berikut:

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

Sekarang setiap pod yang akan di-deploy di namespace default (default) akan mendapatkan wadah sespannya. Untuk memverifikasi ini, mari terapkan aplikasi pengujian dengan masuk ke direktori root repositori [istio-mastery] dan menjalankan perintah 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 men-deploy layanan, periksa apakah pod masing-masing memiliki dua kontainer (dengan layanan itu sendiri dan sespannya) dengan menjalankan perintah kubectl get pods dan memastikannya di bawah kolom READY nilai yang ditentukan 2/2, melambangkan bahwa kedua container 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 terlihat seperti ini:

Kembali ke layanan mikro dengan Istio. Bagian 1
Proksi utusan di salah satu pod

Sekarang aplikasi sudah aktif dan berjalan, kita perlu mengizinkan lalu lintas masuk untuk masuk ke aplikasi.

Gerbang Masuk

Praktik terbaik untuk mencapai hal ini (mengizinkan lalu lintas di cluster) adalah melalui Gerbang Masuk di Istio, yang terletak di β€œtepi” cluster dan memungkinkan Anda mengaktifkan fitur Istio seperti perutean, penyeimbangan beban, keamanan, dan pemantauan lalu lintas masuk.

Komponen Ingress Gateway dan layanan yang meneruskannya ke luar diinstal pada cluster selama instalasi Istio. Untuk mengetahui alamat IP eksternal suatu layanan, 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 menyebutnya sebagai IP EKSTERNAL), jadi untuk kenyamanan, kami akan menulis nilainya ke variabel:

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

Jika Anda mencoba mengakses IP ini melalui browser sekarang, Anda akan mendapatkan kesalahan Layanan Tidak Tersedia, karena secara default Istio memblokir semua lalu lintas masuksampai Gateway ditentukan.

Sumber daya gerbang

Gateway adalah CRD (Custom Resource Definition) di Kubernetes, yang ditentukan setelah menginstal Istio di sebuah cluster dan mengaktifkan kemampuan untuk menentukan port, protokol, dan host yang ingin kita izinkan lalu lintas masuknya.

Dalam kasus kami, kami ingin mengizinkan lalu lintas HTTP pada port 80 untuk semua host. Masalahnya diwujudkan dengan 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 pemilihnya istio: ingressgateway. Dengan pemilih ini, kita dapat menentukan Ingress Gateway mana yang akan diterapkan konfigurasinya. Dalam kasus kami, ini adalah pengontrol Ingress Gateway, yang diinstal secara default di Istio.

Konfigurasi diterapkan dengan memanggil perintah berikut:

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

Gateway sekarang mengizinkan akses ke port 80 tetapi tidak tahu ke mana harus merutekan permintaan. Untuk ini, Anda perlu Layanan Virtual.

Sumber daya Layanan Virtual

VirtualService memberi tahu Ingress Gateway cara merutekan permintaan yang diizinkan dalam klaster.

Permintaan ke aplikasi kami yang datang melalui http-gateway harus dikirim ke layanan sa-frontend, sa-web-app, dan sa-feedback:

Kembali ke layanan mikro dengan Istio. Bagian 1
Rute yang akan dikonfigurasi dengan VirtualServices

Pertimbangkan permintaan yang harus dikirim ke SA-Frontend:

  • Pencocokan persis di sepanjang jalan / harus dikirim ke SA-Frontend untuk mendapatkan index.html;
  • Jalur dengan awalan /static/* harus dikirim ke SA-Frontend untuk mendapatkan file statis yang digunakan di frontend, seperti CSS dan JavaScript;
  • Jalur yang cocok dengan ekspresi reguler '^.*.(ico|png|jpg)$', harus dikirim ke SA-Frontend, karena Ini adalah gambar-gambar yang ditampilkan di halaman.

Implementasinya 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

poin penting:

  1. Layanan Virtual ini mengacu pada permintaan yang masuk http-gateway;
  2. Π’ destination mendefinisikan layanan ke mana permintaan dikirim.

Catatan: Konfigurasi di atas disimpan dalam sebuah file sa-virtualservice-external.yaml, yang juga berisi pengaturan untuk perutean ke SA-WebApp dan SA-Feedback, tetapi telah dipersingkat di artikel ini agar lebih singkat.

Terapkan Layanan Virtual dengan menelepon:


Catatan: Saat kami menerapkan sumber daya Istio, Server API Kubernetes memicu peristiwa yang diterima oleh Bidang Kontrol Istio, dan setelah itu, konfigurasi baru diterapkan ke proksi Envoy setiap pod. Dan pengontrol Ingress Gateway tampaknya merupakan Utusan lain yang dikonfigurasi di Control Plane. Semua ini terlihat seperti ini pada diagram:

Kembali ke layanan mikro dengan Istio. Bagian 1
Konfigurasi Istio-IngressGateway untuk perutean permintaan

Analisis Sentimen kini tersedia di http://{EXTERNAL-IP}/. Jangan khawatir jika Anda mendapatkan status Tidak Ditemukan: terkadang diperlukan waktu lebih lama agar konfigurasi diterapkan dan cache Utusan diperbarui.

Sebelum melanjutkan, mainkan aplikasi sebentar untuk menghasilkan lalu lintas. (kehadirannya diperlukan untuk kejelasan dalam tindakan selanjutnya - kira-kira terjemahan).

Kiali: observabilitas

Untuk masuk ke antarmuka admin Kiali, jalankan perintah berikut:


…dan terbuka http://localhost:20001/dengan login sebagai admin/admin. Di sini Anda akan menemukan banyak fitur berguna, misalnya, untuk memeriksa konfigurasi komponen Istio, memvisualisasikan layanan dari informasi yang dikumpulkan dengan mencegat permintaan jaringan, mendapatkan jawaban atas pertanyaan β€œSiapa yang menghubungi siapa?”, β€œVersi layanan mana yang mengalami kegagalan?” dan seterusnya. Secara umum, jelajahi kemungkinan Kiali sebelum melanjutkan memvisualisasikan metrik dengan Grafana.

Kembali ke layanan mikro dengan Istio. Bagian 1

Grafana: visualisasi metrik

Metrik yang dikumpulkan di Istio berakhir di Prometheus dan divisualisasikan dengan Grafana. Untuk masuk ke antarmuka admin Grafana, jalankan perintah di bawah ini, lalu buka http://localhost:3000/:


Dengan mengklik menu Beranda kiri atas dan pilih Dasbor Layanan Istio di pojok kiri atas, mulai dengan servis sa-web-appuntuk melihat metrik yang dikumpulkan:

Kembali ke layanan mikro dengan Istio. Bagian 1

Di sini kita menunggu pertunjukan yang kosong dan benar-benar membosankan - manajemen tidak akan pernah menyetujuinya. Mari buat beban kecil dengan perintah berikut:


Sekarang kami memiliki grafik yang jauh lebih cantik, dan selain itu, alat luar biasa Prometheus untuk pemantauan dan Grafana untuk memvisualisasikan metrik, yang memungkinkan kami mempelajari tentang kinerja, status kesehatan, peningkatan/penurunan layanan dari waktu ke waktu.

Terakhir, mari kita lihat penelusuran permintaan dalam layanan.

Jaeger: menelusuri

Kita perlu melakukan penelusuran, karena semakin banyak layanan yang kita miliki, semakin sulit untuk mengetahui penyebab kegagalannya. Mari kita lihat kasus sederhana dari gambar di bawah ini:

Kembali ke layanan mikro dengan Istio. Bagian 1
Contoh umum dari permintaan acak yang gagal

Permintaan datang, jatuh - apa alasannya? Layanan pertama? Atau kedua? Ada pengecualian pada keduanya - mari kita lihat log masing-masing. Seberapa sering Anda mendapati diri Anda melakukan hal ini? Pekerjaan kami lebih seperti detektif perangkat lunak daripada pengembang…

Ini adalah masalah yang tersebar luas di layanan mikro dan diselesaikan dengan sistem penelusuran terdistribusi, di mana layanan meneruskan header unik satu sama lain, setelah itu informasi ini dialihkan ke sistem penelusuran, untuk dibandingkan dengan data permintaan. Berikut ilustrasinya:

Kembali ke layanan mikro dengan Istio. Bagian 1
TraceId digunakan untuk mengidentifikasi permintaan

Istio menggunakan Jaeger Tracer, yang mengimplementasikan kerangka kerja OpenTracing API yang tidak bergantung pada vendor. Anda dapat mengakses antarmuka pengguna Jaeger dengan perintah berikut:


Sekarang pergi ke http://localhost:16686/ dan pilih layanan sa-web-app. Jika layanan tidak ditampilkan di menu tarik-turun, tampilkan/hasilkan aktivitas di halaman dan perbarui antarmuka. Setelah itu klik tombolnya Temukan jejak, yang akan menampilkan jejak terbaru - pilih salah satu - informasi terperinci tentang semua jejak akan muncul:

Kembali ke layanan mikro dengan Istio. Bagian 1

Jejak ini menunjukkan:

  1. Permintaan itu masuk istio-ingressgateway (ini adalah interaksi pertama dengan salah satu layanan, dan ID Jejak dibuat untuk permintaan tersebut), setelah itu gateway mengirimkan permintaan ke layanan sa-web-app.
  2. Dalam pelayanan sa-web-app permintaan diambil oleh sespan Utusan, "anak" dibuat dalam rentang tersebut (itulah sebabnya kita melihatnya di jejak) dan diarahkan ke wadah sa-web-app. (Menjangkau - unit kerja logis di Jaeger, yang memiliki nama, waktu mulai operasi, dan durasinya. Rentang dapat disarangkan dan dipesan. Grafik bentang asiklik terarah membentuk jejak. - kira-kira. terjemahan.)
  3. Di sini permintaan diproses dengan metode analisis sentimen. Jejak ini sudah dihasilkan oleh aplikasi, mis. mereka memerlukan perubahan kode.
  4. Mulai saat ini, permintaan POST dimulai sa-logika. ID Jejak harus diteruskan dari sa-web-app.
  5. ...

Catatan: Pada langkah 4, aplikasi akan melihat header yang dihasilkan oleh Istio dan meneruskannya ke permintaan berikutnya, seperti yang ditunjukkan pada gambar di bawah:

Kembali ke layanan mikro dengan Istio. Bagian 1
(A) Penerusan header adalah tanggung jawab Istio; (B) Layanan bertanggung jawab atas header

Istio melakukan sebagian besar pekerjaan karena menghasilkan header untuk permintaan masuk, membuat span baru di setiap sidecare dan meneruskannya. Namun, tanpa bekerja dengan header di dalam layanan, jalur pelacakan permintaan secara lengkap akan hilang.

Header berikut harus diperhatikan (diteruskan):


Ini adalah tugas yang sederhana, tetapi untuk menyederhanakan implementasinya, sudah ada banyak perpustakaan - misalnya, di layanan sa-web-app, klien RestTemplate meneruskan header ini jika Anda cukup menambahkan pustaka Jaeger dan OpenTracing ke ketergantungannya.

Perhatikan bahwa aplikasi Analisis Sentimen mendemonstrasikan implementasi di Flask, Spring, dan ASP.NET Core.

Kini setelah jelas apa yang akan kita dapatkan (atau hampir keluar dari kotak), mari kita lihat penyempurnaan perutean, manajemen lalu lintas jaringan, keamanan, dan banyak lagi!

Catatan. terjemahan: baca tentang itu di bagian selanjutnya materi Istio dari Rinor Maloku, yang terjemahannya akan menyusul di blog kami dalam waktu dekat. UPDATE (14 Maret): Bagian kedua sudah diterbitkan.

PS dari penerjemah

Baca juga di blog kami:

Sumber: www.habr.com