Ketika beberapa replika layanan berjalan di belakang load balancer, pembatasan laju per instans tidak dapat menegakkan batas total permintaan di seluruh layanan. Pembatasan laju global mengatasi hal ini dengan menggunakan layanan terpusat untuk mengoordinasikan jumlah permintaan di seluruh proxy sidecar Envoy dalam mesh.
Service Mesh (ASM) V1.18.0.131 dan versi yang lebih baru menyediakan resource kustom ASMGlobalRateLimiter (CR) untuk mengonfigurasi pembatasan laju global pada lalu lintas inbound layanan yang memiliki proxy sidecar yang disuntikkan. CR ini menyediakan API deklaratif yang stabil yang menyembunyikan konfigurasi filter Envoy tingkat rendah.
Topik ini mencakup dua skenario:
Pembatasan laju tingkat port: Batasi semua permintaan ke port layanan tertentu.
Pembatasan laju tingkat path: Batasi permintaan ke path URL tertentu pada port layanan.
Untuk pembatasan laju per instans, lihat Konfigurasikan pembatasan laju lokal di Traffic Management Center.
Pembatasan laju global vs. lokal
Pendekatan | Cara kerja | Paling cocok untuk |
Global rate limiting | Layanan gRPC terpusat (didukung oleh Redis) melacak jumlah permintaan di seluruh instans. | Menegakkan batas ketat di seluruh layanan, terlepas dari jumlah replika. |
Local rate limiting | Setiap proxy sidecar Envoy menegakkan batas secara independen. | Melindungi instans individual dari kelebihan beban. Tidak ada dependensi eksternal. |
Cara kerja
Pembatasan laju global mengandalkan tiga komponen:
Redis — Menyimpan penghitung permintaan yang dibagikan di seluruh proxy sidecar Envoy.
Layanan pembatas laju — Layanan gRPC yang dikueri oleh proxy sidecar Envoy sebelum meneruskan permintaan. Layanan ini memeriksa penghitung di Redis dan mengembalikan keputusan izinkan atau tolak.
CR ASMGlobalRateLimiter — Konfigurasi deklaratif yang diterapkan pada lapisan kontrol ASM. ASM menerjemahkannya menjadi konfigurasi filter Envoy dan menghasilkan konfigurasi layanan pembatas laju di bidang
statusCR tersebut.
Client request --> Envoy sidecar --> Rate limit service (gRPC) --> Redis
|
Allow or deny (HTTP 429)Prasyarat
Kluster ACK yang dikelola telah ditambahkan ke instans ASM Anda (V1.18.0.131 atau lebih baru). Untuk informasi selengkapnya, lihat Tambahkan kluster ke instans ASM.
Injeksi proxy sidecar otomatis diaktifkan untuk namespace
default. Untuk informasi selengkapnya, lihat bagian "Enable automatic sidecar proxy injection" dalam Kelola namespace global.Gerbang masuk ASM bernama
ingressgatewaydengan port 80 diaktifkan. Untuk informasi selengkapnya, lihat Buat gerbang masuk.Aplikasi contoh
sleepdanhttpbintelah dideploy. Untuk informasi selengkapnya, lihat Deploy aplikasi HTTPBin dan Deploy layanan sleep.
Deploy layanan pembatas laju
Deploy Redis dan layanan pembatas laju ke kluster ACK Anda sebelum mengonfigurasi aturan pembatasan laju.
Buat file bernama
ratelimit-svc.yamldengan konten berikut:Jalankan perintah berikut di kluster ACK untuk mendeploy layanan:
kubectl apply -f ratelimit-svc.yaml
Skenario 1: Batasi laju semua permintaan pada port layanan
Skenario ini membatasi semua permintaan ke port 8000 layanan HTTPBin menjadi 1 permintaan per menit.
Alur kerja terdiri dari tiga langkah: buat CR ASMGlobalRateLimiter pada instans ASM, sinkronkan konfigurasi yang dihasilkan ke layanan pembatas laju di kluster ACK, lalu verifikasi.
Langkah 1: Buat CR ASMGlobalRateLimiter
Buat file bernama
global-ratelimit-svc.yaml:Tabel berikut menjelaskan bidang-bidang utama. Untuk referensi lengkap semua bidang, lihat Deskripsi bidang ASMGlobalRateLimiter.
Bidang
Deskripsi
workloadSelectorMemilih workload target. Tetapkan
app: httpbinuntuk menerapkan pembatasan laju pada layanan HTTPBin.isGatewayDiatur ke
falsekarena aturan ini menargetkan workload sidecar, bukan gerbang masuk.rateLimitServicePengaturan koneksi untuk layanan pembatas laju: hostname, port gRPC (8081), dan timeout 5 detik.
limitAmbang batas pembatasan laju.
unit: MINUTEdanquota: 1berarti 1 permintaan per menit pada rute yang sesuai.vhostMencocokkan host virtual.
name: '*'denganport: 8000menerapkan aturan ke semua permintaan pada port 8000 HTTPBin.Jalankan perintah berikut di instans ASM untuk menerapkan CR:
kubectl apply -f global-ratelimit-svc.yaml
Langkah 2: Sinkronkan konfigurasi pembatas laju ke bidang data
Setelah ASM memproses CR, konfigurasi layanan pembatas laju dihasilkan di bidang status.config.yaml. Anda harus menyalin konfigurasi ini ke ConfigMap layanan pembatas laju di kluster ACK. Sinkronisasi manual ini diperlukan karena lapisan kontrol ASM dan bidang data ACK berjalan di kluster terpisah.
Ambil konfigurasi yang dihasilkan dari instans ASM:
kubectl get asmglobalratelimiter global-svc-test -o yamlDalam output, temukan bagian
status:Buat file
ratelimit-config.yaml. Salin kontenconfig.yamldari bagianstatuske bidangdata.config.yamlConfigMap persis seperti yang ditunjukkan:PentingSalin nilai
config.yamldari bagianstatustanpa modifikasi. Perubahan apa pun akan menyebabkan layanan pembatas laju menolak konfigurasi tersebut.Terapkan ConfigMap ke kluster ACK:
kubectl apply -f ratelimit-config.yaml
Verifikasi
Kirim dua permintaan ke port 8000 HTTPBin dari pod sleep:
kubectl exec -it deploy/sleep -- shKemudian jalankan:
curl httpbin:8000/get -v
curl httpbin:8000/get -vOutput yang diharapkan untuk permintaan kedua:
< HTTP/1.1 429
< x-envoy-ratelimited: true
< x-ratelimit-limit: 1, 1;w=60
< x-ratelimit-remaining: 0
< x-ratelimit-reset: 5
< date: Thu, 26 Oct 2023 04:23:54 GMT
< server: envoy
< content-length: 0
< x-envoy-upstream-service-time: 2
<
* Connection #0 to host httpbin left intactPermintaan kedua mengembalikan 429, yang mengonfirmasi bahwa pembatasan laju global aktif. Hanya satu permintaan yang diizinkan untuk mengakses layanan HTTPBin dalam satu menit. Saat Anda mengirim permintaan kedua, pembatasan kecepatan dipicu, yang menunjukkan bahwa pembatasan laju global berlaku pada lalu lintas inbound layanan yang telah disuntikkan proxy sidecar.
Skenario 2: Batasi laju permintaan ke path tertentu
Skenario ini membatasi permintaan ke path /headers pada port 8000 HTTPBin menjadi 1 permintaan per menit, sementara akses tak terbatas tetap diizinkan ke path lain seperti /get.
Konfigurasi berbeda tergantung pada versi ASM Anda.
Langkah 1: Buat CR ASMGlobalRateLimiter
Pilih YAML yang sesuai dengan versi ASM Anda:
Tabel berikut menjelaskan bidang tambahan yang digunakan dalam skenario ini:
Bidang | Deskripsi |
| Parameter throttling yang berlaku. |
| (V1.19.0+) Mengganti ambang batas pembatasan laju dasar untuk permintaan yang sesuai dengan kriteria tertentu. Setiap override menentukan |
| Nama domain dan rute tempat throttling berlaku. Untuk versi sebelum V1.19.0, Anda dapat mengonfigurasi aturan pencocokan header untuk permintaan di bagian |
| (Sebelum V1.19.0) Mencocokkan permintaan berdasarkan nilai header HTTP dalam rute |
Langkah 2: Sinkronkan konfigurasi pembatas laju ke bidang data
Ikuti proses yang sama seperti Skenario 1:
Ambil konfigurasi yang dihasilkan dari instans ASM:
kubectl get asmglobalratelimiter global-svc-test -o yamlSalin
config.yamldari bagianstatuske ConfigMap dan terapkan ke kluster ACK:kubectl apply -f ratelimit-config.yaml
Verifikasi
Kirim dua permintaan ke path
/headersdari pod sleep:kubectl exec -it deploy/sleep -- shKemudian jalankan:
curl httpbin:8000/headers -v curl httpbin:8000/headers -vOutput yang diharapkan untuk permintaan kedua:
< HTTP/1.1 429 Too Many Requests < x-envoy-ratelimited: true < x-ratelimit-limit: 1, 1;w=60 < x-ratelimit-remaining: 0 < x-ratelimit-reset: 5 < date: Thu, 26 Oct 2023 04:23:54 GMT < server: envoy < content-length: 0 < x-envoy-upstream-service-time: 2 < * Connection #0 to host httpbin left intactPermintaan kedua ke
/headersdibatasi lajunya. Hanya satu permintaan yang diizinkan untuk mengakses path/headerslayanan HTTPBin dalam satu menit.Konfirmasi bahwa path lain tidak terpengaruh:
curl httpbin:8000/get -vPermintaan ke
/getberhasil karena hanya path/headersyang dikenai pembatasan laju.
Monitor metrik pembatasan laju global
Proxy sidecar Envoy mengekspos metrik untuk pembatasan laju global:
Metrik | Tipe | Deskripsi |
| Counter | Jumlah total permintaan yang diizinkan oleh throttling global. |
| Counter | Jumlah total permintaan yang ditentukan memicu throttling oleh throttling global. |
| Counter | Jumlah total permintaan yang gagal memanggil throttling global. |
Aktifkan pelaporan metrik
Konfigurasikan
proxyStatsMatcheruntuk proxy sidecar. Pilih Regular Expression Match dan atur nilainya ke.*ratelimit.*. Untuk informasi selengkapnya, lihat bagian "proxyStatsMatcher" dalam Konfigurasikan proxy sidecar.Redeploy layanan HTTPBin untuk menerapkan konfigurasi proxy baru. Untuk informasi selengkapnya, lihat bagian "(Optional) Redeploy workloads" dalam Konfigurasikan proxy sidecar.
Konfigurasikan throttling global dan lakukan pengujian permintaan. Untuk informasi selengkapnya, lihat Skenario 1 atau Konfigurasikan pembatasan laju lokal di Traffic Management Center.
Jalankan perintah berikut untuk melihat metrik throttling global layanan HTTPBin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep envoy_cluster_ratelimitContoh output:
# TYPE envoy_cluster_ratelimit_ok counter envoy_cluster_ratelimit_ok{cluster_name="inbound|80||"} 904 # TYPE envoy_cluster_ratelimit_over_limit counter envoy_cluster_ratelimit_over_limit{cluster_name="inbound|80||"} 3223
Siapkan alert Prometheus
Gunakan Managed Service for Prometheus untuk mengumpulkan metrik pembatasan laju dan memicu alert saat pembatasan laju terjadi.
Hubungkan kluster ACK ke komponen Alibaba Cloud ASM dalam Managed Service for Prometheus, atau tingkatkan komponen ke versi terbaru. Untuk informasi selengkapnya, lihat Kelola komponen.
CatatanJika Anda sudah menggunakan instans Prometheus yang dikelola sendiri untuk mengumpulkan metrik ASM, lewati langkah ini. Untuk informasi selengkapnya, lihat Monitor instans ASM menggunakan instans Prometheus yang dikelola sendiri.
Buat aturan alert kustom dengan PromQL dan templat pesan berikut. Untuk petunjuk detail, lihat Buat aturan alert dengan pernyataan PromQL kustom. Aturan ini aktif ketika layanan mana pun memiliki setidaknya satu permintaan yang dibatasi lajunya dalam jendela satu menit bergulir, dikelompokkan berdasarkan namespace dan nama layanan.
Parameter
Nilai contoh
Pernyataan PromQL
(sum by(namespace, service_istio_io_canonical_name) (increase(envoy_cluster_ratelimit_over_limit[1m]))) > 0Pesan alert
Global rate limiting triggered. Namespace: {{$labels.namespace}}. Service: {{$labels.service_istio_io_canonical_name}}. Throttled requests in the last minute: {{ $value }}
Langkah selanjutnya
Pembatasan laju gerbang masuk: Terapkan pembatasan laju global di tepi mesh, bukan di tingkat sidecar. Lihat Konfigurasikan pembatasan laju global pada gerbang masuk.
Pembatasan laju lokal: Gabungkan dengan batas per instans untuk pertahanan berlapis. Lihat Konfigurasikan pembatasan laju lokal di Traffic Management Center.
Referensi bidang: Tinjau semua bidang yang tersedia untuk kontrol detail halus. Lihat Deskripsi bidang ASMGlobalRateLimiter.