Pembatasan laju membatasi jumlah permintaan yang dapat dikirim klien ke server dalam periode tertentu, misalnya 300 per menit atau 10 per detik. Gunakan ASMGlobalRateLimiter di Alibaba Cloud Service Mesh (ASM) untuk menerapkan batas laju global terhadap lalu lintas masuk ke layanan aplikasi dengan sidecar yang telah disuntikkan.
Proxy Envoy menerapkan pembatasan laju melalui dua pendekatan: pembatasan laju global dan pembatasan laju lokal. Topik ini hanya membahas pembatasan laju global. Untuk konsep pembatasan laju dan petunjuk mengenai pembatasan laju lokal, lihat Configure local rate limiting in the Traffic Management Center.
Dua skenario dalam topik ini menunjukkan tingkat granularitas yang dapat diterapkan oleh batas laju global pada layanan aplikasi: semua permintaan pada port layanan (Skenario 1), atau hanya permintaan yang mengakses path tertentu pada port tersebut (Skenario 2). Kedua skenario menggunakan nama resource ASMGlobalRateLimiter yang sama (global-svc-test) dan ConfigMap yang sama (ratelimit-config).
Prasyarat
-
Kluster managed Container Service for Kubernetes (ACK) telah ditambahkan ke instans ASM, dan versi instans ASM adalah 1.18.0.131 atau lebih baru. Untuk instruksinya, lihat Add a cluster to an ASM instance.
-
Injeksi proxy sidecar otomatis diaktifkan untuk namespace
defaultdi kluster Kubernetes. Untuk instruksinya, lihat Enable automatic sidecar proxy injection. -
Gerbang masuk bernama ingressgateway telah dibuat, dan port 80 diaktifkan padanya. Untuk instruksinya, lihat Create an ingress gateway.
-
Aplikasi contoh httpbin dan sleep telah diterapkan. Untuk instruksinya, lihat Deploy the httpbin application in a cluster on the data plane dan Deploy the sleep service in a cluster on the data plane.
ASM mendukung pengonfigurasian pembatasan laju global untuk lalu lintas masuk ke gerbang masuk dan ke layanan aplikasi dengan sidecar yang telah disuntikkan mulai dari versi 1.18.0.131. Field limit_overrides, yang digunakan Skenario 2 untuk membatasi laju pada path tertentu, hanya didukung oleh instans ASM versi 1.19.0 atau lebih baru.
Terapkan layanan pembatas laju
Pembatasan laju global hanya berlaku setelah layanan pembatas laju berjalan di kluster pada bidang data. Terapkan layanan pembatas laju dan layanan Redis yang menjadi dependensinya sebelum Anda mengonfigurasi aturan pembatasan laju.
-
Buat file bernama
ratelimit-svc.yamldengan konten berikut.apiVersion: v1 kind: ServiceAccount metadata: name: redis --- apiVersion: v1 kind: Service metadata: name: redis labels: app: redis spec: ports: - name: redis port: 6379 selector: app: redis --- apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis sidecar.istio.io/inject: "false" spec: containers: - image: redis:alpine imagePullPolicy: Always name: redis ports: - name: redis containerPort: 6379 restartPolicy: Always serviceAccountName: redis --- apiVersion: v1 kind: ConfigMap metadata: name: ratelimit-config data: config.yaml: | {} --- apiVersion: v1 kind: Service metadata: name: ratelimit labels: app: ratelimit spec: ports: - name: http-port port: 8080 targetPort: 8080 protocol: TCP - name: grpc-port port: 8081 targetPort: 8081 protocol: TCP - name: http-debug port: 6070 targetPort: 6070 protocol: TCP selector: app: ratelimit --- apiVersion: apps/v1 kind: Deployment metadata: name: ratelimit spec: replicas: 1 selector: matchLabels: app: ratelimit strategy: type: Recreate template: metadata: labels: app: ratelimit sidecar.istio.io/inject: "false" spec: containers: # Latest image from https://hub.docker.com/r/envoyproxy/ratelimit/tags - image: envoyproxy/ratelimit:e059638d imagePullPolicy: Always name: ratelimit command: ["/bin/ratelimit"] env: - name: LOG_LEVEL value: debug - name: REDIS_SOCKET_TYPE value: tcp - name: REDIS_URL value: redis:6379 - name: USE_STATSD value: "false" - name: RUNTIME_ROOT value: /data - name: RUNTIME_SUBDIRECTORY value: ratelimit - name: RUNTIME_WATCH_ROOT value: "false" - name: RUNTIME_IGNOREDOTFILES value: "true" ports: - containerPort: 8080 - containerPort: 8081 - containerPort: 6070 volumeMounts: - name: config-volume # $RUNTIME_ROOT/$RUNTIME_SUBDIRECTORY/$RUNTIME_APPDIRECTORY/config.yaml mountPath: /data/ratelimit/config volumes: - name: config-volume configMap: name: ratelimit-config -
Dalam konteks kubeconfig kluster ACK, jalankan perintah berikut untuk membuat layanan pembatas laju dan layanan Redis yang menjadi dependensinya di kluster.
kubectl apply -f ratelimit-svc.yaml
Gunakan layanan pembatas laju yang dikelola ASM (opsional)
Fitur ini hanya didukung oleh instans ASM versi 1.25 atau lebih baru. Jika instans ASM Anda menggunakan versi sebelum 1.25, lanjutkan dengan menerapkan layanan pembatas laju seperti yang dijelaskan sebelumnya dan perbarui ConfigMap yang digunakan oleh layanan pembatas laju secara manual.
Di ASM 1.25 dan versi selanjutnya, Anda dapat menggunakan ASMMeshConfig untuk mengaktifkan layanan pembatas laju yang dikelola ASM. Dengan metode ini, Anda tidak perlu mengonfigurasi rateLimitService saat membuat ASMGlobalRateLimiter. ASM secara otomatis menggunakan layanan pembatas laju yang dikirimkan ke kluster pada bidang data dan memperbarui ConfigMap yang digunakan oleh layanan pembatas laju berdasarkan aturan pembatasan laju global.
-
Siapkan Redis yang menjadi dependensi layanan pembatas laju. ASM menerapkan layanan pembatas laju tetapi tidak menerapkan Redis. Anda dapat terus menggunakan Redis yang telah diterapkan sebelumnya atau menggunakan instans Redis yang sudah ada. Untuk terus menggunakan
ratelimit-svc.yamldari langkah sebelumnya, terapkan hanya ServiceAccount, Service, dan Deployment Redis di dalamnya. Jangan terapkan ConfigMapratelimit-config, Serviceratelimit, atau Deploymentratelimit. -
Dalam konteks kubeconfig instans ASM, jalankan perintah berikut untuk memverifikasi bahwa ASMMeshConfig/default ada.
kubectl get asmmeshconfig defaultBuat file bernama
ratelimit-service-patch.yaml. Contoh berikut menggunakan Redis yang diterapkan di namespacedefaultpada langkah sebelumnya.spec: rateLimitService: enabled: true replicas: 1 redis: type: single url: redis.default.svc.cluster.local:6379Jalankan perintah berikut untuk mengaktifkan layanan pembatas laju dengan merge patch agar tidak menimpa pengaturan lain di ASMMeshConfig/default.
kubectl patch asmmeshconfig default \ --type=merge \ --patch-file ratelimit-service-patch.yamlDalam konfigurasi ini,
enabledharus diatur ketrue.replicasmenentukan jumlah replika layanan pembatas laju.redis.typemendukungsingle,cluster, dansentinel.redis.urlharus berupa alamat Redis yang dapat diakses dari layanan pembatas laju di kluster pada bidang data. -
Saat membuat ASMGlobalRateLimiter dalam skenario berikut, hapus seluruh field
spec.rateLimitService. Jangan konfigurasi objek kosong sepertirateLimitService: {}. Biarkan pengaturan aturan pembatasan laju lainnya tetap tidak berubah.Jika Anda menghilangkan
spec.rateLimitService, ASM secara default menggunakanratelimit.istio-system.svc.cluster.local:8081dan secara otomatis membuat atau memperbarui ConfigMapistio-system/ratelimit-service-configdi kluster ACK. ConfigMap ini dikelola oleh ASM. Jangan ubah secara manual.Dalam konteks kubeconfig kluster ACK, jalankan perintah berikut untuk melihat konfigurasi pembatasan laju yang dihasilkan secara otomatis.
kubectl -n istio-system get configmap ratelimit-service-config -o yaml
Skenario berikut masih menunjukkan metode penerapan manual yang kompatibel dengan semua versi ASM. Jika Anda menggunakan layanan pembatas laju yang dikelola ASM, hilangkan rateLimitService seperti yang dijelaskan dalam bagian ini dan lewati langkah-langkah yang menyalin konfigurasi dari field status serta memperbarui ConfigMap secara manual. Semua pengaturan aturan pembatasan laju lainnya dan metode verifikasi tetap tidak berubah.
Skenario 1: Konfigurasikan pembatasan laju global untuk port layanan
Terapkan batas laju pada port 8000 layanan httpbin. Setelah Anda membuat aturan pembatasan laju, batas laju tersebut berlaku untuk semua permintaan yang dikirim ke port 8000 layanan httpbin.
-
Buat file bernama
global-ratelimit-svc.yamldengan konten berikut.apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: workloadSelector: labels: app: httpbin rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 isGateway: false configs: - name: httpbin limit: unit: MINUTE quota: 1 match: vhost: name: '*' port: 8000Tabel berikut menjelaskan beberapa field tersebut. Untuk deskripsi semua field, lihat ASMGlobalRateLimiter fields.
Parameter
Deskripsi
workloadSelectorMencocokkan workload tempat pembatasan laju berlaku. Dalam skenario ini, pembatasan laju global berlaku pada workload layanan httpbin, sehingga nilainya diatur ke
app: httpbin.isGatewayMenentukan apakah konfigurasi berlaku untuk gateway. Dalam contoh ini, nilainya diatur ke
false.rateLimitServiceNama domain, port, dan pengaturan timeout koneksi layanan pembatas laju. Untuk layanan pembatas laju yang diterapkan di Deploy the rate-limiting service, gunakan konfigurasi yang mengikuti tabel ini.
limitParameter pembatasan laju yang berlaku.
unitmenentukan satuan waktu deteksi pembatasan laju, danquotamenentukan jumlah total permintaan yang diizinkan dalam satu satuan waktu. Contoh ini mengaturunitkeMINUTEdanquotake1, yang berarti hanya satu permintaan per menit yang dapat dikirim pada rute yang cocok. Permintaan berlebih akan dibatasi lajunya.vhostPengaturan nama domain dan rute yang dicocokkan oleh pembatasan laju. Saat konfigurasi berlaku pada layanan aplikasi, atur
nameke'*'dan aturportke port Service layanan tersebut.Gunakan konfigurasi
rateLimitServiceberikut:host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 -
Dalam konteks kubeconfig instans ASM, jalankan perintah berikut untuk membuat aturan pembatasan laju global yang berlaku pada lalu lintas masuk ke layanan aplikasi httpbin.
kubectl apply -f global-ratelimit-svc.yaml -
Jalankan perintah berikut untuk mendapatkan konfigurasi yang telah direkonsiliasi dari aturan pembatasan laju global.
kubectl get asmglobalratelimiter global-svc-test -o yamlapiVersion: istio.alibabacloud.com/v1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: configs: - limit: quota: 1 unit: MINUTE match: vhost: name: '*' port: 8000 name: httpbin isGateway: false rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 workloadSelector: labels: app: httpbin status: config.yaml: | descriptors: - key: generic_key rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[3833670472] domain: ratelimit.default.svc.cluster.local message: ok status: successful -
Buat file bernama
ratelimit-config.yamluntuk menyimpan konfigurasi layanan pembatas laju global. Tempel string di fieldconfig.yamldi bawah fieldstatusresource ASMGlobalRateLimiter, apa adanya, ke fieldconfig.yamldengan nama yang sama di bawahdatadalam ConfigMap. ConfigMap ini memiliki nama yang sama dengan ConfigMapratelimit-configdiratelimit-svc.yaml, sehingga string yang ditempelkan menggantikan konfigurasi awal kosong ({}).apiVersion: v1 kind: ConfigMap metadata: name: ratelimit-config data: config.yaml: | descriptors: - key: generic_key rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[3833670472] domain: ratelimit.default.svc.cluster.localNilai-nilai dalam contoh ini berasal dari output yang diharapkan pada langkah sebelumnya. Gunakan nilai yang dikembalikan untuk resource ASMGlobalRateLimiter Anda sendiri, termasuk nilai
Iddivalue. -
Dalam konteks kubeconfig kluster ACK, jalankan perintah berikut untuk memperbarui konfigurasi layanan pembatas laju global di kluster.
kubectl apply -f ratelimit-config.yaml -
Jalankan perintah berikut untuk memulai sesi bash di aplikasi sleep.
kubectl exec -it deploy/sleep -- sh -
Jalankan perintah berikut untuk mengakses layanan httpbin dua kali berturut-turut.
curl httpbin:8000/get -v curl httpbin:8000/get -vPermintaan pertama diizinkan. Output berikut dikembalikan 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 intactKonfigurasi pembatasan laju global hanya mengizinkan satu permintaan ke layanan httpbin dalam satu menit, sehingga permintaan kedua dibatasi lajunya. Pembatasan laju global kini berlaku pada lalu lintas masuk ke port layanan httpbin.
Skenario 2: Konfigurasikan pembatasan laju global untuk path tertentu pada port layanan
Terapkan batas laju pada port 8000 layanan httpbin, dan batasi batas laju tersebut sehingga hanya berlaku pada permintaan yang mengakses path /headers. Setelah Anda membuat aturan pembatasan laju, batas laju tersebut berlaku untuk semua permintaan yang dikirim ke port 8000 layanan httpbin dan mengakses path /headers.
-
Buat file bernama
global-ratelimit-svc.yamldengan konten yang sesuai versi ASM Anda.YAML untuk versi ASM sebelum 1.19.0
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: workloadSelector: labels: app: httpbin rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 isGateway: false configs: - name: httpbin limit: unit: MINUTE quota: 1 match: vhost: name: '*' port: 8000 route: header_match: - name: ":path" prefix_match: "/headers"YAML untuk versi ASM 1.19.0 atau lebih baru
apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: workloadSelector: labels: app: httpbin rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 isGateway: false configs: - name: httpbin limit: unit: SECOND quota: 100000 match: vhost: name: '*' port: 8000 limit_overrides: - request_match: header_match: - name: ":path" prefix_match: "/headers" limit: unit: MINUTE quota: 1Tabel berikut menjelaskan beberapa field tersebut. Untuk deskripsi semua field, lihat ASMGlobalRateLimiter fields.
Parameter
Deskripsi
workloadSelectorMencocokkan workload tempat pembatasan laju berlaku. Dalam skenario ini, pembatasan laju global berlaku pada workload layanan httpbin, sehingga nilainya diatur ke
app: httpbin.isGatewayMenentukan apakah konfigurasi berlaku untuk gateway. Dalam contoh ini, nilainya diatur ke
false.rateLimitServiceNama domain, port, dan pengaturan timeout koneksi layanan pembatas laju. Untuk layanan pembatas laju yang diterapkan di Deploy the rate-limiting service, gunakan konfigurasi yang mengikuti tabel ini.
limitParameter pembatasan laju yang berlaku.
unitmenentukan satuan waktu deteksi pembatasan laju, danquotamenentukan jumlah total permintaan yang diizinkan dalam satu satuan waktu. Untuk instans ASM versi sebelum 1.19.0, contoh ini mengaturunitkeMINUTEdanquotake1, yang berarti hanya satu permintaan per menit yang dapat dikirim pada rute yang cocok, dan permintaan berlebih akan dibatasi lajunya. Untuk instans ASM versi 1.19.0 atau lebih baru, parameter pembatasan laju diatur ke 100.000 permintaan per detik, yang kira-kira setara dengan tanpa pembatasan laju, karena batas laju untuk permintaan yang memenuhi kondisi tertentu berlaku di fieldlimit_overrides.vhostPengaturan nama domain dan rute yang dicocokkan oleh pembatasan laju. Saat konfigurasi berlaku pada layanan aplikasi, atur
nameke'*'dan aturportke port Service layanan tersebut. Untuk instans ASM versi sebelum 1.19.0, Anda juga dapat mengonfigurasi aturan pencocokan header untuk permintaan diroute. Contoh ini mencocokkan header khusus bernama:path, yang mencocokkan path permintaan. Dengan kata lain, aturan ini mencocokkan semua permintaan yang path-nya dimulai dengan/headers. Untuk instans ASM versi 1.19.0 atau lebih baru, aturan pencocokan header untuk permintaan dipindahkan darirouteke fieldlimit_overrides.limit_overridesKonfigurasi penggantian batas laju, yang hanya didukung oleh instans ASM versi 1.19.0 atau lebih baru. Fitur ini mendukung pencocokan atribut berbeda dari permintaan dan menerapkan konfigurasi pembatasan laju terpisah pada permintaan spesifik yang cocok. Dalam contoh ini, field
limit_overridesmenentukan pencocokan header khusus:path, yang mencocokkan path permintaan. Dengan kata lain, penggantian ini mencocokkan semua permintaan yang path-nya dimulai dengan/headers.Gunakan konfigurasi
rateLimitServiceberikut:host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 -
Dalam konteks kubeconfig instans ASM, jalankan perintah berikut untuk membuat aturan pembatasan laju global yang berlaku pada lalu lintas masuk ke layanan aplikasi httpbin.
kubectl apply -f global-ratelimit-svc.yaml -
Jalankan perintah berikut untuk mendapatkan konfigurasi yang telah direkonsiliasi dari aturan pembatasan laju global.
kubectl get asmglobalratelimiter global-svc-test -o yamlapiVersion: istio.alibabacloud.com/v1 kind: ASMGlobalRateLimiter metadata: name: global-svc-test namespace: default spec: configs: - limit: quota: 100000 unit: SECOND limit_overrides: - limit: quota: 1 unit: MINUTE request_match: header_match: - name: :path prefix_match: /headers match: vhost: name: '*' port: 8000 name: httpbin isGateway: false rateLimitService: host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5 workloadSelector: labels: app: httpbin status: config.yaml: | descriptors: - descriptors: - key: header_match rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[2613586978] key: generic_key rate_limit: requests_per_unit: 100000 unit: SECOND value: RateLimit[global-svc-test.default]-Id[2613586978] domain: ratelimit.default.svc.cluster.local message: ok status: successful -
Buat file bernama
ratelimit-config.yamluntuk menyimpan konfigurasi layanan pembatas laju global. Tempel string di fieldconfig.yamldi bawah fieldstatusresource ASMGlobalRateLimiter, apa adanya, ke fieldconfig.yamldengan nama yang sama di bawahdatadalam ConfigMap. ConfigMap ini memiliki nama yang sama dengan ConfigMapratelimit-configdiratelimit-svc.yaml, sehingga string yang ditempelkan menggantikan konfigurasi awal kosong ({}).apiVersion: v1 kind: ConfigMap metadata: name: ratelimit-config data: config.yaml: | descriptors: - descriptors: - key: header_match rate_limit: requests_per_unit: 1 unit: MINUTE value: RateLimit[global-svc-test.default]-Id[2613586978] key: generic_key rate_limit: requests_per_unit: 100000 unit: SECOND value: RateLimit[global-svc-test.default]-Id[2613586978] domain: ratelimit.default.svc.cluster.localNilai-nilai dalam contoh ini berasal dari output yang diharapkan pada langkah sebelumnya. Gunakan nilai yang dikembalikan untuk resource ASMGlobalRateLimiter Anda sendiri, termasuk nilai
Iddivalue. -
Dalam konteks kubeconfig kluster ACK, jalankan perintah berikut untuk memperbarui konfigurasi layanan pembatas laju global di kluster.
kubectl apply -f ratelimit-config.yaml -
Jalankan perintah berikut untuk memulai sesi bash di aplikasi sleep.
kubectl exec -it deploy/sleep -- sh -
Jalankan perintah berikut untuk mengakses path
/headerslayanan httpbin dua kali berturut-turut.curl httpbin:8000/headers -v curl httpbin:8000/headers -vPermintaan pertama diizinkan. Output berikut dikembalikan 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 intactKonfigurasi pembatasan laju global hanya mengizinkan satu permintaan ke path
/headerslayanan httpbin dalam satu menit, sehingga permintaan kedua dibatasi lajunya. Pembatasan laju global kini berlaku pada lalu lintas masuk ke path/headerslayanan httpbin. -
Jalankan perintah berikut untuk mengakses path
/getlayanan httpbin.curl httpbin:8000/get -vOutput 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 06:25:09 GMT < content-type: application/json < content-length: 431 < access-control-allow-origin: * < access-control-allow-credentials: true < x-envoy-upstream-service-time: 7 < { "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" } * Connection #0 to host httpbin left intactPermintaan yang dikirim ke path lain layanan httpbin tidak terpengaruh oleh konfigurasi pembatasan laju global dan masih dapat diakses secara normal.
Referensi
-
Untuk deskripsi field ASMGlobalRateLimiter, lihat ASMGlobalRateLimiter fields.
-
Untuk informasi lebih lanjut tentang cara mengonfigurasi pembatasan laju lokal di Traffic Management Center, lihat Configure local rate limiting in the Traffic Management Center.
-
Untuk informasi lebih lanjut tentang cara mengonfigurasi pembatasan laju global untuk gerbang masuk, lihat Configure global rate limiting for an ingress gateway.