Service Mesh (ASM) memungkinkan Anda mengonfigurasi aturan pemutusan sirkuit untuk lalu lintas timur-barat antar layanan tertentu dan pada rute tertentu. Aturan ini memungkinkan proxy mesh secara aktif menolak permintaan ke layanan hulu yang bermasalah, sehingga menyediakan kemampuan pemutusan sirkuit trafik non-intrusif. Topik ini menjelaskan cara menggunakan CRD ASMCircuitBreaker untuk mengonfigurasi aturan pemutusan sirkuit bagi lalu lintas timur-barat.
Latar Belakang
Pemutusan sirkuit adalah mekanisme perlindungan terhadap beban berlebih yang mencegah sistem crash akibat lonjakan trafik mendadak. Di lingkungan cloud-native dengan lalu lintas timur-barat antar layanan, satu layanan yang gagal—misalnya, layanan yang merespons lambat atau memiliki tingkat error tinggi—dapat memicu reaksi berantai yang berujung pada kegagalan kaskade di seluruh rantai panggilan.
Aturan pemutusan sirkuit untuk lalu lintas timur-barat secara otomatis "memutus sirkuit" dan menolak permintaan ke layanan hulu ketika ambang batas tingkat error atau timeout respons terlampaui. Hal ini melindungi layanan hulu, mencegah penyebaran gangguan, serta membantu menghindari gangguan sistem secara keseluruhan.
Setelah Anda mengonfigurasi aturan pemutusan sirkuit, setiap proxy mesh secara independen menghitung tingkat error atau jumlah permintaan lambat dari trafik yang ditanganinya. Akibatnya, proxy mesh di sisi klien yang berbeda mungkin memutus sirkuit pada waktu yang sedikit berbeda untuk layanan hulu yang sama.
Prasyarat
-
Anda memiliki instans ASM Edisi Profesional versi 1.14.3 atau lebih baru. Untuk informasi selengkapnya, lihat Buat instans ASM.
-
Aplikasi contoh
sleepdanhttpbintelah dideploy. Untuk informasi selengkapnya, lihat Deploy aplikasi httpbin di kluster bidang data dan Deploy layanan sleep di kluster bidang data.
Langkah 1: Konfigurasikan perutean berdasarkan path permintaan
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Buat layanan virtual dengan salah satu metode berikut.
Gunakan konsol
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create.
-
Tentukan Namespace dan Host, lalu aktifkan Gateways > Apply To All Sidecars.
-
Pada bagian Hosts, klik Add Host untuk menambahkan layanan httpbin.
-
Pada bagian HTTP Route, klik Add Route dan konfigurasikan rute sebagai berikut.
Atur nama rute menjadi
error-route. Aktifkan Match Request URI, pilih Exact sebagai tipe pencocokan, lalu masukkan/status/500sebagai konten pencocokan. Atur nama layanan tujuan menjadihttpbin.default.svc.cluster.local.Atur nama rute menjadi delay-route. Aktifkan Match Request URI, pilih Prefix sebagai tipe pencocokan, lalu masukkan
/delaysebagai konten pencocokan. Atur nama layanan tujuan menjadihttpbin.default.svc.cluster.local.Atur nama rute menjadi
default-route. Jangan tambahkan aturan pencocokan permintaan apa pun. Atur nama layanan tujuan menjadihttpbin.default.svc.cluster.local, dan biarkan kolom versi, bobot, serta port kosong.Gunakan YAML
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih . Pada halaman yang muncul, klik Create from YAML.
-
Di editor YAML, tempel konten berikut lalu klik Create.
Tabel berikut memetakan path permintaan ke rute.
Path permintaan
Tipe pencocokan
Rute
Deskripsi
/status/500Exact
error-routeSelalu mengembalikan kode status 500.
/delayPrefix
delay-routeMengembalikan kode status 200 setelah penundaan tertentu. Untuk informasi selengkapnya tentang penggunaan path /delay, lihat delay.
/*Path apa pun
default-routeRute default.
-
Langkah 2: Konfigurasikan pemutusan sirkuit
Bagian ini menjelaskan cara mengonfigurasi dan menguji pemutusan sirkuit berbasis tingkat error serta pemutusan sirkuit berbasis permintaan lambat.
Tingkat error
Pemutusan sirkuit berbasis tingkat error memutus sirkuit ketika tingkat error dari respons server melebihi ambang batas dalam jendela waktu tertentu.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Create, tempel konten berikut ke editor YAML lalu klik Create.
Tabel berikut menjelaskan parameter dalam konfigurasi pemutusan sirkuit.
Parameter
Deskripsi
workloadSelector.labels
Beban kerja layanan downstream tempat aturan pemutusan sirkuit diterapkan. Dalam contoh ini, layanan downstream adalah layanan sleep, yang dipilih berdasarkan label
app: sleep.break_duration
Durasi sirkuit tetap terbuka setelah diputus. Dalam contoh ini, nilainya adalah 60s.
window_size
Jendela waktu untuk deteksi pemutusan sirkuit. Dalam contoh ini, nilainya adalah 10s. Artinya, jika tingkat error permintaan pada rute melebihi ambang batas yang ditentukan dalam 10 detik, pemutus sirkuit akan aktif dan menolak permintaan.
error_percent
Ambang batas tingkat error permintaan yang diperlukan untuk mengaktifkan pemutus sirkuit dalam jendela waktu tersebut. Dalam contoh ini, nilainya adalah 60. Artinya, jika tingkat error permintaan pada rute melebihi 60% dalam jendela waktu 10s, pemutus sirkuit akan aktif dan menolak permintaan.
min_request_amount
Jumlah minimum permintaan yang diperlukan untuk mengaktifkan pemutus sirkuit dalam jendela waktu tersebut. Parameter ini mencegah pemutus sirkuit aktif karena jumlah permintaan yang sangat sedikit.
Dalam contoh ini, nilainya adalah 5. Artinya, pemutus sirkuit hanya akan aktif jika lebih dari 5 permintaan dikirim pada rute tersebut dalam jendela waktu 10s dan tingkat error melebihi 60%.
custom_response
Respons kustom yang dikembalikan oleh proxy mesh untuk permintaan yang ditolak setelah pemutus sirkuit aktif.
-
bodydiatur keerror break!. Badan respons adalaherror break!. -
header_to_adddiatur kex-envoy-overload: 'true'. Headerx-envoy-overload: 'true'ditambahkan ke respons saat sirkuit terbuka. -
status_codediatur ke499. Kode respons untuk permintaan adalah499setelah sirkuit terbuka.
match.vhost
Entri rute tempat pemutusan sirkuit dikonfigurasi. Entri rute harus sesuai dengan entri rute tertentu yang dideklarasikan dalam layanan virtual.
-
name: Nama domain layanan hulu dalam rantai panggilan. Dalam contoh ini, parameter ini diatur kehttpbin.default.svc.cluster.local, yaitu nama domain layanan httpbin (layanan hulu dari layanan sleep). -
port: Port layanan dari layanan hulu. Dalam contoh ini, parameter ini diatur ke8000, yaitu port layanan dari layanan httpbin. -
route.name_match: Nama aktual entri rute dalam layanan virtual. Konfigurasi pemutusan sirkuit berlaku pada rute ini. Dalam contoh ini, parameter ini diatur keerror-route, yaitu entri rute yang dibuat di Langkah 1. Permintaan yang sesuai dengan entri rute ini selalu mengembalikan kode status 500, sehingga memastikan pemutus sirkuit dapat aktif.
-
-
Sambungkan ke kluster ACK menggunakan kubectl 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:
Seperti yang ditunjukkan output, pemutus sirkuit aktif pada permintaan keenam. Permintaan berikutnya mengembalikan kode respons kustom 499. Sirkuit tetap terbuka selama 60 detik.
-
Saat sirkuit terbuka, coba akses path 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:
Permintaan ke path lain layanan tidak terpengaruh oleh konfigurasi pemutusan sirkuit pada entri rute
error-routedan masih dapat mengembalikan konten respons dari layanan httpbin.
Permintaan lambat
Pemutusan sirkuit berbasis permintaan lambat memutus sirkuit ketika jumlah "permintaan lambat"—permintaan yang melebihi ambang batas waktu respons—melampaui batas dalam jendela waktu tertentu.
-
Masuk ke Konsol ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
-
Pada halaman Create, tempel konten berikut ke editor YAML lalu klik Create.
Tabel berikut menjelaskan parameter dalam konfigurasi pemutusan sirkuit.
Parameter
Deskripsi
workloadSelector.labels
Beban kerja layanan downstream tempat aturan pemutusan sirkuit diterapkan. Dalam contoh ini, layanan downstream adalah layanan sleep, yang dipilih berdasarkan label
app: sleep.break_duration
Durasi sirkuit tetap terbuka setelah diputus. Dalam contoh ini, nilainya adalah 60s.
window_size
Jendela waktu untuk deteksi pemutusan sirkuit. Dalam contoh ini, nilainya adalah 10s. Artinya, jika jumlah permintaan lambat pada rute melebihi ambang batas yang ditentukan dalam 10 detik, pemutus sirkuit akan aktif dan menolak permintaan.
slow_request_rt
Ambang batas waktu respons untuk permintaan lambat. Dalam contoh ini, nilainya adalah 0.5s. Artinya, permintaan dengan waktu respons lebih dari 0.5s dianggap sebagai permintaan lambat.
max_slow_requests
Jumlah permintaan lambat yang diperlukan untuk mengaktifkan pemutus sirkuit dalam jendela waktu tersebut. Dalam contoh ini, nilainya adalah 5. Artinya, jika lebih dari 5 permintaan lambat terjadi dalam jendela waktu 10s, pemutus sirkuit akan aktif dan menolak permintaan.
min_request_amount
Jumlah minimum permintaan yang diperlukan untuk mengaktifkan pemutus sirkuit dalam jendela waktu tersebut. Parameter ini mencegah pemutus sirkuit aktif karena jumlah permintaan yang sangat sedikit.
Dalam contoh ini, nilainya adalah 5. Artinya, pemutus sirkuit hanya akan aktif jika lebih dari 5 permintaan dikirim pada rute tersebut dalam jendela waktu 10s dan jumlah permintaan lambat melebihi 5.
custom_response
Respons kustom yang dikembalikan oleh proxy mesh untuk permintaan yang ditolak setelah pemutus sirkuit aktif.
-
bodydiatur kedelay break!. Badan respons adalahdelay break!. -
header_to_adddiatur kex-envoy-overload: 'true'. Headerx-envoy-overload: 'true'ditambahkan ke respons saat sirkuit terbuka. -
status_codediatur ke498. Kode respons untuk permintaan adalah498setelah sirkuit terbuka.
match.vhost
Entri rute tempat pemutusan sirkuit dikonfigurasi. Entri rute harus sesuai dengan entri rute tertentu yang dideklarasikan dalam layanan virtual.
-
name: Nama domain layanan hulu dalam rantai panggilan. Dalam contoh ini, parameter ini diatur kehttpbin.default.svc.cluster.local, yaitu nama domain layanan httpbin (layanan hulu dari layanan sleep). -
port: Port layanan dari layanan hulu. Dalam contoh ini, parameter ini diatur ke8000, yaitu port layanan dari layanan httpbin. -
route.name_match: Nama aktual entri rute dalam layanan virtual. Konfigurasi pemutusan sirkuit berlaku pada rute ini. Dalam contoh ini, parameter ini diatur kedelay-route, yaitu entri rute yang dibuat di Langkah 1. Anda dapat menentukan secara manual waktu respons lebih dari 0.5 detik untuk permintaan yang sesuai dengan rute ini. Hal ini memastikan pemutus sirkuit dapat aktif.
-
-
Sambungkan ke kluster ACK menggunakan kubectl 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:
Seperti yang ditunjukkan output, pemutus sirkuit aktif pada permintaan keenam. Permintaan berikutnya mengembalikan kode respons kustom 498. Sirkuit tetap terbuka selama 60 detik.
-
Saat pemutus sirkuit berbasis permintaan lambat aktif, jalankan perintah berikut untuk menguji pemutus sirkuit berbasis tingkat error yang telah Anda konfigurasi di bagian sebelumnya.
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 aturan pemutusan sirkuit yang dikonfigurasi pada entri rute berbeda beroperasi secara independen. Hal ini memungkinkan Anda mengonfigurasi kebijakan pemutusan sirkuit spesifik untuk berbagai jenis lalu lintas timur-barat.
Operasi terkait
Lihat metrik pemutusan sirkuit tingkat layanan
Di ASM v1.22.6.28 dan versi lebih baru, Anda dapat melihat dan menggunakan metrik pemutusan sirkuit tingkat layanan untuk ASMCircuitBreaker.
|
Metrik |
Tipe |
Deskripsi |
|
envoy_asm_circuit_breaker_total_broken_requests |
Counter |
Jumlah total permintaan yang ditolak oleh ASMCircuitBreaker. |
Anda dapat mengonfigurasi proxyStatsMatcher untuk proxy sidecar agar melaporkan metrik tersebut.
-
Saat mengonfigurasi proxyStatsMatcher, pilih Regular Expression Match dan atur nilainya ke
.*circuit_breaker.*. Untuk informasi selengkapnya, lihat proxyStatsMatcher. -
Redeploy aplikasi httpbin untuk menerapkan konfigurasi proxy baru. Untuk informasi selengkapnya, lihat Redeploy workloads.
-
Lakukan Langkah 1 dan Langkah 2 lagi untuk mengonfigurasi ulang pemutusan sirkuit.
-
Jalankan perintah berikut untuk melihat metrik pemutusan sirkuit tingkat layanan untuk 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
Setelah Anda mengonfigurasi pelaporan metrik pemutusan sirkuit tingkat layanan, Anda dapat mengumpulkan metrik ini di Prometheus dan membuat aturan peringatan untuk notifikasi tepat waktu mengenai kejadian pemutusan sirkuit. Contoh berikut menunjukkan cara mengonfigurasi pengumpulan metrik dan peringatan pemutusan sirkuit tingkat layanan menggunakan Managed Service for Prometheus.
-
Di Managed Service for Prometheus, tambahkan komponen Alibaba Cloud ASM ke kluster bidang data atau upgrade komponen ke versi terbaru untuk memastikan Managed Service for Prometheus dapat mengumpulkan metrik pemutusan sirkuit yang diekspos. Untuk informasi selengkapnya tentang cara menambahkan komponen, lihat Manajemen komponen. Jika Anda telah mengintegrasikan instans Prometheus self-managed untuk memantau service mesh guna mengumpulkan metrik service mesh, Anda tidak perlu melakukan operasi tambahan.
-
Buat aturan peringatan untuk pemutusan sirkuit tingkat layanan. Untuk informasi selengkapnya, lihat Buat aturan peringatan Prometheus menggunakan pernyataan PromQL kustom. Tabel berikut memberikan contoh cara mengonfigurasi parameter kunci untuk aturan peringatan. Anda dapat mengonfigurasi parameter lain berdasarkan kebutuhan bisnis seperti yang dijelaskan dalam dokumentasi.
Parameter
Contoh
Deskripsi
Custom PromQL statement
(sum by(cluster, namespace) (increase(envoy_asm_circuit_breaker_total_broken_requests[1m]))) > 0
Menanyakan jumlah permintaan yang ditolak dalam satu menit terakhir dan mengelompokkan hasil berdasarkan namespace dan nama layanan hulu. Peringatan dipicu ketika jumlah permintaan yang ditolak dalam satu menit lebih besar dari 0.
Isi peringatan
Pemutusan sirkuit tingkat layanan terjadi! Namespace: {{$labels.namespace}}, Layanan target tempat pemutusan sirkuit terjadi: {{$labels.cluster}}. Jumlah permintaan yang ditolak akibat pemutusan sirkuit dalam satu menit terakhir: {{ $value }}
Format pesan peringatan. Pesan ini menampilkan namespace dan nama layanan yang terdampak, serta jumlah permintaan yang ditolak ke layanan tersebut dalam satu menit terakhir.