Ketika versi layanan tidak tersedia, permintaan ke versi tersebut mengembalikan error HTTP 503. Routing fallback mengatasi masalah ini dengan secara otomatis mengalihkan permintaan ke versi layanan alternatif pada level proxy. Service Mesh (ASM) memperluas resource Istio VirtualService dengan field fallback yang mendefinisikan rute alternatif tersebut.
Topik ini menjelaskan routing fallback menggunakan aplikasi contoh Bookinfo. Anda akan:
Mengarahkan seluruh traffic ke versi layanan tertentu
Menentukan target fallback yang menerima traffic ketika versi utama tidak dapat dijangkau
Menggabungkan fallback dengan routing berbasis bobot untuk skenario lanjutan
Memverifikasi perilaku fallback melalui log akses kustom
Perbedaan fallback dengan retries dan circuit breaker
ASM menyediakan beberapa mekanisme ketahanan. Pilih yang tepat berdasarkan jenis kegagalan yang perlu ditangani:
| Mekanisme | Mode kegagalan | Perilaku | Kapan digunakan |
|---|---|---|---|
| Fallback | Semua endpoint dalam subset tidak dapat dijangkau | Mengalihkan ke subset alternatif | Tersedia versi atau deployment cadangan yang dapat melayani permintaan |
| Retries | Error sementara (timeout, 5xx) | Mengirim ulang permintaan ke subset yang sama | Error bersifat sementara dan kemungkinan berhasil saat dicoba ulang |
| Circuit breaker | Tingkat error tinggi yang berkelanjutan | Menghentikan pengiriman traffic ke endpoint yang tidak sehat | Melindungi layanan downstream dari kegagalan berantai |
Fallback beroperasi pada level routing: proxy sidecar memeriksa apakah subset target memiliki endpoint yang sehat sebelum meneruskan permintaan. Jika tidak ada endpoint sehat, permintaan dialihkan ke target fallback.
Prasyarat
| Prasyarat | Detail |
|---|---|
| Instans ASM | Edisi Perusahaan atau Edisi Ultimate, versi 1.17.2.22 atau lebih baru |
| Kluster Kubernetes | Kluster Container Service for Kubernetes (ACK) yang telah ditambahkan ke instans ASM. Lihat Tambahkan kluster ke instans ASM. |
| Aplikasi contoh | Bookinfo telah diterapkan di kluster. Lihat Terapkan aplikasi di instans ASM. |
| Versi proxy sidecar | 1.17 atau lebih baru pada semua Pod bidang data |
Jika versi instans ASM Anda lebih lama dari 1.17, perbarui ke versi 1.17.2.22 atau lebih baru. Lihat Perbarui instans ASM. Atau, submit a ticket untuk dukungan teknis.
Periksa versi proxy sidecar untuk setiap Pod pada halaman Instances Status di Konsol ASM. Lihat Upgrade management.
Versi layanan reviews Bookinfo
Layanan reviews Bookinfo memiliki tiga versi, masing-masing dapat diidentifikasi berdasarkan peringkat bintangnya di halaman produk:
| Versi | Peringkat bintang |
|---|---|
| v1 | Tanpa bintang |
| v2 | Bintang hitam |
| v3 | Bintang merah |
Layanan productpage memanggil reviews. Sebuah VirtualService mengarahkan seluruh traffic ke reviews-v3. Ketika v3 tidak tersedia, aturan fallback mengalihkan permintaan ke reviews-v2 alih-alih mengembalikan error 503.
Unduh file konfigurasi yang digunakan dalam topik ini.
Langkah 1: Buat destination rule untuk layanan reviews
Definisikan DestinationRule dengan subset untuk setiap versi layanan reviews.
Buat file bernama
reviews.yamldengan konten berikut:apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: reviews spec: host: reviews subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3Sambungkan ke instans ASM menggunakan kubectl dan file KubeConfig, lalu terapkan aturan tersebut:
kubectl apply -f reviews.yamlDapatkan alamat IP gerbang masuk dengan salah satu metode berikut:
Jalankan perintah berikut:
kubectl get svc -n istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'Temukan alamat IP pada halaman Ingress Gateway di Konsol ASM. Lihat Mencari alamat IP gerbang masuk instans ASM.
Buka
http://<gateway-ip>/productpagedi browser. Bidang Reviews served by dan peringkat bintang mengidentifikasi versi yang melayani setiap permintaan. Refresh halaman beberapa kali — permintaan didistribusikan ke v1, v2, dan v3. Misalnya,reviews-v2menampilkan bintang hitam:
Langkah 2: Konfigurasikan aturan fallback dasar
Arahkan seluruh traffic ke reviews-v3 dan tetapkan reviews-v2 sebagai target fallback.
Buat file bernama
reviews-route-fallback-sample1.yaml: Fieldfallback.targetmemberi tahu proxy sidecar untuk meneruskan permintaan kereviews-v2ketikareviews-v3tidak dapat dijangkau.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: reviews-route namespace: default spec: hosts: - reviews http: - route: - destination: host: reviews subset: v3 fallback: target: host: reviews subset: v2Terapkan VirtualService:
kubectl apply -f reviews-route-fallback-sample1.yamlBuka
http://<gateway-ip>/productpagedan refresh. Semua permintaan sekarang diarahkan ke v3 (bintang merah).
Simulasikan kegagalan v3 dengan mengatur jumlah replika deployment-nya menjadi nol:
kubectl scale deployment reviews-v3 --replicas=0Refresh halaman. Permintaan sekarang dialihkan ke v2 (bintang hitam).
Langkah 3: Gabungkan fallback dengan routing berbasis bobot
Aturan fallback bekerja bersamaan dengan routing berbasis bobot. Dalam skenario ini, traffic dibagi 50/50 antara v3 dan v2, dan masing-masing versi memiliki target fallback sendiri.
Pulihkan v3:
kubectl scale deployment reviews-v3 --replicas=1Buat file bernama
reviews-route-fallback-sample2.yaml: Dua rantai fallback independen didefinisikan: Retries dinonaktifkan (attempts: 0) untuk mengisolasi perilaku fallback dari retry selama pengujian.Traffic v3 (50%): dialihkan ke v2 jika v3 tidak tersedia
Traffic v2 (50%): dialihkan ke v1 jika v2 tidak tersedia
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: reviews-route namespace: default spec: hosts: - reviews http: - route: - destination: host: reviews subset: v3 fallback: target: host: reviews subset: v2 weight: 50 - destination: host: reviews subset: v2 fallback: target: host: reviews subset: v1 weight: 50 retries: attempts: 0Terapkan VirtualService yang diperbarui:
kubectl apply -f reviews-route-fallback-sample2.yamlRefresh halaman produk. Permintaan didistribusikan merata antara v3 (bintang merah) dan v2 (bintang hitam).
Uji fallback saat v3 mati
Atur replika v3 menjadi nol: Refresh halaman. Semua permintaan sekarang mencapai v2: 50% yang awalnya ditujukan ke v3 dialihkan ke v2, dan 50% lainnya langsung diarahkan ke v2.
kubectl scale deployment reviews-v3 --replicas=0
Uji fallback saat v3 dan v2 mati
Atur replika v2 menjadi nol: Refresh halaman. Dua perilaku bergantian:

50% permintaan berhasil: Ini adalah permintaan yang awalnya diarahkan ke v2, yang kemudian dialihkan ke v1 (tanpa bintang).
50% permintaan gagal dengan error 503: Ini adalah permintaan yang awalnya diarahkan ke v3. Proxy mencoba mengalihkan ke v2, tetapi v2 juga mati, sehingga rantai fallback tidak berlanjut ke v1.
kubectl scale deployment reviews-v2 --replicas=0Konfirmasi hal ini di log: Fallback yang gagal menghasilkan entri log seperti berikut: Field kunci dalam log fallback yang gagal:
response_code:503menunjukkan permintaan tidak dilayani.response_flags:UH(Upstream Host Unhealthy).fallback_result:"fallback cluster is unhealthy"menunjukkan target fallback (v2) juga tidak tersedia.upstream_cluster: tetap menunjukkan cluster v3, mengonfirmasi tujuan routing awal.
kubectl logs -f deployment/productpage-v1 -c istio-proxy --tail=10{ "authority": "reviews:9080", "authority_for": "reviews:9080", "bytes_received": "0", "bytes_sent": "19", "downstream_local_address": "192.168.255.46:9080", "downstream_remote_address": "172.16.0.252:47738", "duration": "0", "fallback_path": "outbound|9080|v3|reviews.default.svc.cluster.local:outbound|9080|v2|reviews.default.svc.cluster.local", "fallback_final_cluster_name": "-", "fallback_result": "fallback cluster is unhealthy", "istio_policy_status": "-", "method": "GET", "path": "/reviews/0", "protocol": "HTTP/1.1", "request_id": "b207a764-b6d7-4ef8-bc71-59f264c3****", "requested_server_name": "-", "response_code": "503", "response_flags": "UH", "route_name": "-", "start_time": "2023-05-30T07:32:08.999Z", "trace_id": "a40c32a7b2cf****", "upstream_cluster": "outbound|9080|v3|reviews.default.svc.cluster.local", "upstream_host": "-", "upstream_local_address": "-", "upstream_service_time": "-", "upstream_transport_failure_reason": "-", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36", "x_forwarded_for": "-" }
Gunakan fallback di lingkungan produksi
Routing fallback menyembunyikan kegagalan layanan, yang bermanfaat untuk ketersediaan tetapi memerlukan perencanaan cermat di lingkungan produksi.
Pantau frekuensi fallback
Laju fallback yang tinggi secara berkelanjutan mengindikasikan adanya masalah mendasar pada versi layanan utama. Siapkan alert berdasarkan field log akses fallback_result untuk mendeteksi saat fallback dipicu berulang kali, alih-alih mengandalkannya sebagai failover diam-diam.
Perencanaan kapasitas
Saat fallback dipicu, target fallback menerima traffic tambahan di luar beban normalnya. Pastikan versi layanan fallback memiliki kapasitas cukup untuk menangani traffic reguler sekaligus traffic yang dialihkan. Dalam skenario routing berbasis bobot pada Langkah 3, v2 harus mampu menangani hingga 100% total traffic jika v3 mati.
Kedalaman rantai fallback
Fallback tidak berantai secara otomatis ke beberapa hop. Dalam contoh routing berbasis bobot, ketika v3 dialihkan ke v2 dan v2 juga mati, permintaan gagal dengan error 503 — tidak dilanjutkan ke v1. Setiap entri rute memiliki target fallback independen sendiri. Rencanakan rantai fallback Anda sesuai kebutuhan.
