QuotaSchedulingPolicy CustomResourceDefinition (CRD) yang disediakan oleh suite penjadwalan lalu lintas Service Mesh (ASM) mendukung penjadwalan permintaan berbasis prioritas setelah kuota panggilan permintaan tercapai. Ketika laju permintaan melebihi kuota yang ditentukan, permintaan tambahan akan dimasukkan ke dalam antrian, dengan prioritas lebih tinggi diproses lebih cepat. Topik ini menjelaskan cara menggunakan QuotaSchedulingPolicy untuk mengimplementasikan manajemen kuota panggilan permintaan.
Informasi latar belakang
QuotaSchedulingPolicy menggunakan algoritma token bucket untuk mengontrol laju permintaan ke layanan tertentu dan menempatkan permintaan dalam antrian ketika laju tersebut melebihi kuota yang ditentukan. Berikut adalah cara kerja QuotaSchedulingPolicy:
Pembatas laju berbasis algoritma token bucket digunakan untuk membatasi laju permintaan. Untuk detail implementasi algoritma pembatas laju, lihat bagian Informasi Latar Belakang di Gunakan RateLimitingPolicy untuk Mengimplementasikan Throttling Spesifik Pengguna.
Jika laju permintaan melebihi batas kuota, permintaan tambahan dimasukkan ke dalam antrian dan dikirim ke layanan tujuan setelah permintaan sebelumnya diproses. Ini memastikan bahwa laju permintaan tetap sesuai dengan nilai yang ditentukan. Permintaan dengan prioritas lebih tinggi memiliki peluang lebih besar untuk dikeluarkan dari antrian dan diproses lebih awal.
Berbeda dengan throttling, QuotaSchedulingPolicy tidak langsung menolak permintaan saat laju permintaan melebihi kuota. Sebagai gantinya, permintaan tersebut ditempatkan dalam antrian prioritas dan dijadwalkan berdasarkan prioritas mereka sambil memastikan bahwa laju permintaan tetap berada dalam batas kuota.
Prasyarat
Cluster Container Service for Kubernetes (ACK) yang dikelola telah ditambahkan ke instance ASM Anda, dengan versi instance ASM V1.21.6.95 atau lebih baru. Untuk informasi lebih lanjut, lihat Tambahkan Cluster ke Instance ASM.
Anda telah terhubung ke cluster ACK menggunakan kubectl. Untuk detail lebih lanjut, lihat Dapatkan File kubeconfig Cluster dan Gunakan kubectl untuk Terhubung ke Cluster.
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 cluster ACK. Untuk informasi lebih lanjut, lihat Kelola Namespace Global.
Gateway ingress ASM bernama ingressgateway telah dibuat dan port 80 diaktifkan. Untuk informasi lebih lanjut, lihat Buat Gateway Ingress.
Aplikasi HTTPBin telah diterapkan dan dapat diakses melalui gateway. Untuk informasi lebih lanjut, lihat Terapkan Aplikasi HTTPBin.
Langkah 1: Buat QuotaSchedulingPolicy
Gunakan kubectl untuk terhubung ke instance ASM. Untuk informasi lebih lanjut, lihat Gunakan kubectl pada Bidang Kontrol untuk Mengakses Sumber Daya Istio.
Buat file quotaschedulingpolicy.yaml dengan konten berikut:
apiVersion: istio.alibabacloud.com/v1 kind: QuotaSchedulingPolicy metadata: name: quotascheduling namespace: istio-system spec: quota_scheduler: bucket_capacity: 10 fill_amount: 10 rate_limiter: interval: 1s scheduler: workloads: - label_matcher: match_labels: http.request.header.user_type: guest parameters: priority: 50.0 name: guest - label_matcher: match_labels: http.request.header.user_type: subscriber parameters: priority: 200.0 name: subscriber selectors: - service: httpbin.default.svc.cluster.localTabel berikut menjelaskan beberapa bidang penting. Untuk informasi lebih lanjut tentang bidang terkait, lihat Deskripsi Bidang QuotaSchedulingPolicy.
Bidang
Deskripsi
fill_amount
Jumlah token yang akan ditambahkan dalam interval waktu yang ditentukan oleh bidang interval. Dalam contoh ini, nilainya adalah 10, yang menunjukkan bahwa ember token diisi dengan 10 token setelah setiap interval yang ditentukan oleh bidang interval.
interval
Interval di mana token ditambahkan ke ember token. Dalam contoh ini, nilainya adalah 1s, yang menunjukkan bahwa ember token diisi dengan 10 token setiap 1 detik.
bucket_capacity
Jumlah maksimum token dalam ember token. Ketika laju permintaan lebih rendah daripada laju pengisian ember token, jumlah token dalam ember token akan terus bertambah hingga mencapai jumlah maksimum,
bucket_capacity, yang dicapai.bucket_capacitydigunakan untuk mengizinkan sejumlah lalu lintas burst tertentu. Dalam contoh ini, nilainya adalah 10, sama dengan nilai bidangfill_amount. Dalam hal ini, tidak ada lalu lintas burst yang diizinkan.workloads
Dua jenis permintaan didefinisikan berdasarkan
user_typedalam header permintaan:guestdansubscriber. Prioritas permintaan tipeguestadalah 50, dan prioritas permintaan tipesubscriberadalah 200.selectors
Layanan tempat kebijakan throttling diterapkan. Dalam contoh ini, layanan httpbin.default.svc.cluster.local digunakan, yang menunjukkan bahwa pembatasan konkurensi dilakukan pada layanan httpbin.default.svc.cluster.local.
Jalankan perintah berikut untuk membuat QuotaSchedulingPolicy:
kubectl apply -f quotaschedulingpolicy.yamlLangkah 2: Verifikasi apakah QuotaSchedulingPolicy berlaku
Dalam contoh ini, alat uji stres Fortio digunakan. Untuk informasi lebih lanjut, lihat bagian Instalasi Fortio di situs web GitHub.
Buka dua terminal dan jalankan dua perintah uji stres berikut secara bersamaan untuk memulai pengujian. Pastikan kedua terminal berfungsi sesuai harapan selama pengujian. Dalam pengujian ini, 10 permintaan konkuren dikirim ke layanan dengan laju permintaan per detik (QPS) sebesar 10.000, yang jauh melebihi kapasitas layanan.
fortio load -c 10 -qps 10000 -H "user_type:guest" -t 30s -timeout 60s -a http://${IP address of the ASM ingress gateway}/status/201fortio load -c 10 -qps 10000 -H "user_type:subscriber" -t 30s -timeout 60s -a http://${IP address of the ASM ingress gateway}/status/202CatatanGanti
${IP address of the ASM ingress gateway}dalam perintah di atas dengan alamat IP gateway ingress ASM Anda. Untuk informasi lebih lanjut tentang cara mendapatkan alamat IP gateway ingress ASM, lihat sublangkah 1 dari Langkah 3 dalam topik Gunakan Sumber Daya Istio untuk Merutekan Lalu Lintas ke Versi Layanan yang Berbeda.Keluaran yang diharapkan dari tes 1:
... # target 50% 4.83333 # target 75% 5.20763 # target 90% 5.38203 # target 99% 5.48668 # target 99.9% 5.49714 Sockets used: 10 (for perfect keepalive, would be 10) Uniform: false, Jitter: false Code 201 : 70 (100.0 %) Response Header Sizes : count 70 avg 249.94286 +/- 0.2871 min 248 max 250 sum 17496 Response Body/Total Sizes : count 70 avg 249.94286 +/- 0.2871 min 248 max 250 sum 17496 All done 70 calls (plus 10 warmup) 4566.839 ms avg, 2.1 qps Successfully wrote 4693 bytes of Json data to 2024-07-26-232250_114_55_5_155_status_201_iZbp1cz9ur77robaiv085tZ.jsonKeluaran yang diharapkan dari tes 2:
fortio load -c 10 -qps 10000 -H "user_type:subscriber" -t 30s -timeout 60s -a http://114.55.xx.xx/status/202 ... # target 50% 0.253333 # target 75% 1.875 # target 90% 4.26635 # target 99% 4.47301 # target 99.9% 4.49367 Sockets used: 10 (for perfect keepalive, would be 10) Uniform: false, Jitter: false Code 202 : 250 (100.0 %) Response Header Sizes : count 250 avg 250.264 +/- 0.4408 min 250 max 251 sum 62566 Response Body/Total Sizes : count 250 avg 250.264 +/- 0.4408 min 250 max 251 sum 62566 All done 250 calls (plus 10 warmup) 1226.657 ms avg, 8.0 qps Successfully wrote 4509 bytes of Json data to 2024-07-26-232250_114_55_5_155_status_202_iZbp1cz9ur77robaiv085tZ.jsonKeluaran di atas menunjukkan bahwa latensi rata-rata tes 2 sekitar 1/4 kali dari tes 1, dan QPS-nya sekitar empat kali lipat dari tes 1. Hal ini karena dalam kebijakan yang telah didefinisikan, prioritas permintaan tipe subscriber adalah empat kali lipat dari permintaan tipe guest. Total 320 permintaan diproses dalam 30 detik dalam dua tes. Setelah mengeluarkan 20 permintaan yang digunakan untuk pemanasan, laju permintaan yang diterima layanan tepat 10 permintaan per detik. Ini membuktikan bahwa permintaan yang diterima layanan selalu berada dalam batas yang ditentukan.
Referensi
Anda dapat memverifikasi apakah QuotaSchedulingPolicy berlaku di 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 QuotaSchedulingPolicy.
Dasbor adalah sebagai berikut.
