Anda dapat menggunakan jalur lalu lintas dalam mode permissif untuk mengisolasi versi aplikasi dan mengarahkan lalu lintas berdasarkan rasio tertentu. Aplikasi Anda harus menambahkan header yang ditransmisikan secara transparan di seluruh jejak permintaan dengan nilai yang berbeda. Header ini disebut header permintaan pass-through ujung-ke-ujung (E2E). Dalam contoh ini, header baggage digunakan sebagai header permintaan E2E. Ketika layanan dalam suatu jalur memanggil satu sama lain, jika layanan yang dipanggil tidak ada di jalur tersebut, permintaan diteruskan ke layanan yang sama di jalur dasar. Fitur ini memastikan integritas jejak dan menyederhanakan manajemen lalu lintas.
Sebelum memulai, pastikan Anda telah membaca dan memahami topik Gunakan jalur lalu lintas dalam mode permissif untuk mengelola lalu lintas ujung-ke-ujung dan konten terkait.
Deskripsi skenario
Dalam contoh ini, tiga layanan (mocka, mockb, dan mockc) dan tiga jalur (s1, s2, dan s3) digunakan untuk mensimulasikan jejak. Jalur s1 adalah jalur dasar yang mencakup semua tiga layanan versi v1. Jalur s2 hanya mencakup mocka dan mockc versi v2, sedangkan jalur s3 hanya mencakup mockb versi v3. Pertama, gunakan kemampuan auto-instrumentasi OpenTelemetry untuk mengaktifkan pod layanan agar melewati header baggage. Kemudian, buat tiga jalur dalam mode permissif dan konfigurasikan bobot pengalihan lalu lintas untuk mengarahkan lalu lintas sesuai rasio tertentu.
Langkah 1: Menyebarkan layanan sampel
Aktifkan injeksi proxy sidecar otomatis untuk namespace default. Untuk informasi lebih lanjut, lihat Kelola namespace global.
CatatanUntuk informasi lebih lanjut tentang injeksi proxy sidecar otomatis, lihat Aktifkan injeksi proxy sidecar otomatis.
Buat file mock.yaml dengan konten berikut:
Anotasi
instrumentation.opentelemetry.io/inject-java: "true"daninstrumentation.opentelemetry.io/container-names: "default"ditambahkan ke setiap pod layanan untuk mendeklarasikan bahwa layanan yang sesuai diimplementasikan dalam Java, dan Operator OpenTelemetry diperlukan untuk menginstrumen otomatis kontainer bernamadefault.Jalankan perintah berikut untuk menyebarkan layanan:
kubectl apply -f mock.yamlBerdasarkan mekanisme auto-instrumen OpenTelemetry, pod layanan dapat secara otomatis melewati header baggage dalam jejak.
Langkah 2: Buat grup jalur dan jalur yang sesuai
Buat grup jalur.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih .
Di halaman Traffic Lane, klik Create Swimlane Group. Di panel Create Swimlane Group, konfigurasikan parameter yang diperlukan dan klik OK.
Parameter
Deskripsi
Name of swim lane group
Untuk contoh ini, masukkan test.
Istio gateway for an ingress gateway
Pilih ingressgateway.
Lane Mode
Pilih Permissive Mode.
Pass-through Mode of Trace Context
Pilih Pass Through Baggage Header.
Routing Request Header
Masukkan x-asm-prefer-tag.
Swimlane Services
Pilih kluster tempat layanan mocka, mockb, dan mockc berada dari daftar drop-down Kluster Kubernetes dan default dari daftar drop-down Namespace. Pilih layanan mocka, mockb, dan mockc dalam daftar, dan klik ikon
untuk menambahkan layanan ini ke bagian selected.
Buat jalur bernama s1, s2, dan s3. Ikat jalur s1 ke versi v1 layanan sampel, jalur s2 ke versi v2 layanan sampel, dan jalur s3 ke versi v3 layanan sampel.
Di bagian Traffic Rule Definition halaman Traffic Lane, klik Create swimlanes.
Di kotak dialog Create swimlanes, konfigurasikan parameter yang diperlukan dan klik OK.
Parameter
Deskripsi
Swimlane Name
Beri nama tiga jalur sebagai s1, s2, dan s3 masing-masing.
Configure Service Tag
Label Key: Setel ke ASM_TRAFFIC_TAG.
Label Value: Setel ke v1 untuk jalur s1, v2 untuk jalur s2, dan v3 untuk jalur s3.
Add Service
Untuk jalur s1, pilih mocka(default), mockb(default), dan mockc(default).
Untuk jalur s2, pilih mocka(default) dan mockc(default).
Untuk jalur s3, pilih mockb(default).
Gambar berikut menunjukkan konfigurasi jalur s1.

Setelah ketiga jalur dibuat, Anda dapat melihatnya di bagian Definisi Aturan Lalu Lintas, seperti yang ditunjukkan pada gambar berikut.

Secara default, jalur pertama yang Anda buat dalam grup jalur diatur sebagai jalur dasar. Namun, Anda dapat mengubah jalur dasar. Ketika lalu lintas ditujukan untuk layanan yang tidak ada di jalur lain, permintaan diteruskan ke jalur dasar sesuai dengan mekanisme fallback. Untuk informasi lebih lanjut tentang cara mengubah jalur dasar, lihat Ubah jalur dasar dalam mode permissif.
Di panel navigasi kiri Konsol ASM, pilih Traffic Management Center > DestinationRule atau VirtualService untuk melihat destination rule atau virtual service yang dihasilkan secara otomatis untuk setiap layanan dalam grup jalur. Sebagai contoh, destination rule dan virtual service berikut dibuat secara otomatis untuk layanan mocka.
Buat aturan pengalihan lalu lintas berbasis bobot yang seragam.
Di bagian Definisi Aturan Lalu Lintas halaman Jalur Lalu Lintas, klik Pengalihan Berbasis Bobot di bagian Aturan Pengalihan Lalu Lintas.
Di kotak dialog Setel Aturan Pengalihan Seragam, konfigurasikan parameter yang diperlukan dan klik OK. Contoh berikut mengasumsikan bahwa jalur permintaan masuk dari semua layanan di jalur adalah /mock, dan aturan pengalihan lalu lintas yang sama dikonfigurasikan untuk setiap jalur.
Parameter
Deskripsi
realm name
Setel ke *.
Matching request URI
Setel parameter Method ke Prefix dan parameter Content ke /.
Gambar berikut menunjukkan contoh konfigurasi aturan pengalihan lalu lintas seragam:

Setel bobot pengalihan lalu lintas untuk ketiga jalur. Bobot menentukan proporsi lalu lintas yang dikirim ke setiap jalur.
Di bagian Traffic Rule Definition halaman Traffic Lane, klik tombol
di sebelah nomor di kolom Traffic Routing Weight. Di kotak dialog Edit Traffic Routing Weight, konfigurasikan parameter yang diperlukan dan klik OK.Parameter
Deskripsi
Ingress service
Setel ke mocka.default.svc.cluster.local untuk ketiga jalur.
Weight Value
Untuk jalur s1, setel nilainya menjadi 60.
Untuk jalur s2, setel nilainya menjadi 20.
Untuk jalur s3, setel nilainya menjadi 20.
Gambar berikut menunjukkan contoh konfigurasi bobot pengalihan lalu lintas.

Langkah 3: Verifikasi bahwa fitur rilis canary ujung-ke-ujung berfungsi
Dapatkan alamat IP publik dari gateway ingress. Untuk informasi lebih lanjut, lihat Langkah 2: Dapatkan alamat IP gateway ingress ASM.
Jalankan perintah berikut untuk mengonfigurasi variabel lingkungan. xxx.xxx.xxx.xxx adalah alamat IP yang diperoleh pada langkah sebelumnya.
export ASM_GATEWAY_IP=xxx.xxx.xxx.xxxVerifikasi bahwa fitur rilis canary ujung-ke-ujung berfungsi.
Jalankan perintah berikut untuk melihat pemanggilan layanan di ketiga jalur:
for i in {1..100}; do curl http://${ASM_GATEWAY_IP}/ ; echo ''; sleep 1; done;Keluaran yang diharapkan:
-> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v3, ip: 192.168.0.2)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v2, ip: 192.168.0.184)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v2, ip: 192.168.0.189) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190) -> mocka(version: v1, ip: 192.168.0.193)-> mockb(version: v1, ip: 192.168.0.1)-> mockc(version: v1, ip: 192.168.0.190)Keluaran tersebut menunjukkan bahwa lalu lintas dikirim ke jalur s1, s2, dan s3 dengan rasio sekitar 6:2:2, dan s1 digunakan sebagai jalur dasar. Jika versi tertentu dari layanan tidak ada dalam jejak, layanan yang sesuai di jalur s1 dipanggil.