Episode 7 membuat mesh tangguh menghadapi kegagalan: retries dengan retry budget dan per-host, timeouts per request, circuit breaker via outlier detection dan connection pool, serta fault injection untuk menguji ketahanan sistem.

Di jaringan nyata, kegagalan adalah hal yang normal: koneksi terputus, Pod restart, backend lambat. Aplikasi yang tangguh bukan aplikasi yang tidak pernah gagal, melainkan aplikasi yang pulih dengan cepat ketika kegagalan terjadi. Episode 7 ini membahas empat pola ketahanan yang bisa kalian pasang tanpa mengubah kode aplikasi: retries, timeouts, circuit breaker, dan fault injection.
Retry membuat Envoy mengulang request yang gagal sebelum menyerah:
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: productpage-retry
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
retries:
attempts: 3
perTryTimeout: 2s
retryOn: connect-failure,refused-stream,5xxattempts: 3 memungkinkan hingga tiga kali pengulangan, perTryTimeout membatasi durasi satu percobaan, dan retryOn menentukan kondisi mana yang dianggap layak dicoba ulang — 5xx termasuk 500 dan 503, tetapi tidak termasuk error yang bukan respons server.
Warning
Hati-hati dengan endpoint yang tidak idempotent. Jika request memicu pembayaran, retry otomatis bisa menggandakan transaksi. Batasi retryOn untuk request yang aman diulang.
Retry juga bisa dibatasi secara global per service dengan RetryBudget (tersedia di Istio versi baru):
apiVersion: networking.istio.io/v1
kind: RetryBudget
metadata:
name: productpage-budget
spec:
match:
- hosts:
- productpage
retryBudget:
percent: 20
minRetriesPerSecond: 10retryBudget.percent: 20 berarti retry tambahan dibatasi hingga 20 persen dari traffic normal — mencegah badai retry saat banyak request gagal bersamaan, sesuatu yang bisa membuat outage menjadi lebih parah.
Timeout membatasi total waktu yang boleh dipakai satu request:
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
timeout: 5stimeout: 5s menghentikan request yang berjalan lebih dari lima detik dan mengembalikan error 504 ke klien. Kombinasi timeout dengan perTryTimeout menjaga latensi tetap terkendali: kalau backend lambat, kalian gagal cepat alih-alih menggantung.
Circuit breaker di Istio dibangun dari dua bagian: connection pool dan outlier detection. Keduanya tinggal di DestinationRule:
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: productpage-circuit
spec:
host: productpage
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 100
http2MaxRequests: 1000
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 1m
maxEjectionPercent: 100Cara kerjanya sederhana: connection pool membatasi berapa banyak koneksi dan request yang boleh menuju sebuah Pod. Jika sebuah Pod mulai menghasilkan error 5xx, consecutive5xxErrors: 5 membuat Pod itu di-eject dari pool selama baseEjectionTime. Traffic dialihkan ke Pod sehat — inilah bentuk circuit breaker ala Envoy.
Fault injection bukan untuk membuat sistem gagal, tetapi untuk membuktikan bahwa sistem bisa pulih. Dua jenis utama: fault.delay (menunda respons) dan fault.abort (mengembalikan error):
spec:
hosts:
- reviews
http:
- match:
- headers:
x-zone:
exact: chaos
fault:
delay:
percentage:
value: 100
fixedDelay: 5s
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1Request dengan header x-zone: chaos ditunda lima detik sebelum sampai ke v2. Dengan begini kalian bisa melihat bagaimana klien dan service downstream menangani latensi tinggi tanpa merusak produksi.
Untuk menguji kegagalan total, gunakan abort:
spec:
http:
- match:
- headers:
x-zone:
exact: chaos
fault:
abort:
percentage:
value: 50
httpStatus: 503
route:
- destination:
host: reviews
subset: v1fault.abort.httpStatus: 503 membuat 50 persen request yang ditandai gagal dengan 503 — persis skenario yang diharapkan mampu ditangani retry dan circuit breaker. Verifikasi efeknya lewat metrik:
kubectl get virtualservice reviews-routing -o yaml
curl -H "x-zone: chaos" http://reviews:9080/reviewsEpisode 7 membuat mesh tahan banting: retries dengan retry budget, timeout per request, circuit breaker dari kombinasi connection pool dan outlier detection, serta fault injection untuk membuktikan sistem bisa pulih dari skenario buruk.
Inti yang harus dibawa pulang:
Di episode 8 selanjutnya kita akan memandang mesh dari sisi pengukuran: observability dengan metrics, logs, dan tracing — pipeline telemetry v2, metrik Prometheus, distributed tracing dengan Jaeger, serta dashboard Kiali dan Grafana.