Service Mesh (ASM) memungkinkan Anda mengonfigurasi sumber daya seperti layanan virtual dan aturan tujuan untuk menerapkan tata kelola lalu lintas non-intrusif pada layanan mikro. Contohnya termasuk pengarahan lalu lintas, pembatasan, pemutusan sirkuit, dan pencermatan lalu lintas. Topik ini menjelaskan cara menggunakan fitur pemutusan sirkuit tingkat rute ASM.
Prasyarat
File konfigurasi yang diperlukan dalam topik ini telah diunduh.
Sebuah instance ASM Edisi Enterprise atau Edisi Ultimate telah dibuat, dengan versi ASM V1.13.4 atau lebih baru. Untuk informasi lebih lanjut, lihat Buat Instance ASM.
Gateway masuk telah diterapkan. Untuk informasi lebih lanjut, lihat Buat Gateway Masuk.
Layanan Bookinfo dan NGINX telah dibuat. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi dalam Instance ASM.
kubectl terhubung ke instance ASM. Untuk informasi lebih lanjut, lihat Gunakan kubectl pada Control Plane untuk Mengakses Sumber Daya Istio.
Gateway Istio telah diterapkan. Untuk informasi lebih lanjut, lihat Kelola Gateway Istio.
Layanan virtual telah dibuat. Untuk informasi lebih lanjut, lihat Kelola Layanan Virtual.
Alat pembangkit lalu lintas hey telah diinstal. Untuk informasi lebih lanjut, kunjungi hey di GitHub.
Informasi Latar Belakang
ASM memungkinkan Anda mengonfigurasi fitur pemutusan sirkuit di bidang trafficPolicy. Jika jumlah permintaan akses mencapai ambang batas pemutusan sirkuit, permintaan baru akan ditolak. Saat mengonfigurasi aturan tujuan, Anda dapat menyetel dua item berikut dari fitur pemutusan sirkuit di bidang trafficPolicy:
ConnectionPoolSettings: Menentukan jumlah maksimum koneksi ke layanan. Jika jumlah permintaan mencapai nilai ini, permintaan baru akan masuk ke status tertunda, habis waktu, atau dicoba ulang.OutlierDetection: Menentukan aturan untuk menghapus instans tidak sehat dari pool penyeimbangan beban.
Istio menyediakan konfigurasi pemutusan sirkuit berikut untuk aturan tujuan. Untuk informasi lebih lanjut, lihat Destination Rule.
Fitur pemutusan sirkuit Istio open source bekerja sebagai berikut: Envoy secara berkala memindai host di cluster upstream untuk memeriksa apakah ada pengecualian yang terjadi. Host tempat pengecualian terjadi dikeluarkan dari pool koneksi. Dengan cara ini, pemutusan sirkuit dilakukan pada host upstream. Mekanisme ini memiliki beberapa kelemahan:
Pemutusan sirkuit berbasis layanan diimplementasikan alih-alih pemutusan sirkuit berbasis API.
Fitur ini hanya berlaku untuk lalu lintas yang dimaksudkan untuk layanan setelah perutean terjadi.
Untuk mengatasi kekurangan tersebut, ASM memperluas rantai filter Envoy pada bidang data dan menyediakan com.aliyun.break filter untuk mendukung pemutusan sirkuit tingkat rute. Pada bidang kontrol, ASM memungkinkan Anda menggunakan ASMCircuitBreaker CustomResourceDefinition (CRD) untuk menerapkan pemutusan sirkuit tanpa perlu fokus pada implementasi dasar.
Dalam contoh ini, layanan Bookinfo dan HTTPBin digunakan untuk mensimulasikan permintaan lambat dan permintaan kesalahan. Layanan Bookinfo diterapkan di namespace default. Layanan HTTPBin diterapkan di namespace foo. Gateway masuk diterapkan di namespace istio-system. Layanan HTTPBin diterapkan di layanan uji backend namespace foo untuk memverifikasi ruang lingkup pemutusan sirkuit.
Skenario
Anda dapat mengaktifkan fitur pemutusan sirkuit tingkat rute untuk gateway ASM. Fitur ini mendukung protokol HTTP dan Google Remote Procedure Call (gRPC). Anda dapat menambahkan konfigurasi gateway Istio ke file YAML CRD ASMCircuitBreaker. Dalam contoh ini, aturan pemutusan sirkuit dikonfigurasikan untuk rute httpbin-route-name1 yang mengarahkan permintaan ke /httpbin.
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMCircuitBreaker
metadata:
name: ingressgateway
namespace: istio-system
spec:
workloadSelector:
labels:
app: istio-ingressgateway
isGateway: true
configs:
- match:
vhost:
name: "bf2.example.com"
port: 80
route:
name_match: nginx-route-name1
breaker_config:
slow_request_rt: 0.1s
break_duration: 90s
window_size: 10s
max_slow_requests: 10
min_request_amount: 3
error_percent:
value: 60
custom_response:
header_to_add:
x-envoy-circuitbreak: "true"
body: "hello, break!"
status_code: 499Tabel berikut menjelaskan beberapa bidang. Untuk deskripsi lebih banyak bidang dalam CRD ASMCircuitBreaker, lihat Deskripsi Bidang ASMCircuitBreaker.
Bidang | Deskripsi |
| Menentukan apakah akan menerapkan konfigurasi ke gateway. Nilai default: |
| Persentase maksimum permintaan kesalahan yang diizinkan. Jika persentase melebihi nilai ini yaitu 60% dan jumlah permintaan sama dengan atau lebih besar dari tiga, permintaan baru akan ditolak. |
| Jumlah maksimum permintaan lambat yang diizinkan. Jika jumlahnya melebihi nilai ini yaitu 10, permintaan baru akan ditolak. Catatan Jika waktu respons permintaan melebihi nilai bidang |
| Periode pemutusan sirkuit selama permintaan baru ditolak. Unit: detik. Dalam contoh ini, periode pemutusan sirkuit diatur menjadi 90 detik. |
Konfigurasikan dan verifikasi aturan pemutusan sirkuit
Dalam contoh ini, aturan pemutusan sirkuit dikonfigurasikan untuk rute httpbin-route-name1 dari host virtual bf2.example.com:80 untuk menerapkan throttling.
Buat file asmcircuitbreaker-test-gw.yaml dan tambahkan konten berikut ke file:
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMCircuitBreaker metadata: name: ingressgateway namespace: istio-system spec: workloadSelector: labels: app: istio-ingressgateway isGateway: true configs: - match: vhost: name: "bf2.example.com" port: 80 route: name_match: httpbin-route-name1 breaker_config: slow_request_rt: 0.1s break_duration: 90s window_size: 10s max_slow_requests: 10 min_request_amount: 3 error_percent: value: 60 custom_response: header_to_add: x-envoy-overload: "true" body: "hello, break!" status_code: 499Jalankan perintah berikut untuk membuat ASMCircuitBreaker:
kubectl apply -f asmcircuitbreaker-test-gw.yamlSimulasikan latensi satu detik dalam merespons permintaan atau kesalahan respons 500 dari layanan Httpbin. Ulangi operasi sepuluh kali.
Jalankan perintah berikut untuk mensimulasikan latensi satu detik dalam merespons permintaan:
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/delay/1 -vJalankan perintah berikut untuk mensimulasikan kesalahan respons 500 dari layanan HTTPBin:
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/status/500 -v
Output yang diharapkan:
< HTTP/1.1 499 Unknown < Content-Length: 12 < Content-Type: text/plain < x-envoy-overload: true < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < Hello,Break!Jika
Hello,Break!dikembalikan, permintaan ditolak.Jalankan perintah berikut untuk mengakses antarmuka
/productpagedari layanan Bookinfo:curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/productpage -vJika
HTTP 200dikembalikan di halaman Productpage, permintaan tidak ditolak.