Suite penjadwalan lalu lintas Service Mesh (ASM) menyediakan kebijakan pembatasan canggih untuk mengimplementasikan fitur seperti pembatasan global, pembatasan spesifik pengguna, konfigurasi jendela burst, dan laju konsumsi token khusus. Topik ini menjelaskan cara menggunakan RateLimitingPolicy dari suite penjadwalan lalu lintas ASM untuk menerapkan pembatasan aliran spesifik pengguna.
Informasi Latar Belakang
Kebijakan pembatasan dalam suite penjadwalan lalu lintas ASM menggunakan algoritma token bucket. Sistem menghasilkan token pada laju tetap dan menambahkannya ke bucket hingga kapasitas maksimum tercapai. Permintaan antar layanan memerlukan konsumsi token. Jika token cukup, permintaan akan dikirim; jika tidak, permintaan mungkin diantrikan atau dibuang. Algoritma ini memastikan laju transmisi rata-rata tidak melebihi laju pembuatan token sambil menangani burst tertentu.
Prasyarat
Sebuah kluster Container Service for Kubernetes (ACK) dengan versi 1.21.6.83 atau lebih baru telah ditambahkan ke instance ASM Anda. Untuk informasi lebih lanjut, lihat Tambahkan Kluster ke Instance ASM.
Anda telah terhubung ke kluster ACK menggunakan kubectl. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.
Suite penjadwalan lalu lintas ASM telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan Suite Penjadwalan Lalu Lintas ASM.
Injeksi proxy sidecar otomatis diaktifkan untuk namespace default di kluster ACK. Untuk informasi lebih lanjut, lihat Kelola Namespace Global.
Gateway masuk bernama ingressgateway telah dibuat dan port 80 telah diaktifkan. Untuk informasi lebih lanjut, lihat Buat Gateway Masuk.
Persiapan
Sebarkan layanan HTTPBin dan sleep contoh, lalu periksa apakah layanan sleep dapat mengakses layanan HTTPBin.
Buat file httpbin.yaml dengan konten berikut:
Jalankan perintah berikut untuk menerapkan layanan HTTPBin:
kubectl apply -f httpbin.yaml -n defaultBuat file sleep.yaml dengan konten berikut:
Jalankan perintah berikut untuk menerapkan layanan sleep:
kubectl apply -f sleep.yaml -n defaultJalankan perintah berikut untuk mengakses pod sleep:
kubectl exec -it deploy/sleep -- shJalankan perintah berikut untuk mengirim permintaan ke layanan HTTPBin:
curl -I http://httpbin:8000/headersOutput 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 OK menunjukkan bahwa akses berhasil.
Langkah 1: Buat kebijakan pembatasan menggunakan RateLimitingPolicy
Gunakan kubectl untuk terhubung ke instance ASM. Untuk informasi lebih lanjut, lihat Gunakan kubectl pada Bidang Kontrol untuk Mengakses Sumber Daya Istio.
Buat file ratelimitingpolicy.yaml dengan konten berikut:
apiVersion: istio.alibabacloud.com/v1 kind: RateLimitingPolicy metadata: name: ratelimit namespace: istio-system spec: rate_limiter: bucket_capacity: 2 fill_amount: 2 parameters: interval: 30s limit_by_label_key: http.request.header.user_id selectors: - agent_group: default control_point: ingress service: httpbin.default.svc.cluster.localTabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut, lihat Deskripsi Bidang RateLimitingPolicy.
Bidang
Deskripsi
fill_amount
Jumlah token yang akan ditambahkan dalam interval waktu yang ditentukan oleh bidang interval. Dalam contoh ini, nilainya adalah 2, yang menunjukkan bahwa bucket token diisi dengan dua token setelah setiap interval yang ditentukan oleh bidang interval.
interval
Interval di mana token ditambahkan ke bucket token. Dalam contoh ini, nilainya adalah 30s, yang menunjukkan bahwa bucket token diisi dengan dua token setiap 30 detik.
bucket_capacity
Jumlah maksimum token dalam bucket token. Saat laju permintaan lebih rendah daripada laju pengisian bucket token, jumlah token dalam bucket token akan terus bertambah, hingga jumlah maksimum
bucket_capacitytercapai.bucket_capacitydigunakan untuk mengizinkan sejumlah lalu lintas burst. Dalam contoh ini, nilainya adalah 2, sama dengan nilai bidang fill_amount. Dalam hal ini, tidak ada lalu lintas burst yang diizinkan.limit_by_label_key
Label yang digunakan untuk mengelompokkan permintaan dalam kebijakan pembatasan. Setelah Anda menentukan label ini, permintaan dengan label berbeda akan dibatasi secara terpisah dan bucket token terpisah digunakan untuk mereka. Dalam contoh ini,
http.request.header.user_iddigunakan, yang menunjukkan bahwa permintaan dikelompokkan menggunakan header permintaanuser_id. Ini mensimulasikan skenario pembatasan aliran spesifik pengguna. Contoh ini mengasumsikan bahwa permintaan yang dimulai oleh pengguna berbeda memiliki header permintaanused_idyang berbeda.selectors
Layanan tempat kebijakan pembatasan diterapkan. Dalam contoh ini,
service: httpbin.default.svc.cluster.localdigunakan, yang menunjukkan bahwa pembatasan dilakukan pada layananhttpbin.default.svc.cluster.local.
Jalankan perintah berikut untuk membuat kebijakan pembatasan menggunakan RateLimitingPolicy:
kubectl apply -f ratelimitingpolicy.yaml
Langkah 2: Verifikasi hasil pembatasan aliran spesifik pengguna
Gunakan kubectl untuk terhubung ke kluster ACK, lalu jalankan perintah berikut untuk mengaktifkan bash pada layanan sleep:
kubectl exec -it deploy/sleep -- shJalankan perintah berikut untuk mengakses path /headers layanan HTTPBin dua kali berturut-turut sebagai user1:
curl -H "user_id: user1" httpbin:8000/headers -v curl -H "user_id: user1" httpbin:8000/headers -vOutput yang Diharapkan:
< HTTP/1.1 429 Too Many Requests < retry-after: 14 < date: Mon, 17 Jun 2024 11:48:53 GMT < server: envoy < content-length: 0 < x-envoy-upstream-service-time: 1 < * Koneksi #0 ke host httpbin ditinggalkan utuhDalam waktu 30 detik setelah langkah sebelumnya dieksekusi, jalankan perintah berikut untuk mengakses path /headers layanan HTTPBin sekali sebagai user2:
curl -H "user_id: user2" httpbin:8000/headers -vOutput yang Diharapkan:
< HTTP/1.1 200 OK < server: envoy < date: Mon, 17 Jun 2024 12:42:17 GMT < content-type: application/json < content-length: 378 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 5 < { "headers": { "Accept": "*/*", "Host": "httpbin:8000", "User-Agent": "curl/8.1.2", "User-Id": "user2", "X-Envoy-Attempt-Count": "1", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=ddab183a1502e5ededa933f83e90d3d5266e2ddf87555fb3da1ad40dde3c722e;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep" } } * Koneksi #0 ke host httpbin ditinggalkan utuhOutput menunjukkan bahwa pembatasan tidak dipicu ketika user2 mengakses path yang sama. Ini menunjukkan bahwa pembatasan aliran spesifik pengguna berhasil.
Referensi
Anda dapat memverifikasi apakah RateLimitingPolicy berlaku pada Grafana. Pastikan bahwa instance Prometheus untuk Grafana telah dikonfigurasi dengan suite penjadwalan lalu lintas ASM.
Anda dapat mengimpor konten berikut ke Grafana untuk membuat dasbor untuk RateLimitingPolicy.
Dasbor adalah sebagai berikut.
