Untuk melindungi layanan Anda dari lonjakan traffic, kelebihan beban, kehabisan resource, atau serangan berbahaya, konfigurasikan throttling lokal di pusat manajemen traffic. Fitur ini menjaga traffic tetap berada dalam ambang batas yang terkendali sehingga memastikan ketersediaan dan stabilitas kinerja layanan. Throttling lokal diimplementasikan oleh proxy Envoy menggunakan algoritma token bucket untuk mengontrol laju permintaan ke layanan Anda. Algoritma ini menambahkan token ke dalam bucket pada interval reguler, dan setiap permintaan mengonsumsi satu token. Jika bucket kehabisan token, permintaan baru akan ditolak sementara, sehingga mencegah layanan menjadi kewalahan.
Prasyarat
-
Instans ASM telah dibuat dan memenuhi persyaratan berikut:
-
Untuk ASM Enterprise Edition (Professional atau Ultimate), versi instans harus 1.14.3 atau lebih baru. Untuk informasi selengkapnya tentang cara melakukan upgrade instans ASM, lihat Upgrade an ASM instance.
-
Untuk ASM Standard Edition, versi instans harus 1.9 atau lebih baru. Anda hanya dapat menggunakan metode Istio native untuk mengonfigurasi throttling lokal. Dokumentasi bervariasi tergantung pada versi Istio. Untuk informasi terbaru, lihat dokumentasi Istio Enabling Rate Limits using Envoy.
-
-
Injeksi otomatis sidecar proxy diaktifkan untuk namespace
defaultdi kluster Kubernetes. Untuk informasi selengkapnya, lihat Enable automatic sidecar proxy injection. -
Layanan sampel httpbin dan sleep telah dideploy, dan layanan sleep dapat mengakses layanan httpbin. Untuk informasi selengkapnya, lihat Deploy the httpbin application.
Skenario 1: Terapkan throttling ke port layanan
Skenario ini menunjukkan cara menerapkan throttling lokal ke port 8000 layanan httpbin. Setelah dikonfigurasi, aturan ini berlaku untuk semua permintaan yang dikirim ke port tersebut.
-
Buat aturan throttling lokal.
-
Masuk ke ASM console. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih . Pada halaman yang muncul, klik Create.
-
Pada halaman Create, konfigurasikan parameter dan klik OK.
Bagian
Parameter
Deskripsi
Basic Information About Throttling
Namespace
Namespace tempat workload yang terpengaruh oleh throttling lokal berada. Dalam contoh ini, pilih default.
Name
Nama kustom untuk konfigurasi throttling lokal. Dalam contoh ini, masukkan httpbin.
Type of Effective Workload
Jenis workload tempat aturan throttling diterapkan. Nilai yang valid: Application Service dan Gateway. Dalam contoh ini, pilih Applicable Application.
Relevant Workload
Masukkan sekumpulan pasangan kunci-nilai label untuk memilih workload tertentu. Dalam contoh ini, atur Label Name ke app dan Label Value ke httpbin.
List of Throttling Rules
Service Port
Nomor port yang dideklarasikan dalam Service Kubernetes dari layanan tersebut. Ini harus merupakan port HTTP. Dalam contoh ini, masukkan port HTTP 8000 layanan httpbin.
Throttling Configuration
Tentukan jendela waktu dan jumlah maksimum permintaan yang diizinkan dalam jendela tersebut untuk algoritma token bucket. Jika jumlah permintaan yang dikirim dalam jendela waktu melebihi batas ini, permintaan berikutnya akan dithrottling. Contoh ini menggunakan konfigurasi berikut:
-
Atur Time Window for Throttling Detection ke 60s.
-
Atur Allowed requests in window ke 10.
Konfigurasi ini membatasi workload layanan hingga maksimal 10 permintaan dalam setiap jendela 60 detik.
File YAML berikut adalah contoh konfigurasi throttling lokal.
-
-
-
Verifikasi aturan throttling lokal.
-
Jalankan perintah berikut untuk memulai sesi bash di kontainer sleep:
kubectl exec -it deploy/sleep -- sh -
Jalankan perintah berikut untuk mengirim 10 permintaan:
for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done -
Jalankan perintah berikut untuk mengirim permintaan ke-11:
curl -v http://httpbin:8000/headersOutput yang diharapkan:
* Trying 172.16.245.130:8000... * Connected to httpbin (172.16.245.130) port 8000 > GET /headers HTTP/1.1 > Host: httpbin:8000 > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/1.1 429 Too Many Requests < x-local-rate-limit: true < content-length: 18 < content-type: text/plain < date: Tue, 26 Dec 2023 08:02:58 GMT < server: envoy < x-envoy-upstream-service-time: 2Output menunjukkan kode status HTTP 429, yang mengindikasikan bahwa permintaan tersebut dithrottling.
-
Skenario 2: Terapkan throttling ke path permintaan
Skenario ini menunjukkan cara menerapkan throttling lokal ke permintaan yang dikirim ke path /headers pada port 8000 layanan httpbin. Setelah dikonfigurasi, aturan ini hanya berlaku untuk permintaan yang sesuai dengan path dan port tersebut.
-
Buat aturan throttling lokal.
-
Masuk ke ASM console. Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih . Pada halaman yang muncul, klik Create.
-
Pada halaman Create, konfigurasikan parameter dan klik OK.
Bagian
Parameter
Deskripsi
Basic Information About Throttling
Namespace
Namespace tempat workload yang terpengaruh oleh throttling lokal berada. Dalam contoh ini, pilih default.
Name
Nama kustom untuk konfigurasi throttling lokal. Dalam contoh ini, masukkan httpbin.
Type of Effective Workload
Jenis workload tempat aturan throttling diterapkan. Nilai yang valid: Application Service dan Gateway. Dalam contoh ini, pilih Applicable Application.
Relevant Workload
Masukkan sekumpulan pasangan kunci-nilai label untuk memilih workload tertentu. Dalam contoh ini, atur Label Name ke app dan Label Value ke httpbin.
List of Throttling Rules
Service Port
Nomor port yang dideklarasikan dalam Service Kubernetes dari layanan tersebut. Ini harus merupakan port HTTP. Dalam contoh ini, masukkan port HTTP 8000 layanan httpbin.
Match Request Attributes
Tentukan kondisi pencocokan untuk permintaan. Aturan hanya diterapkan pada permintaan yang memenuhi kondisi ini. Contoh ini menggunakan konfigurasi berikut:
-
Atur Matched Attributes ke Request Path.
-
Atur Matching Method ke Prefix Match.
-
Atur Matched Content ke
/headers.
Throttling Configuration
Tentukan jendela waktu dan jumlah maksimum permintaan yang diizinkan dalam jendela tersebut untuk algoritma token bucket. Jika jumlah permintaan yang dikirim dalam jendela waktu melebihi batas ini, permintaan berikutnya akan dithrottling. Contoh ini menggunakan konfigurasi berikut:
-
Atur Time Window for Throttling Detection ke 60s.
-
Atur Allowed requests in window ke 10.
Konfigurasi ini membatasi workload layanan hingga maksimal 10 permintaan dalam setiap jendela 60 detik.
-
-
-
Verifikasi aturan throttling lokal.
-
Jalankan perintah berikut untuk memulai sesi bash di kontainer sleep:
kubectl exec -it deploy/sleep -- sh -
Jalankan perintah berikut untuk mengirim 10 permintaan:
for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done -
Jalankan perintah berikut untuk mengirim permintaan ke-11:
curl -v http://httpbin:8000/headersOutput yang diharapkan:
* Trying 172.16.245.130:8000... * Connected to httpbin (172.16.245.130) port 8000 > GET /headers HTTP/1.1 > Host: httpbin:8000 > User-Agent: curl/8.5.0 > Accept: */* > < HTTP/1.1 429 Too Many Requests < x-local-rate-limit: true < content-length: 18 < content-type: text/plain < date: Tue, 26 Dec 2023 08:02:58 GMT < server: envoy < x-envoy-upstream-service-time: 2Output menunjukkan kode status HTTP 429, yang mengindikasikan bahwa permintaan tersebut dithrottling.
-
Jalankan perintah berikut untuk mengirim permintaan ke path
/getlayanan httpbin:curl -v http://httpbin:8000/getOutput yang diharapkan:
* Trying 192.168.243.21:8000... * Connected to httpbin (192.168.243.21) port 8000 (#0) > GET /get HTTP/1.1 > Host: httpbin:8000 > User-Agent: curl/8.1.2 > Accept: */* > < HTTP/1.1 200 OK < server: envoy < date: Thu, 11 Jan 2024 03:46:11 GMT < content-type: application/json < content-length: 431 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 1 < { "args": {}, "headers": { "Accept": "*/*", "Host": "httpbin:8000", "User-Agent": "curl/8.1.2", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=be10819991ba1a354a89e68b3bed1553c12a4fba8b65fbe0f16299d552680b29;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep" }, "origin": "127.0.0.6", "url": "http://httpbin:8000/get" }Output menunjukkan kode status 200 OK. Hal ini mengonfirmasi bahwa permintaan ke path lain layanan httpbin tidak terpengaruh oleh aturan throttling.
-
Operasi terkait
Lihat metrik throttling lokal
Fitur throttling lokal menghasilkan metrik berikut:
|
Metrik |
Deskripsi |
|
envoy_http_local_rate_limiter_http_local_rate_limit_enabled |
Jumlah total permintaan yang memicu filter rate limit. |
|
envoy_http_local_rate_limiter_http_local_rate_limit_ok |
Jumlah total permintaan yang diizinkan karena tersedia token. |
|
envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited |
Jumlah total permintaan yang ditandai untuk throttling karena token tidak tersedia. Ini tidak berarti permintaan ditolak. |
|
envoy_http_local_rate_limiter_http_local_rate_limit_enforced |
Jumlah total permintaan yang dithrottling, misalnya, mengembalikan respons 429. |
Konfigurasikan pengaturan proxyStatsMatcher pada sidecar proxy untuk melaporkan metrik ini. Kemudian, Anda dapat menggunakan Prometheus untuk mengumpulkan dan melihatnya.
-
Konfigurasikan sidecar proxy untuk melaporkan metrik throttling dengan menggunakan
proxyStatsMatcher.Saat mengonfigurasi
proxyStatsMatcher, pilih Regular Expression Match dan atur ke.*http_local_rate_limit.*. Atau, klik Add Local Throttling Metrics. Untuk informasi selengkapnya, lihat proxyStatsMatcher. -
Redeploy layanan httpbin. Untuk informasi selengkapnya, lihat Redeploy workloads.
-
Selesaikan konfigurasi throttling lokal dan kirim permintaan uji seperti yang dijelaskan dalam Skenario 1 atau Skenario 2.
-
Jalankan perintah berikut untuk melihat metrik throttling lokal layanan httpbin:
kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15020/stats/prometheus|grep http_local_rate_limitOutput yang diharapkan:
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
Konfigurasi pengumpulan metrik dan notifikasi
Setelah Anda mengonfigurasi pelaporan metrik, Anda dapat menyiapkan pengumpulan metrik di Prometheus dan membuat aturan notifikasi berdasarkan metrik utama untuk menerima pemberitahuan tepat waktu saat terjadi throttling. Contoh berikut menggunakan Managed Service for Prometheus.
-
Di Managed Service for Prometheus, tambahkan komponen Alibaba Cloud ASM ke kluster bidang data Anda atau upgrade ke versi terbaru. Hal ini memastikan bahwa Managed Service for Prometheus dapat mengambil metrik throttling lokal yang diekspos. Untuk informasi selengkapnya, lihat Integration management. Jika Anda telah mengintegrasikan instans Prometheus self-managed untuk mengumpulkan metrik service mesh, Anda tidak perlu melakukan langkah ini. Untuk informasi selengkapnya, lihat Integrate a self-managed Prometheus instance for mesh monitoring.
-
Buat aturan notifikasi untuk throttling lokal. Untuk informasi selengkapnya, lihat Create a Prometheus alert rule by using a custom PromQL query. Tabel berikut memberikan contoh cara mengonfigurasi parameter utama. Anda dapat mengonfigurasi parameter lain sesuai kebutuhan.
Parameter
Contoh
Deskripsi
Custom PromQL query
(sum by(namespace, pod_name) (increase(envoy_http_local_rate_limiter_http_local_rate_limit_enforced[1m]))) > 0
Kueri PromQL ini menggunakan fungsi
increaseuntuk menemukan jumlah permintaan yang dithrottling dalam satu menit terakhir, dikelompokkan berdasarkan namespace dan nama pod. Notifikasi dipicu jika jumlah permintaan yang dithrottling dalam satu menit lebih besar dari 0.Pesan notifikasi
Throttling lokal telah terjadi! Namespace: {{$labels.namespace}}, Pod: {{$labels.pod_name}}. Permintaan yang dithrottling dalam 1 menit terakhir: {{ $value }}
Isi pemberitahuan notifikasi. Pesan contoh ini mencakup namespace dan nama pod yang memicu notifikasi, serta jumlah permintaan yang dithrottling dalam satu menit terakhir.
FAQ
Mengapa aturan throttling saya tidak berfungsi?
Protokol layanan salah
Throttling lokal hanya mendukung protokol HTTP. Sebelum mengonfigurasi aturan throttling, pastikan layanan Anda berkomunikasi melalui HTTP atau protokol lapisan aplikasi yang dibangun di atas HTTP, seperti gRPC atau Dubbo3.
Selain itu, Anda harus mendefinisikan protokol layanan dengan benar agar service mesh dapat mengidentifikasinya secara akurat. Untuk informasi selengkapnya, lihat How to correctly define the protocol type for a service.
Dampak CRD Sidecar terhadap lalu lintas inbound
Secara default, service mesh secara otomatis mengonfigurasi pendengar lalu lintas inbound untuk sidecar proxy berdasarkan deklarasi port dalam definisi Service. Baik throttling lokal maupun rate limiting global bergantung pada perilaku default ini.
Anda mungkin menggunakan Definisi Sumber Daya Kustom (CRD) Sidecar untuk memodifikasi konfigurasi lalu lintas inbound default layanan, misalnya, untuk mengizinkan pod lain mengakses aplikasi yang mendengarkan di localhost. Untuk informasi selengkapnya, lihat How to expose a localhost application to other pods.
Dalam kasus ini, karena pendengar default dimodifikasi, menentukan port Service Kubernetes dalam aturan throttling lokal tidak akan berfungsi. Anda harus mengatur Service Port dalam aturan throttling lokal ke port inbound aktual yang ditentukan dalam CRD Sidecar.
Sebagai contoh, jika Anda mengonfigurasi CRD Sidecar berikut untuk layanan httpbin saat mencoba menerapkan throttling lokal ke port 8000:
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: localhost-access
namespace: default
spec:
ingress:
- defaultEndpoint: '127.0.0.1:80'
port:
name: http
number: 80
protocol: HTTP
workloadSelector:
labels:
app: httpbin
Saat membuat aturan throttling lokal, Anda harus mengatur Service Port ke 80, bukan 8000.
Dokumen terkait
-
Jika instans ASM Anda versi 1.19.0 atau lebih baru, Anda dapat menggunakan field
limit_overridesdalam YAMLASMLocalRateLimiteruntuk mencocokkan permintaan berdasarkan atribut lain, seperti parameter kueri. Untuk informasi selengkapnya, lihat ASMLocalRateLimiter CRD reference. -
Gunakan CRD
ASMGlobalRateLimiteruntuk mengonfigurasi rate limiting global untuk gerbang masuk dan lalu lintas layanan aplikasi. Untuk informasi selengkapnya, lihat Configure global rate limiting for application services by using ASMGlobalRateLimiter. -
Konfigurasikan throttling lokal atau rate limiting global untuk gerbang masuk di konsol ASM. Untuk informasi selengkapnya, lihat Configure local throttling for an ingress gateway dan Configure global rate limiting for an ingress gateway.
-
Gunakan fitur warm-up untuk secara bertahap meningkatkan volume permintaan selama periode tertentu, yang membantu mencegah masalah seperti timeout permintaan dan kehilangan data. Untuk informasi selengkapnya, lihat Use the ASM warm-up feature.
-
Konfigurasikan kolam koneksi untuk menerapkan pemutusan sirkuit, yang melindungi sistem Anda dari kerusakan lebih lanjut selama kegagalan atau kelebihan beban. Untuk informasi selengkapnya, lihat Configure a connection pool to implement circuit breaking.