Episode ini membahas traffic splitting dan weights, retries, timeouts, circuit breakers, request mirroring, serta perilaku load balancing Multigress di antara service backend.

Menuju ke service saja tidak cukup — kalian harus mengendalikan bagaimana traffic mengalir. Episode 6 membuka kotak traffic policy dan load balancing Multigress: membagi traffic dengan weights, mengatur retries dan timeouts, melindungi backend dengan circuit breaker, serta memakai request mirroring untuk menguji tanpa mengganggu pengguna.
Di akhir episode ini kalian bisa menjawab pertanyaan khas platform engineer: bagaimana cara mengirim satu persen traffic ke versi baru, atau bagaimana melindungi backend yang sedang sekarat.
HTTPRoute mendukung beberapa backendRefs sekaligus, masing-masing dengan weight. Bobot menentukan proporsi traffic:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api-route
spec:
parentRefs:
- name: main-gateway
namespace: multigress-system
hostnames:
- "api.example.com"
rules:
- backendRefs:
- name: api-stable
port: 8080
weight: 90
- name: api-canary
port: 8080
weight: 10Konfigurasi di atas mengirim 90 persen traffic ke api-stable dan 10 persen ke api-canary. Total bobot menentukan persentase; tidak harus berjumlah 100.
Uji berulang untuk melihat distribusi:
for i in $(seq 1 100); do
curl -s http://localhost:8080/api | grep -o '"host":.*' | head -1
done | sort | uniq -cPerhatikan: splitting bersifat probabilistik, jadi hasil 100 percobaan mendekati 90:10, bukan persis. Jangan gunakan weights jika kalian butuh jaminan mutlak per request — gunakan header atau cookie berdasarkan rule match.
Fitur seperti retries, timeouts, dan circuit breaker tidak ada di HTTPRoute standar. Multigress menyediakannya lewat CRD BackendTrafficPolicy yang menempel ke route atau service backend:
apiVersion: gateway.multigress.io/v1
kind: BackendTrafficPolicy
metadata:
name: api-policy
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: api-route
timeouts:
request: 5s
backendRequest: 3s
retry:
attempts: 3
retryOn:
- connect-failure
- reset
- 5xxPolicy ini membatasi waktu request maksimal 5 detik, mencoba ulang hingga 3 kali ketika koneksi gagal, koneksi di-reset, atau backend membalas 5xx. Perintah kubectl apply -f api-policy.yaml menerapkan policy tersebut ke route kalian.
Circuit breaker melindungi backend dari ledakan request ketika dia sedang gagal:
apiVersion: gateway.multigress.io/v1
kind: BackendTrafficPolicy
metadata:
name: api-circuit-breaker
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: Service
name: api
circuitBreaker:
maxConnections: 1000
maxPendingRequests: 64
maxRequests: 128
maxRetries: 5Saat ambang batas terlampaui, proxy langsung menolak request baru tanpa membebani backend — pola yang sama dengan circuit breaker pada service mesh. Setelah kondisi pulih, aliran traffic dibuka kembali secara otomatis.
Request mirroring mengirim salinan request ke service lain tanpa mengubah respons ke klien. Ini sempurna untuk menguji versi baru dengan traffic produksi asli:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api-route-mirror
spec:
parentRefs:
- name: main-gateway
namespace: multigress-system
rules:
- backendRefs:
- name: api-stable
port: 8080
filters:
- type: RequestMirror
requestMirror:
backendRef:
name: api-shadow
port: 8080Klien hanya berinteraksi dengan api-stable; salinan request dikirim diam-diam ke api-shadow. Ingat: mirror tidak boleh dipakai untuk request yang menulis data — bayangkan efek ganda pada transaksi pembayaran.
Multigress memakai algoritma least request secara default: request diarahkan ke backend dengan jumlah koneksi aktif paling sedikit. Opsi lain yang tersedia:
round-robin: giliran berurutan antar backend.random: pemilihan acak, cocok untuk membaurkan distribusi.consistent-hash: request dengan key yang sama selalu menuju backend yang sama — penting untuk session affinity.apiVersion: gateway.multigress.io/v1
kind: BackendTrafficPolicy
metadata:
name: api-lb-policy
spec:
targetRefs:
- group: gateway.networking.k8s.io
kind: HTTPRoute
name: api-route
loadBalancing:
algorithm: round-robinInfo
consistent-hash bukan pengganti session affinity HTTP di tingkat aplikasi, tetapi cukup untuk kebutuhan sederhana seperti mempertahankan backend yang sama selama percobaan.
Episode 6 memberikan kalian kendali penuh atas aliran traffic: membagi dengan weights untuk canary, melindungi backend dengan timeout, retry, dan circuit breaker, serta menguji versi baru dengan request mirroring.
Inti yang harus dibawa pulang:
backendRefs dengan weight membagi traffic secara proporsional.Di episode 7 selanjutnya kita akan mengenalkan observability basics — mengaktifkan metrics dan logs Multigress, integrasi dengan Prometheus dan Grafana, serta cara memeriksa route behavior dan health gateway. Konfigurasi traffic policy kalian akan diuji dengan data nyata.