Saat merilis versi baru layanan mikro, Anda perlu mengontrol jumlah traffic yang dialihkan ke masing-masing versi sebelum peluncuran penuh. Service Mesh (ASM) menggunakan tiga resource Istio—Gateway, VirtualService, dan DestinationRule—untuk membagi traffic berdasarkan persentase di antara berbagai versi layanan. Pendekatan ini mendukung rilis canary dan Pengujian A/B.
Topik ini menggunakan contoh lengkap aplikasi Bookinfo. Anda akan mengekspos Bookinfo melalui gerbang Istio, lalu mengonfigurasi routing berbobot untuk mengirim 10%, 40%, dan 50% traffic ke tiga versi layanan reviews.
Cara kerja
Routing traffic di ASM mengandalkan tiga resource Istio yang bekerja bersama dalam satu rantai:
| Resource | Peran |
|---|---|
| Gateway | Load balancer di tepi mesh yang menerima koneksi HTTP atau TCP inbound. Bind ke ingress gateway untuk mengontrol bagaimana traffic eksternal memasuki mesh. |
| VirtualService | Aturan routing yang mencocokkan permintaan masuk berdasarkan URI, header, atau kriteria lainnya, lalu meneruskannya ke layanan tertentu. VirtualService dapat membagi traffic ke beberapa tujuan berdasarkan bobot. |
| DestinationRule | Mengelompokkan instans layanan ke subset bernama berdasarkan label (biasanya label versi). Aturan VirtualService mereferensikan subset ini untuk mengarahkan traffic ke versi tertentu. |
Alur lalu lintas:
Traffic eksternal --> Gateway --> VirtualService --> DestinationRule (subset) --> Pod layananDalam tutorial ini, Anda pertama-tama membuat Gateway dan VirtualService untuk mengekspos aplikasi Bookinfo. Kemudian, Anda menambahkan DestinationRule dan VirtualService kedua untuk membagi traffic reviews ke v1, v2, dan v3.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Men-deploy aplikasi Bookinfo di instans ASM. Untuk detailnya, lihat Deploy aplikasi di kluster ACK yang ditambahkan ke instans ASM
Langkah 1: Buat gerbang Istio
Buat gerbang Istio dan bind ke ingress gateway agar traffic eksternal dapat mencapai layanan di dalam mesh.
Opsi A: Terapkan YAML (disarankan)
Simpan manifes berikut dan terapkan dengan kubectl apply -f <filename>.yaml:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: bookinfo-gateway
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- '*'Gateway ini memilih pod ingress gateway (label istio: ingressgateway) dan mendengarkan pada Port 80 untuk traffic HTTP dari semua host.
Opsi B: Gunakan Konsol ASM
Login ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih ASM Gateways > Gateway. Klik Create.
Konfigurasi parameter berikut, lalu klik Create.
Parameter Value Namespace defaultName bookinfo-gatewayGateway Pod Selector -- Key istioGateway Pod Selector -- Value ingressgatewayExposed Service -- Name httpExposed Service -- Port 80Exposed Service -- Protocol HTTP Exposed Service -- Service *
Untuk deskripsi lengkap setiap parameter, lihat Gateway.
Langkah 2: Buat VirtualService untuk routing ingress
Buat VirtualService yang mengarahkan permintaan masuk melalui gateway ke layanan productpage. Setelah langkah ini, aplikasi Bookinfo dapat diakses di /productpage, /static, /login, /logout, dan /api/v1/products.
Opsi A: Terapkan YAML (disarankan)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: vs-demo
namespace: default
spec:
hosts:
- '*'
gateways:
- bookinfo-gateway
http:
- name: gw-to-productage
match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080VirtualService ini bind ke bookinfo-gateway dan meneruskan permintaan yang cocok ke layanan productpage pada Port 9080.
Opsi B: Gunakan Konsol ASM
Login ke Konsol ASM. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih Traffic Management Center > VirtualService. Klik Create.
Konfigurasi pengaturan berikut, lalu klik Create.
Bagian Parameter Value Basic Information Namespace defaultName Tentukan nama untuk VirtualService Gateways Apply To specific Gateways Aktifkan. Pilih bookinfo-gateway Apply To All Sidecars Nonaktifkan Hosts Pilih *HTTP Route Name Tentukan nama entri rute Request matching rules Tambahkan lima aturan: Matching request URI = Exact: /productpageMatching request URI = Prefix: /staticMatching request URI = Exact: /loginMatching request URI = Exact: /logoutMatching request URI = Prefix: /api/v1/productsRoute destination Host: productpage, Port:9080
Untuk deskripsi lengkap setiap parameter, lihat Virtual Service.
Langkah 3: Verifikasi bahwa Bookinfo dapat diakses
Dapatkan alamat IP ingress gateway.
Dari Konsol ASM
Login ke Konsol ASM. Pilih Service Mesh > Mesh Management.
Klik nama instans ASM. Pilih ASM Gateways > Ingress Gateway.
Di halaman Ingress Gateway, temukan nilai Service address.
Dari Konsol ACK
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Klik nama kluster. Di panel navigasi kiri, pilih Network > Services.
Di halaman Services, pilih istio-system dari daftar drop-down Namespace. Temukan External IP untuk Port 80 dari istio-ingressgateway.
Buka
http://<ingress-gateway-ip>/productpagedi browser dan refresh halaman sekitar 10 kali. Tanpa aturan routing, Istio mendistribusikan permintaan ke v1, v2, dan v3 layananreviewssecara merata (1:1:1). Setiap versi menampilkan rating bintang secara berbeda, sehingga tampilan halaman berubah setiap kali refresh:v1 — Tidak ada rating bintang
v2 — Rating bintang hitam
v3 — Rating bintang merah

Langkah 4: Konfigurasi routing traffic berbobot
Buat DestinationRule untuk menentukan subset berbasis versi, dan VirtualService untuk membagi traffic ke subset tersebut dengan rasio 10:40:50.
4a. Buat DestinationRule
Tentukan tiga subset (v1, v2, v3) untuk layanan reviews berdasarkan label version.
Opsi A: Terapkan YAML (disarankan)
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: reviews
namespace: default
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3Setiap subset mencocokkan pod dengan label version yang sesuai, mengelompokkan instans reviews berdasarkan versi.
Opsi B: Gunakan Konsol ASM
Login ke Konsol ASM. Pilih Service Mesh > Mesh Management.
Klik nama instans ASM. Pilih Traffic Management Center > DestinationRule. Klik Create.
Konfigurasi pengaturan berikut, lalu klik Create.
Bagian Parameter Value Basic Information Namespace defaultName Tentukan nama Host reviewsService Version (subset) Subset 1 Name: v1, Label:version=v1Subset 2 Name: v2, Label:version=v2Subset 3 Name: v3, Label:version=v3
Untuk deskripsi lengkap setiap parameter, lihat Destination Rule.
4b. Buat VirtualService untuk routing berbobot
Arahkan 10% traffic ke v1, 40% ke v2, dan 50% ke v3 layanan reviews.
Opsi A: Terapkan YAML (disarankan)
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews.default.svc.cluster.local
http:
- name: route
route:
- destination:
host: reviews
subset: v1
weight: 10
- destination:
host: reviews
subset: v2
weight: 40
- destination:
host: reviews
subset: v3
weight: 50Nilai weight harus berjumlah 100. Sesuaikan persentase ini sesuai strategi peluncuran Anda. Misalnya, mulai dengan pembagian 90/10 untuk rilis canary yang konservatif, lalu secara bertahap alihkan lebih banyak traffic seiring meningkatnya kepercayaan.
Opsi B: Gunakan Konsol ASM
Login ke Konsol ASM. Pilih Service Mesh > Mesh Management.
Klik nama instans ASM. Pilih Traffic Management Center > VirtualService. Klik Create.
Konfigurasi pengaturan berikut, lalu klik Create.
Bagian Parameter Value Basic Information Namespace defaultName Tentukan nama Gateways Apply To All Sidecars Aktifkan Hosts Pilih reviews di namespace default HTTP Route Name Tentukan nama entri rute Route destination 1 Host: reviews, Subset:v1, Weight:10Route destination 2 Host: reviews, Subset:v2, Weight:40Route destination 3 Host: reviews, Subset:v3, Weight:50
Langkah 5: Verifikasi pembagian traffic
Buka http://<ingress-gateway-ip>/productpage di browser dan refresh halaman sekitar 10 kali.
Setiap versi layanan reviews menampilkan rating bintang secara berbeda:
| Versi | Rating bintang | Frekuensi yang diharapkan (dari 10 kali refresh) |
|---|---|---|
| v1 | Tidak ada bintang | ~1 kali |
| v2 | Bintang hitam | ~4 kali |
| v3 | Bintang merah | ~5 kali |
Jika distribusi kira-kira sesuai rasio 1:4:5, maka routing berbobot bekerja dengan benar. Distribusi ini bersifat probabilistik, sehingga penyimpangan kecil merupakan hal yang wajar.
Langkah selanjutnya
Sesuaikan bobot traffic untuk mengalihkan lebih banyak traffic ke versi tertentu sebagai bagian dari rilis canary
Tambahkan aturan routing berbasis header untuk mengarahkan pengguna tertentu ke versi spesifik guna Pengujian A/B
Konfigurasi kebijakan retry dan timeout bersamaan dengan routing traffic untuk meningkatkan ketahanan