Episode ini membahas routing lanjutan: weighted clusters untuk canary, mirror traffic dan shadowing, header-based routing dengan path rewrites, serta fault injection untuk chaos engineering.

Episode 4 memberi routing dasar; episode 18 membawa routing ke level rekayasa traffic. Advanced routing dan traffic shaping memungkinkan kalian mengirim sebagian request ke versi baru (canary), menduplikasi traffic untuk pengujian (mirroring), me-route berdasarkan header, dan menyuntikkan kegagalan dengan sengaja. Kemampuan ini menjawab pertanyaan yang selalu muncul di production: bagaimana menguji perubahan dengan risiko minimal.
Weighted cluster membagi request antar beberapa cluster sesuai persentase:
virtual_hosts:
- name: api_vh
domains:
- api.example.com
routes:
- match:
prefix: "/v1/orders"
route:
weighted_clusters:
clusters:
- name: orders_v1
weight:
value: 95
- name: orders_v2
weight:
value: 5Dengan weighted_clusters, 95 persen request /v1/orders menuju orders_v1 dan 5 persen menuju orders_v2. Bobot total tidak harus 100; Envoy menormalkan secara proporsional. Ini mekanisme canary paling dasar dan paling sering dipakai.
Strategi canary yang umum: mulai dari 1 persen, amati metric dan log, lalu naikkan ke 10, 50, hingga 100 persen. Karena config bisa diubah via xDS tanpa restart, pergeseran bisa dilakukan dalam hitungan menit.
Bobot bisa didefinisikan di metadata endpoint sehingga control plane menentukan proporsinya secara dinamis. Untuk lab, cukup ubah weight lalu muat ulang config.
Mirroring mengirim salinan request ke cluster lain tanpa mengubah respons klien:
routes:
- match:
prefix: "/v1/orders"
route:
cluster: orders_v1
request_mirror_policies:
- cluster: orders_v2
runtime_fraction:
default_value:
numerator: 10
denominator: HUNDRED
trace_sampled: trueBlok request_mirror_policies mengirim 10 persen request juga ke orders_v2. Klien tetap menerima respons dari orders_v1; hasil orders_v2 dibuang — hanya observability yang melihatnya. Ini cara menguji versi baru dengan traffic nyata tanpa risiko.
Shadowing menjawab pertanyaan "apakah versi baru akan berperilaku sama?" tanpa me-route pengguna nyata. Bandingkan respons shadow dengan respons asli di telemetry, lalu ambil keputusan berdasarkan data. trace_sampled: true memastikan request mirror ikut tercatat di tracing.
Beberapa hal yang perlu diwaspadai:
runtime_fraction untuk mengubah persentase mirror secara dinamis.Routing bisa dipicu oleh nilai header tertentu:
routes:
- match:
prefix: "/api/"
headers:
- name: X-Canary
string_match:
exact: "true"
route:
cluster: api_canary
- match:
prefix: "/api/"
route:
cluster: api_stableRoute pertama menangkap semua request dengan header X-Canary: true dan mengirimnya ke api_canary. Sisanya menuju api_stable. Pola ini dipakai untuk testing internal: tim QA mengirim header khusus, traffic normal tidak terpengaruh.
Match bisa menggabungkan path, header, dan query parameter sekaligus untuk memetakan subset traffic yang sangat spesifik — misalnya prefix /api/, header X-Tenant: tenant-a, dan query beta=1.
Gabungkan header-based routing dengan rewrite yang sudah dipelajari di episode 4:
routes:
- match:
prefix: "/api/v2"
headers:
- name: X-Experimental
string_match:
prefix: "1"
route:
cluster: experimental_backend
prefix_rewrite: "/v2/internal"prefix_rewrite: "/v2/internal" mengubah path sebelum menuju backend eksperimental. Dengan kombinasi ini, satu listener bisa menjadi gerbang banyak strategi routing sekaligus.
Fault injection di episode 10 kini dipakai sebagai tool chaos engineering yang presisi — dikombinasikan dengan routing:
routes:
- match:
prefix: "/v1/orders"
headers:
- name: X-Chaos
string_match:
exact: "1"
route:
cluster: orders_v1
typed_per_filter_config:
envoy.filters.http.fault:
"@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.Fault
abort:
http_status: 500
percentage:
numerator: 100
denominator: HUNDREDKonfigurasi fault membuat semua request dengan header X-Chaos: 1 gagal dengan status 500. Dengan memicu header ini di sebagian request, kalian bisa menguji apakah retry dan circuit breaking bekerja saat versi baru bermasalah.
Urutan pengujian yang disarankan:
Jangan pernah menyuntikkan fault ke seluruh traffic sekaligus. Mulai dari fraction kecil lalu naikkan bertahap. Fault injection Envoy punya runtime_fraction yang bisa diganti dinamis, memberi kontrol penuh saat eksperimen berlangsung.
curl -s -o /dev/null -w "%{http_code}\n" \
-H "Host: api.example.com" -H "X-Chaos: 1" http://localhost:10000/v1/orders
curl -s localhost:9901/stats | grep "upstream_rq_5xx"Request dengan X-Chaos: 1 seharusnya menghasilkan 500, lalu metric upstream_rq_5xx bertambah. Ini cara cepat membuktikan fault injection aktif dan terukur.
Episode 18 memberi kalian kendali penuh atas bentuk traffic: weighted clusters untuk canary, mirroring untuk shadowing, routing berbasis header, dan fault injection untuk chaos engineering yang presisi.
Inti yang harus dibawa pulang:
weighted_clusters membagi traffic secara proporsional untuk canary.request_mirror_policies mengirim salinan request tanpa memengaruhi klien.Di episode 19 selanjutnya kita akan membahas Envoy in Kubernetes dan service mesh ecosystems — Envoy sidecar dalam Istio, perbedaan Envoy langsung versus sebagai mesh data plane, serta deployment patterns untuk workload Kubernetes.