All Products
Search
Document Center

Alibaba Cloud Service Mesh:Konfigurasikan pembatasan laju global untuk lalu lintas inbound sidecar

Last Updated:Mar 11, 2026

Ketika beberapa replika layanan berjalan di belakang load balancer, pembatasan laju per instans tidak dapat menegakkan batas total permintaan di seluruh layanan. Pembatasan laju global mengatasi hal ini dengan menggunakan layanan terpusat untuk mengoordinasikan jumlah permintaan di seluruh proxy sidecar Envoy dalam mesh.

Service Mesh (ASM) V1.18.0.131 dan versi yang lebih baru menyediakan resource kustom ASMGlobalRateLimiter (CR) untuk mengonfigurasi pembatasan laju global pada lalu lintas inbound layanan yang memiliki proxy sidecar yang disuntikkan. CR ini menyediakan API deklaratif yang stabil yang menyembunyikan konfigurasi filter Envoy tingkat rendah.

Topik ini mencakup dua skenario:

  • Pembatasan laju tingkat port: Batasi semua permintaan ke port layanan tertentu.

  • Pembatasan laju tingkat path: Batasi permintaan ke path URL tertentu pada port layanan.

Catatan

Untuk pembatasan laju per instans, lihat Konfigurasikan pembatasan laju lokal di Traffic Management Center.

Pembatasan laju global vs. lokal

Pendekatan

Cara kerja

Paling cocok untuk

Global rate limiting

Layanan gRPC terpusat (didukung oleh Redis) melacak jumlah permintaan di seluruh instans.

Menegakkan batas ketat di seluruh layanan, terlepas dari jumlah replika.

Local rate limiting

Setiap proxy sidecar Envoy menegakkan batas secara independen.

Melindungi instans individual dari kelebihan beban. Tidak ada dependensi eksternal.

Cara kerja

Pembatasan laju global mengandalkan tiga komponen:

  1. Redis — Menyimpan penghitung permintaan yang dibagikan di seluruh proxy sidecar Envoy.

  2. Layanan pembatas laju — Layanan gRPC yang dikueri oleh proxy sidecar Envoy sebelum meneruskan permintaan. Layanan ini memeriksa penghitung di Redis dan mengembalikan keputusan izinkan atau tolak.

  3. CR ASMGlobalRateLimiter — Konfigurasi deklaratif yang diterapkan pada lapisan kontrol ASM. ASM menerjemahkannya menjadi konfigurasi filter Envoy dan menghasilkan konfigurasi layanan pembatas laju di bidang status CR tersebut.

Client request --> Envoy sidecar --> Rate limit service (gRPC) --> Redis
                       |
              Allow or deny (HTTP 429)

Prasyarat

  • Kluster ACK yang dikelola telah ditambahkan ke instans ASM Anda (V1.18.0.131 atau lebih baru). Untuk informasi selengkapnya, lihat Tambahkan kluster ke instans ASM.

  • Injeksi proxy sidecar otomatis diaktifkan untuk namespace default. Untuk informasi selengkapnya, lihat bagian "Enable automatic sidecar proxy injection" dalam Kelola namespace global.

  • Gerbang masuk ASM bernama ingressgateway dengan port 80 diaktifkan. Untuk informasi selengkapnya, lihat Buat gerbang masuk.

  • Aplikasi contoh sleep dan httpbin telah dideploy. Untuk informasi selengkapnya, lihat Deploy aplikasi HTTPBin dan Deploy layanan sleep.

Deploy layanan pembatas laju

Deploy Redis dan layanan pembatas laju ke kluster ACK Anda sebelum mengonfigurasi aturan pembatasan laju.

  1. Buat file bernama ratelimit-svc.yaml dengan konten berikut:

    ratelimit-svc.yaml

    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
  2. Jalankan perintah berikut di kluster ACK untuk mendeploy layanan:

    kubectl apply -f ratelimit-svc.yaml

Skenario 1: Batasi laju semua permintaan pada port layanan

Skenario ini membatasi semua permintaan ke port 8000 layanan HTTPBin menjadi 1 permintaan per menit.

Alur kerja terdiri dari tiga langkah: buat CR ASMGlobalRateLimiter pada instans ASM, sinkronkan konfigurasi yang dihasilkan ke layanan pembatas laju di kluster ACK, lalu verifikasi.

Langkah 1: Buat CR ASMGlobalRateLimiter

  1. Buat file bernama global-ratelimit-svc.yaml:

    global-ratelimit-svc.yaml

    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

    Tabel berikut menjelaskan bidang-bidang utama. Untuk referensi lengkap semua bidang, lihat Deskripsi bidang ASMGlobalRateLimiter.

    Bidang

    Deskripsi

    workloadSelector

    Memilih workload target. Tetapkan app: httpbin untuk menerapkan pembatasan laju pada layanan HTTPBin.

    isGateway

    Diatur ke false karena aturan ini menargetkan workload sidecar, bukan gerbang masuk.

    rateLimitService

    Pengaturan koneksi untuk layanan pembatas laju: hostname, port gRPC (8081), dan timeout 5 detik.

    limit

    Ambang batas pembatasan laju. unit: MINUTE dan quota: 1 berarti 1 permintaan per menit pada rute yang sesuai.

    vhost

    Mencocokkan host virtual. name: '*' dengan port: 8000 menerapkan aturan ke semua permintaan pada port 8000 HTTPBin.

  2. Jalankan perintah berikut di instans ASM untuk menerapkan CR:

    kubectl apply -f global-ratelimit-svc.yaml

Langkah 2: Sinkronkan konfigurasi pembatas laju ke bidang data

Setelah ASM memproses CR, konfigurasi layanan pembatas laju dihasilkan di bidang status.config.yaml. Anda harus menyalin konfigurasi ini ke ConfigMap layanan pembatas laju di kluster ACK. Sinkronisasi manual ini diperlukan karena lapisan kontrol ASM dan bidang data ACK berjalan di kluster terpisah.

  1. Ambil konfigurasi yang dihasilkan dari instans ASM:

    kubectl get asmglobalratelimiter global-svc-test -o yaml

    Dalam output, temukan bagian status:

    Output yang diharapkan

    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
  2. Buat file ratelimit-config.yaml. Salin konten config.yaml dari bagian status ke bidang data.config.yaml ConfigMap persis seperti yang ditunjukkan:

    Penting

    Salin nilai config.yaml dari bagian status tanpa modifikasi. Perubahan apa pun akan menyebabkan layanan pembatas laju menolak konfigurasi tersebut.

    ratelimit-config.yaml

    apiVersion: v1
       kind: ConfigMap
       metadata:
         name: ratelimit-config
       data:
         config.yaml: |
           descriptors:
           - key: header_match
             rate_limit:
               requests_per_unit: 1
               unit: MINUTE
             value: RateLimit[global-svc-test.default]-Id[1492204717]
           domain: ratelimit.default.svc.cluster.local
  3. Terapkan ConfigMap ke kluster ACK:

    kubectl apply -f ratelimit-config.yaml

Verifikasi

Kirim dua permintaan ke port 8000 HTTPBin dari pod sleep:

kubectl exec -it deploy/sleep -- sh

Kemudian jalankan:

curl httpbin:8000/get -v
curl httpbin:8000/get -v

Output yang diharapkan 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 intact

Permintaan kedua mengembalikan 429, yang mengonfirmasi bahwa pembatasan laju global aktif. Hanya satu permintaan yang diizinkan untuk mengakses layanan HTTPBin dalam satu menit. Saat Anda mengirim permintaan kedua, pembatasan kecepatan dipicu, yang menunjukkan bahwa pembatasan laju global berlaku pada lalu lintas inbound layanan yang telah disuntikkan proxy sidecar.

Skenario 2: Batasi laju permintaan ke path tertentu

Skenario ini membatasi permintaan ke path /headers pada port 8000 HTTPBin menjadi 1 permintaan per menit, sementara akses tak terbatas tetap diizinkan ke path lain seperti /get.

Konfigurasi berbeda tergantung pada versi ASM Anda.

Langkah 1: Buat CR ASMGlobalRateLimiter

Pilih YAML yang sesuai dengan versi ASM Anda:

ASM sebelum V1.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"

Pada versi sebelum V1.19.0, pencocokan path dikonfigurasi di dalam match.vhost.route.header_match. Pseudo-header :path mencocokkan path permintaan berdasarkan awalan.

ASM V1.19.0 atau lebih baru (disarankan)

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: 1

Pada V1.19.0 dan versi lebih baru, gunakan bidang limit_overrides untuk pencocokan berbasis path. Batas dasar limit diatur ke nilai tinggi (100.000 permintaan/detik) sehingga hanya permintaan yang sesuai dengan override yang dibatasi lajunya.

Tabel berikut menjelaskan bidang tambahan yang digunakan dalam skenario ini:

Bidang

Deskripsi

limit

Parameter throttling yang berlaku. unit menunjukkan satuan waktu untuk deteksi throttling. quota menunjukkan jumlah total permintaan yang diizinkan per satuan waktu. Jika instans ASM adalah V1.19.0 atau lebih baru, unit diatur ke SECOND dan quota diatur ke 100000, artinya 100.000 permintaan diizinkan per detik pada rute yang sesuai. Ini secara efektif berarti tidak ada throttling pada aturan dasar. Anda dapat menggunakan bidang limit_overrides untuk mengonfigurasi throttling untuk permintaan yang memenuhi kriteria tertentu.

limit_overrides

(V1.19.0+) Mengganti ambang batas pembatasan laju dasar untuk permintaan yang sesuai dengan kriteria tertentu. Setiap override menentukan request_match dan limit sendiri.

vhost

Nama domain dan rute tempat throttling berlaku. Untuk versi sebelum V1.19.0, Anda dapat mengonfigurasi aturan pencocokan header untuk permintaan di bagian route. Untuk V1.19.0 dan versi lebih baru, konfigurasikan aturan pencocokan header di bidang limit_overrides.

route.header_match

(Sebelum V1.19.0) Mencocokkan permintaan berdasarkan nilai header HTTP dalam rute vhost. Gunakan pseudo-header :path untuk pencocokan path URL.

Langkah 2: Sinkronkan konfigurasi pembatas laju ke bidang data

Ikuti proses yang sama seperti Skenario 1:

  1. Ambil konfigurasi yang dihasilkan dari instans ASM:

    kubectl get asmglobalratelimiter global-svc-test -o yaml

    Output status yang diharapkan (V1.19.0+)

    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
  2. Salin config.yaml dari bagian status ke ConfigMap dan terapkan ke kluster ACK:

    ratelimit-config.yaml

    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.local
    kubectl apply -f ratelimit-config.yaml

Verifikasi

  1. Kirim dua permintaan ke path /headers dari pod sleep:

    kubectl exec -it deploy/sleep -- sh

    Kemudian jalankan:

    curl httpbin:8000/headers -v
    curl httpbin:8000/headers -v

    Output yang diharapkan 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 intact

    Permintaan kedua ke /headers dibatasi lajunya. Hanya satu permintaan yang diizinkan untuk mengakses path /headers layanan HTTPBin dalam satu menit.

  2. Konfirmasi bahwa path lain tidak terpengaruh:

    curl httpbin:8000/get -v

    Output 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 intact

    Permintaan ke /get berhasil karena hanya path /headers yang dikenai pembatasan laju.

Monitor metrik pembatasan laju global

Proxy sidecar Envoy mengekspos metrik untuk pembatasan laju global:

Metrik

Tipe

Deskripsi

envoy_cluster_ratelimit_ok

Counter

Jumlah total permintaan yang diizinkan oleh throttling global.

envoy_cluster_ratelimit_over_limit

Counter

Jumlah total permintaan yang ditentukan memicu throttling oleh throttling global.

envoy_cluster_ratelimit_error

Counter

Jumlah total permintaan yang gagal memanggil throttling global.

Aktifkan pelaporan metrik

  1. Konfigurasikan proxyStatsMatcher untuk proxy sidecar. Pilih Regular Expression Match dan atur nilainya ke .*ratelimit.*. Untuk informasi selengkapnya, lihat bagian "proxyStatsMatcher" dalam Konfigurasikan proxy sidecar.

  2. Redeploy layanan HTTPBin untuk menerapkan konfigurasi proxy baru. Untuk informasi selengkapnya, lihat bagian "(Optional) Redeploy workloads" dalam Konfigurasikan proxy sidecar.

  3. Konfigurasikan throttling global dan lakukan pengujian permintaan. Untuk informasi selengkapnya, lihat Skenario 1 atau Konfigurasikan pembatasan laju lokal di Traffic Management Center.

  4. Jalankan perintah berikut untuk melihat metrik throttling global layanan HTTPBin:

    kubectl exec -it deploy/httpbin -c istio-proxy -- curl localhost:15090/stats/prometheus|grep envoy_cluster_ratelimit

    Contoh output:

    # TYPE envoy_cluster_ratelimit_ok counter
    envoy_cluster_ratelimit_ok{cluster_name="inbound|80||"} 904
    # TYPE envoy_cluster_ratelimit_over_limit counter
    envoy_cluster_ratelimit_over_limit{cluster_name="inbound|80||"} 3223

Siapkan alert Prometheus

Gunakan Managed Service for Prometheus untuk mengumpulkan metrik pembatasan laju dan memicu alert saat pembatasan laju terjadi.

  1. Hubungkan kluster ACK ke komponen Alibaba Cloud ASM dalam Managed Service for Prometheus, atau tingkatkan komponen ke versi terbaru. Untuk informasi selengkapnya, lihat Kelola komponen.

    Catatan

    Jika Anda sudah menggunakan instans Prometheus yang dikelola sendiri untuk mengumpulkan metrik ASM, lewati langkah ini. Untuk informasi selengkapnya, lihat Monitor instans ASM menggunakan instans Prometheus yang dikelola sendiri.

  2. Buat aturan alert kustom dengan PromQL dan templat pesan berikut. Untuk petunjuk detail, lihat Buat aturan alert dengan pernyataan PromQL kustom. Aturan ini aktif ketika layanan mana pun memiliki setidaknya satu permintaan yang dibatasi lajunya dalam jendela satu menit bergulir, dikelompokkan berdasarkan namespace dan nama layanan.

    Parameter

    Nilai contoh

    Pernyataan PromQL

    (sum by(namespace, service_istio_io_canonical_name) (increase(envoy_cluster_ratelimit_over_limit[1m]))) > 0

    Pesan alert

    Global rate limiting triggered. Namespace: {{$labels.namespace}}. Service: {{$labels.service_istio_io_canonical_name}}. Throttled requests in the last minute: {{ $value }}

Langkah selanjutnya

Referensi