Service Mesh (ASM) memungkinkan Anda mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan timur-barat antara layanan tertentu dan pada rute tertentu. Dengan cara ini, proxy ASM menolak permintaan dari layanan upstream yang mengalami kegagalan, mewujudkan pemutusan sirkuit trafik secara non-intrusif. Topik ini menjelaskan cara menggunakan CustomResourceDefinitions (CRD) ASMCircuitBreaker untuk mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan timur-barat.
Informasi latar belakang
Pemutusan sirkuit trafik adalah mekanisme perlindungan terhadap beban berlebih, yang utamanya digunakan untuk mencegah sistem runtuh akibat lonjakan trafik dalam periode waktu singkat. Dalam kasus panggilan timur-barat antara layanan cloud-native, kegagalan satu layanan (seperti respons lambat atau peningkatan tingkat kegagalan) dapat menyebabkan kegagalan berantai di seluruh serangkaian layanan dalam jejak.
Anda dapat mengonfigurasi aturan pemutusan sirkuit untuk trafik panggilan timur-barat antar layanan untuk menolak permintaan dari layanan upstream ketika tingkat kegagalan atau jumlah batas waktu respons mencapai ambang batas yang sesuai. Ini melindungi layanan upstream dan secara efektif mencegah kegagalan memengaruhi seluruh jejak dan menyebabkan seluruh sistem runtuh.
Setelah Anda mengonfigurasi aturan pemutusan sirkuit, setiap proxy ASM menghitung tingkat kegagalan atau jumlah batas waktu respons berdasarkan permintaan yang diterimanya. Oleh karena itu, untuk layanan upstream yang sama yang mengalami kegagalan, waktu pemutusan sirkuit yang terjadi pada proxy ASM yang berbeda mungkin sedikit berbeda.
Prasyarat
Sebuah instance ASM Edisi Enterprise atau Edisi Ultimate telah dibuat, dan versi instance ASM tersebut adalah V1.14.3 atau lebih baru. Untuk informasi lebih lanjut, lihat Buat Instance ASM.
Aplikasi sampel, sleep dan httpbin, telah diterapkan. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi HTTPBin di Kluster Container Service for Kubernetes (ACK) pada Bidang Data dan Terapkan Layanan Sleep di Kluster pada Bidang Data.
Langkah 1: Konfigurasikan routing jalur permintaan untuk trafik timur-barat antara layanan sleep dan httpbin
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Gunakan salah satu metode berikut untuk membuat layanan virtual:
Gunakan Konsol ASM
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create.
Pilih namespace dari daftar drop-down Namespace dan masukkan nama untuk layanan virtual yang akan dibuat di bidang Name. Di bagian Gateways, aktifkan sakelar di sebelah Apply To All Sidecars.
Di bagian Hosts, klik Add Host untuk menambahkan layanan httpbin.
Di bagian HTTP Route, klik Add Route dan konfigurasikan parameter seperti yang ditunjukkan pada gambar berikut.



Gunakan template YAML
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create from YAML.
Salin konten yang ditampilkan di blok kode berikut ke editor kode YAML dan klik Create.
Tabel berikut menjelaskan hubungan antara permintaan dan jalur.
Jalur Permintaan
Jenis Pencocokan
Nama Rute
Deskripsi
/status/500Pencocokan tepat
error-routeKode status 500 selalu dikembalikan.
/delayPencocokan awalan
delay-routeKode status 200 dikembalikan setelah waktu yang ditentukan berlalu. Untuk detail tentang cara menggunakan permintaan /delay, lihat delay.
/*Jalur apa pun
default-routeRute default.
Langkah 2: Konfigurasikan aturan pemutusan sirkuit
Bagian ini menjelaskan cara mengonfigurasi pemutusan sirkuit berdasarkan tingkat kesalahan dan jumlah permintaan lambat, serta hasil pengujian.
Konfigurasikan pemutusan sirkuit berdasarkan tingkat kesalahan
Pemutusan sirkuit berbasis tingkat kesalahan berarti bahwa pemutusan sirkuit dipicu ketika tingkat kesalahan respons server yang terdeteksi dalam jendela waktu tertentu melebihi ambang batas yang ditentukan.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih .
Di halaman yang muncul, klik Buat. Di halaman Create, salin konten yang ditampilkan di blok kode berikut ke editor kode YAML dan klik Create.
Tabel berikut menjelaskan parameter dalam konfigurasi pemutusan sirkuit.
Parameter
Deskripsi
workloadSelector.labels
Workload layanan downstream. Dalam contoh ini, workload layanan downstream adalah layanan sleep. Oleh karena itu, label
app: sleepdigunakan untuk memilih layanan sleep.break_duration
Durasi antara waktu pemutusan sirkuit dipicu dan waktu akses ke layanan httpbin dipulihkan. Dalam contoh ini, nilainya diatur menjadi 60 detik.
window_size
Jendela waktu di mana tingkat kesalahan permintaan dideteksi. Dalam contoh ini, nilainya diatur menjadi 10 detik. Ini menunjukkan bahwa jika tingkat kesalahan permintaan pada rute melebihi ambang batas yang ditentukan dalam 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.
error_percent
Tingkat kesalahan permintaan dalam jendela waktu tertentu yang digunakan untuk menentukan apakah pemutusan sirkuit dipicu. Dalam contoh ini, nilainya diatur menjadi 60. Ini menunjukkan bahwa jika tingkat kesalahan permintaan pada rute melebihi 60% dalam jendela waktu 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.
min_request_amount
Jumlah minimum permintaan yang diperlukan untuk memicu pemutusan sirkuit dalam jendela waktu. Anda dapat mengonfigurasi parameter ini untuk mencegah pemutusan sirkuit dipicu secara keliru karena jumlah permintaan yang sedikit.
Dalam contoh ini, nilainya diatur menjadi 5. Ini menunjukkan bahwa pemutusan sirkuit hanya dipicu ketika lebih dari lima permintaan dikirim pada rute tertentu dalam jendela waktu 10 detik dan tingkat kesalahan melebihi 60%.
custom_response
Konten respons kustom yang dikembalikan ketika proxy ASM menolak permintaan setelah pemutusan sirkuit dipicu.
Parameter body diatur ke
error break!. Ini menunjukkan bahwa badan respons kustom adalaherror break!.Parameter header_to_add diatur ke
x-envoy-overload: 'true'. Ini menunjukkan bahwax-envoy-overload: 'true'ditambahkan ke header respons permintaan yang ditolak setelah pemutusan sirkuit dipicu.Parameter status_code diatur ke
499. Ini menunjukkan bahwa kode respons499dikembalikan untuk permintaan setelah pemutusan sirkuit dipicu.
match.vhost
Rute. Rute harus cocok dengan rute yang dideklarasikan dalam layanan virtual.
name: Harus diatur ke nama domain layanan upstream dalam jejak. Dalam contoh ini, nilainya diatur ke nama domain layanan httpbin,
httpbin.default.svc.cluster.local. Layanan httpbin adalah layanan upstream dari layanan sleep.port: Harus diatur ke port layanan layanan upstream. Dalam contoh ini, nilainya diatur ke port layanan layanan httpbin,
8000.route.name_match: Harus diatur ke nama rute yang dikonfigurasi dalam layanan virtual. Konfigurasi pemutusan sirkuit berlaku pada rute yang sesuai. Dalam contoh ini, nilainya diatur ke
error-routeyang dikonfigurasi di Langkah 2. Kode status 500 selalu dikembalikan untuk permintaan yang cocok dengan rute ini. Ini memastikan bahwa pemutusan sirkuit dipicu.
Gunakan kubectl untuk terhubung ke kluster ACK dan jalankan perintah berikut:
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Output yang Diharapkan:
Output menunjukkan bahwa ketika permintaan keenam dikirim, pemutusan sirkuit dipicu. Setelah pemutusan sirkuit dipicu, kode status 499 dikembalikan untuk permintaan berikutnya. Pemutusan sirkuit berlaku selama 60 detik.
Selama pemutusan sirkuit, Anda dapat menjalankan perintah berikut untuk mengakses jalur lain dari layanan httpbin:
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/503 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Output yang Diharapkan:
Output menunjukkan bahwa permintaan yang dikirim ke jalur lain dari layanan httpbin tidak terpengaruh oleh konfigurasi pemutusan sirkuit untuk rute
error-routedan dapat direspons secara normal oleh layanan httpbin.
Konfigurasikan pemutusan sirkuit berdasarkan jumlah permintaan lambat
Pemutusan sirkuit berbasis permintaan lambat berarti bahwa pemutusan sirkuit dipicu ketika jumlah permintaan lambat yang terdeteksi dalam jendela waktu tertentu melebihi ambang batas yang ditentukan. Permintaan yang waktu responsnya melebihi ambang batas dalam jendela waktu tertentu disebut permintaan lambat.
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
Di halaman Mesh Management, klik nama instance ASM. Di panel navigasi kiri, pilih .
Di halaman yang muncul, klik Buat. Di halaman Create, salin konten yang ditampilkan di blok kode berikut ke editor kode YAML dan klik Create.
Tabel berikut menjelaskan parameter dalam konfigurasi pemutusan sirkuit.
Parameter
Deskripsi
workloadSelector.labels
Workload layanan downstream. Dalam contoh ini, workload layanan downstream adalah layanan sleep. Oleh karena itu, label
app: sleepdigunakan untuk memilih layanan sleep.break_duration
Durasi antara waktu pemutusan sirkuit dipicu dan waktu akses ke layanan httpbin dipulihkan. Dalam contoh ini, nilainya diatur menjadi 60 detik.
window_size
Jendela waktu di mana tingkat kesalahan permintaan dideteksi. Dalam contoh ini, nilainya diatur menjadi 10 detik. Ini menunjukkan bahwa jika jumlah permintaan lambat pada rute melebihi ambang batas yang ditentukan dalam 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.
slow_request_rt
Waktu respons dasar yang digunakan untuk menentukan permintaan lambat. Dalam contoh ini, nilainya diatur menjadi 0,5 detik. Ini menunjukkan bahwa permintaan dengan waktu respons lebih dari 0,5 detik dianggap sebagai permintaan lambat.
max_slow_requests
Jumlah maksimum permintaan lambat yang diizinkan dalam jendela waktu sebelum pemutusan sirkuit dipicu. Dalam contoh ini, nilainya diatur menjadi 5. Ini menunjukkan bahwa jika lebih dari lima permintaan lambat terjadi dalam jendela waktu 10 detik, pemutusan sirkuit dipicu dan permintaan ditolak.
min_request_amount
Jumlah minimum permintaan yang diperlukan untuk memicu pemutusan sirkuit dalam jendela waktu. Anda dapat mengonfigurasi parameter ini untuk mencegah pemutusan sirkuit dipicu secara keliru karena jumlah permintaan yang sedikit.
Dalam contoh ini, nilainya diatur menjadi 5. Ini menunjukkan bahwa pemutusan sirkuit hanya dipicu ketika lebih dari 5 permintaan dikirim pada rute tertentu dalam jendela waktu 10 detik dan jumlah permintaan lambat melebihi 5.
custom_response
Konten respons kustom yang dikembalikan ketika proxy ASM menolak permintaan setelah pemutusan sirkuit dipicu.
Parameter body diatur ke
error break!. Ini menunjukkan bahwa badan respons kustom adalaherror break!.Parameter header_to_add diatur ke
x-envoy-overload: 'true'. Ini menunjukkan bahwax-envoy-overload: 'true'ditambahkan ke header respons permintaan yang ditolak setelah pemutusan sirkuit dipicu.Parameter status_code diatur ke
498. Ini menunjukkan bahwa kode respons498dikembalikan untuk permintaan setelah pemutusan sirkuit dipicu.
match.vhost
Rute. Rute harus cocok dengan rute yang dideklarasikan dalam layanan virtual.
name: Harus diatur ke nama domain layanan upstream dalam jejak. Dalam contoh ini, nilainya diatur ke nama domain layanan httpbin,
httpbin.default.svc.cluster.local. Layanan httpbin adalah layanan upstream dari layanan sleep.port: Harus diatur ke port layanan layanan upstream. Dalam contoh ini, nilainya diatur ke port layanan layanan httpbin,
8000.route.name_match: Harus diatur ke nama rute yang dikonfigurasi dalam layanan virtual. Konfigurasi pemutusan sirkuit berlaku pada rute yang sesuai. Dalam contoh ini, nilainya diatur ke
delay-routeyang dikonfigurasi di Langkah 2. Permintaan yang cocok dengan rute ini dapat dikonfigurasi secara manual untuk merespons lebih dari 0,5 detik. Ini memastikan bahwa pemutusan sirkuit dipicu.
Gunakan kubectl untuk terhubung ke kluster ACK dan jalankan perintah berikut:
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/delay/1 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Output yang Diharapkan:
Output menunjukkan bahwa ketika permintaan keenam dikirim, pemutusan sirkuit dipicu. Setelah pemutusan sirkuit dipicu, kode status 498 dikembalikan untuk permintaan berikutnya. Pemutusan sirkuit berlaku selama 60 detik.
Selama pemutusan sirkuit, Anda dapat menjalankan perintah berikut untuk menguji pemutusan sirkuit berbasis tingkat kesalahan yang dikonfigurasikan di Langkah 3:
for i in {1..100}; do kubectl exec -it deploy/sleep -- curl httpbin:8000/status/500 -I | grep 'HTTP'; echo ''; sleep 0.1; done;Output yang Diharapkan:
Output di atas menunjukkan bahwa aturan pemutusan sirkuit yang dikonfigurasikan pada rute yang berbeda tidak saling memengaruhi. Anda dapat mengonfigurasi aturan pemutusan sirkuit secara fleksibel untuk trafik panggilan layanan timur-barat dengan karakteristik yang berbeda untuk menerapkan pemutusan sirkuit sesuai dengan kebutuhan bisnis Anda.
Operasi terkait
Lihat metrik terkait pemutusan sirkuit tingkat layanan
Untuk instance ASM versi V1.22.6.28 dan yang lebih baru, Anda dapat melihat metrik terkait pemutusan sirkuit tingkat layanan yang dikonfigurasi menggunakan CRD ASMCircuitBreaker.
Metrik | Tipe | Deskripsi |
envoy_asm_circuit_breaker_total_broken_requests | Counter | Jumlah total permintaan yang ditolak karena pemutusan sirkuit |
Anda dapat mengonfigurasi proxyStatsMatcher dari proxy sidecar untuk melaporkan metrik terkait.
Setelah Anda memilih proxyStatsMatcher, pilih Pencocokan Ekspresi Reguler dan atur nilainya ke
.*circuit_breaker.*. Untuk informasi lebih lanjut, lihat proxyStatsMatcher.Redeploy layanan httpbin agar konfigurasi proxy baru berlaku. Untuk informasi lebih lanjut, lihat Redeploy Workload.
Lakukan Langkah 1 dan Langkah 2 lagi untuk mengonfigurasi ulang pemutusan sirkuit.
Jalankan perintah berikut untuk melihat metrik pemutusan sirkuit tingkat layanan dari layanan httpbin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep asm_circuit_breakerOutput yang Diharapkan:
# TYPE envoy_asm_circuit_breaker_total_broken_requests counter envoy_asm_circuit_breaker_total_broken_requests{cluster="outbound|8000||httpbin.default.svc.cluster.local",uuid="af7cf7ad-67e8-49c5-b5fe-xxxxxxxxx"} 1430 # TYPE envoy_total_asm_circuit_breakers gauge envoy_total_asm_circuit_breakers{} 1
Konfigurasikan pengumpulan metrik dan peringatan untuk pemutusan sirkuit tingkat layanan
Setelah Anda mengonfigurasi metrik terkait pemutusan sirkuit tingkat layanan, Anda dapat mengonfigurasi pengaturan untuk mengumpulkan metrik ke Prometheus dan mengonfigurasi aturan peringatan berdasarkan metrik utama. Dengan cara ini, peringatan dapat dihasilkan ketika pemutusan sirkuit terjadi. Bagian berikut menunjukkan cara mengonfigurasi pengumpulan metrik dan peringatan untuk pemutusan sirkuit tingkat layanan. Dalam contoh ini, Managed Service for Prometheus digunakan.
Di Managed Service for Prometheus, Anda dapat menghubungkan kluster pada bidang data ke komponen Alibaba Cloud ASM atau meningkatkan komponen Alibaba Cloud ASM ke versi terbaru. Ini memastikan bahwa metrik terkait pemutusan sirkuit yang diekspos dapat dikumpulkan oleh Managed Service for Prometheus. Untuk informasi lebih lanjut tentang cara mengintegrasikan komponen ke ARMS, lihat Manajemen Komponen. (Jika Anda telah mengonfigurasi pengaturan untuk menggunakan instance Prometheus yang dikelola sendiri untuk mengumpulkan metrik instance ASM dengan merujuk ke Pantau Instance ASM Menggunakan Instance Prometheus yang Dikelola Sendiri, Anda tidak perlu melakukan langkah ini.)
Buat aturan peringatan untuk pemutusan sirkuit tingkat layanan. Untuk informasi lebih lanjut, lihat Gunakan Pernyataan PromQL Kustom untuk Membuat Aturan Peringatan. Contoh berikut menunjukkan cara menentukan parameter utama untuk mengonfigurasi aturan peringatan. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter lainnya, lihat dokumentasi sebelumnya.
Parameter
Contoh
Deskripsi
Pernyataan PromQL Kustom
(sum by(cluster, namespace) (increase(envoy_asm_circuit_breaker_total_broken_requests[1m]))) > 0
Pernyataan increase menanyakan jumlah permintaan yang ditolak karena pemutusan sirkuit dalam satu menit terakhir. Jumlah permintaan dikelompokkan berdasarkan namespace dan nama layanan yang memicu pemutusan sirkuit. Peringatan dilaporkan ketika jumlah permintaan yang ditolak karena pemutusan sirkuit dalam satu menit lebih besar dari 0.
Pesan Peringatan
Pemutusan sirkuit tingkat layanan terjadi. Namespace: {{$labels.namespace}}, Layanan yang memicu pemutusan sirkuit: {{$labels.cluster}}. Jumlah permintaan yang ditolak karena pemutusan sirkuit dalam satu menit saat ini: {{ $value }}
Informasi peringatan menunjukkan namespace layanan yang memicu pemutusan sirkuit, nama layanan, dan jumlah permintaan yang dikirim ke layanan tetapi ditolak karena pemutusan sirkuit dalam satu menit terakhir.