Throttling lokal membatasi jumlah permintaan yang diterima setiap pod, melindungi layanan dari kelebihan beban selama lonjakan lalu lintas, kehabisan sumber daya, atau serangan penolakan layanan. Setiap proxy sidecar Envoy menerapkan batasan secara independen menggunakan algoritma token bucket: token diisi ulang pada interval tetap, dan setiap permintaan masuk mengonsumsi satu token. Jika tidak ada token tersisa, proxy menolak permintaan tersebut dengan kode HTTP 429 (Too Many Requests).
Karena throttling diterapkan per pod, batas efektif di seluruh kluster berskala sebanding dengan jumlah replika. Misalnya, layanan dengan 3 replika dan batas 10 permintaan per 60 detik dapat menerima hingga total 30 permintaan di semua instans.
| Approach | Scope | Use when |
|---|---|---|
| Local throttling (dokumen ini) | Per pod — setiap instans menerapkan batasannya sendiri secara independen | Anda menginginkan perlindungan sederhana dengan latensi rendah tanpa ketergantungan eksternal |
| Global throttling | Dibagi di seluruh instans — penghitung terpusat melacak total keseluruhan | Anda memerlukan batas tepat di seluruh kluster terlepas dari jumlah replika |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans Service Mesh (ASM) yang memenuhi salah satu persyaratan versi berikut:
Enterprise Edition atau Ultimate Edition: versi 1.14.3 atau lebih baru. Untuk upgrade, lihat Update an ASM instance
Standard Edition: versi 1.9 atau lebih baru. Standard Edition hanya mendukung pendekatan rate limiting bawaan Istio. Lihat Enabling Rate Limits using Envoy dalam dokumentasi Istio
Kluster Kubernetes yang telah ditambahkan ke instans ASM
Injeksi otomatis proxy sidecar diaktifkan untuk namespace
default. Lihat "Enable automatic sidecar proxy injection" dalam Manage global namespaces
Deploy layanan contoh
Deploy HTTPBin dan sleep sebagai layanan contoh, lalu verifikasi konektivitasnya.
Buat file
httpbin.yamldengan konten berikut:Deploy layanan HTTPBin:
kubectl apply -f httpbin.yaml -n defaultBuat file
sleep.yamldengan konten berikut:Deploy layanan sleep:
kubectl apply -f sleep.yaml -n defaultBuka shell di Pod sleep dan kirim permintaan uji:
kubectl exec -it deploy/sleep -- shOutput yang diharapkan:
HTTP/1.1 200 OK server: envoy date: Tue, 26 Dec 2023 07:23:49 GMT content-type: application/json content-length: 353 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 1Respons
200 OKmengonfirmasi konektivitas antara kedua layanan.
Throttle semua permintaan ke port tertentu
Skenario ini membatasi semua permintaan ke port 8000 layanan HTTPBin menjadi 10 permintaan per 60 detik per pod.
Buat aturan throttling
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih Traffic Management Center > Rate Limiting. Klik Create.
Pada halaman Create, konfigurasikan parameter berikut, lalu klik OK.
Bagian Parameter Nilai Basic Information About Throttling Namespace defaultName httpbinType of Effective Workload Applicable Application Relevant Workload Key: app, Value:httpbinList of Throttling Rules Service Port 8000(port HTTP yang dideklarasikan dalam Service Kubernetes HTTPBin)Throttling Configuration Time Window for Throttling Detection 60detikNumber of Requests Allowed in Time Window 10Klik OK.

Verifikasi aturan throttling
Buka shell di pod sleep:
kubectl exec -it deploy/sleep -- shKirim 11 permintaan — 10 permintaan pertama menghabiskan semua token yang tersedia, dan permintaan ke-11 ditolak:
for i in $(seq 1 11); do curl -s -o /dev/null -w "Request $i: %{http_code}\n" http://httpbin:8000/headers; doneOutput yang diharapkan (10 permintaan pertama mengembalikan 200, permintaan ke-11 mengembalikan 429):
Request 1: 200 ... Request 10: 200 Request 11: 429Anda juga dapat memeriksa header respons lengkap dari permintaan yang ditolak:
curl -v http://httpbin:8000/headers< HTTP/1.1 429 Too Many Requests < x-local-rate-limit: true < content-length: 18 < content-type: text/plainKode status
429 Too Many Requestsdan headerx-local-rate-limit: truemengonfirmasi bahwa throttling lokal aktif.
Throttle permintaan ke path tertentu pada suatu port
Skenario ini hanya membatasi permintaan ke path /headers pada port 8000 layanan HTTPBin. Permintaan ke path lain, seperti /get, tetap tidak dibatasi.
Buat aturan throttling
Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih Traffic Management Center > Rate Limiting. Klik Create.
Pada halaman Create, konfigurasikan parameter berikut, lalu klik OK.
Bagian Parameter Nilai Basic Information About Throttling Namespace defaultName httpbinType of Effective Workload Applicable Application Relevant Workload Key: app, Value:httpbinList of Throttling Rules Service Port 8000Match Request Attributes Matched Attributes Request Path Matching Method Prefix Match Matched Content /headersThrottling Configuration Time Window for Throttling Detection 60detikNumber of Requests Allowed in Time Window 10
Verifikasi aturan throttling
Buka shell di dalam sleep pod:
kubectl exec -it deploy/sleep -- shKirim 11 permintaan ke
/headers— 10 permintaan pertama berhasil, permintaan ke-11 ditolak:for i in $(seq 1 11); do curl -s -o /dev/null -w "Request $i: %{http_code}\n" http://httpbin:8000/headers; doneOutput yang diharapkan:
Request 1: 200 ... Request 10: 200 Request 11: 429Konfirmasi bahwa permintaan ke path lain tidak dibatasi:
curl -s -o /dev/null -w "%{http_code}\n" http://httpbin:8000/getOutput yang diharapkan:
200Respons
200mengonfirmasi bahwa throttling hanya berlaku untuk path/headers.
Lihat metrik throttling lokal
Throttling lokal mengekspos empat metrik counter Envoy. Gunakan metrik ini untuk memantau perilaku throttling di lingkungan produksi.
| Metrik | Tipe | Deskripsi |
|---|---|---|
envoy_http_local_rate_limiter_http_local_rate_limit_enabled | Counter | Total permintaan yang dievaluasi oleh filter throttling |
envoy_http_local_rate_limiter_http_local_rate_limit_ok | Counter | Permintaan yang diizinkan (token tersedia di bucket) |
envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited | Counter | Permintaan tanpa token tersedia (belum tentu ditolak — lihat enforced) |
envoy_http_local_rate_limiter_http_local_rate_limit_enforced | Counter | Permintaan yang ditolak dengan HTTP 429 |
Jumlah rate_limited dapat berbeda dari enforced ketika persentase enforcement (filter_enforced) diatur di bawah 100%. Dalam kasus tersebut, beberapa permintaan yang kehabisan token dilacak tetapi tidak ditolak.
Untuk mengumpulkan metrik ini dengan Prometheus:
Konfigurasikan
proxyStatsMatcherpada proxy sidecar. Pilih Regular Expression Match dan atur nilainya ke.*http_local_rate_limit.*. Atau, klik Add Local Throttling Metrics. Untuk detailnya, lihat proxyStatsMatcher.Redeploy Deployment HTTPBin agar konfigurasi sidecar yang diperbarui berlaku. Lihat "(Optional) Redeploy workloads" dalam Configure sidecar proxies.
Konfigurasikan aturan throttling dan jalankan pengujian permintaan seperti dijelaskan dalam Throttle semua permintaan ke port tertentu atau Throttle permintaan ke path tertentu pada suatu port.
Kueri metrik throttling dari sidecar HTTPBin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus | grep http_local_rate_limitContoh output:
envoy_http_local_rate_limiter_http_local_rate_limit_enabled{} 37 envoy_http_local_rate_limiter_http_local_rate_limit_enforced{} 17 envoy_http_local_rate_limiter_http_local_rate_limit_ok{} 20 envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited{} 17
Langkah selanjutnya
Pencocokan parameter kueri: Di ASM 1.19.0 dan versi lebih baru, gunakan bidang
limit_overridesuntuk mencocokkan permintaan berdasarkan parameter kueri. Lihat ASMLocalRateLimiter field reference.Global throttling: Terapkan batas bersama di seluruh instans pod dengan ASMGlobalRateLimiter.
Throttling gerbang masuk: Terapkan throttling lokal atau global pada gerbang masuk.
Traffic warm-up: Tingkatkan trafik ke pod baru secara bertahap untuk menghindari timeout saat scaling. Lihat Use the warm-up feature.
Pemutusan sirkuit: Lindungi layanan dari kegagalan berantai dengan bidang
connectionPool. Lihat Configure circuit breaking.