All Products
Search
Document Center

Alibaba Cloud Service Mesh:Konfigurasikan pembatasan laju lokal untuk layanan

Last Updated:Mar 11, 2026

Throttling lokal membatasi jumlah permintaan yang diterima setiap pod, melindungi layanan dari kelebihan beban selama lonjakan lalu lintas, kehabisan sumber daya, atau serangan penolakan layanan. Setiap proxy sidecar Envoy menerapkan batasan secara independen menggunakan algoritma token bucket: token diisi ulang pada interval tetap, dan setiap permintaan masuk mengonsumsi satu token. Jika tidak ada token tersisa, proxy menolak permintaan tersebut dengan kode HTTP 429 (Too Many Requests).

Karena throttling diterapkan per pod, batas efektif di seluruh kluster berskala sebanding dengan jumlah replika. Misalnya, layanan dengan 3 replika dan batas 10 permintaan per 60 detik dapat menerima hingga total 30 permintaan di semua instans.

ApproachScopeUse when
Local throttling (dokumen ini)Per pod — setiap instans menerapkan batasannya sendiri secara independenAnda menginginkan perlindungan sederhana dengan latensi rendah tanpa ketergantungan eksternal
Global throttlingDibagi di seluruh instans — penghitung terpusat melacak total keseluruhanAnda memerlukan batas tepat di seluruh kluster terlepas dari jumlah replika

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Instans Service Mesh (ASM) yang memenuhi salah satu persyaratan versi berikut:

    • Enterprise Edition atau Ultimate Edition: versi 1.14.3 atau lebih baru. Untuk upgrade, lihat Update an ASM instance

    • Standard Edition: versi 1.9 atau lebih baru. Standard Edition hanya mendukung pendekatan rate limiting bawaan Istio. Lihat Enabling Rate Limits using Envoy dalam dokumentasi Istio

  • Kluster Kubernetes yang telah ditambahkan ke instans ASM

  • Injeksi otomatis proxy sidecar diaktifkan untuk namespace default. Lihat "Enable automatic sidecar proxy injection" dalam Manage global namespaces

Deploy layanan contoh

Deploy HTTPBin dan sleep sebagai layanan contoh, lalu verifikasi konektivitasnya.

  1. Buat file httpbin.yaml dengan konten berikut:

    httpbin.yaml

    ##################################################################################################
    # Sample HTTPBin service
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. Deploy layanan HTTPBin:

    kubectl apply -f httpbin.yaml -n default
  3. Buat file sleep.yaml dengan konten berikut:

    sleep.yaml

    ##################################################################################################
    # Sample sleep service
    ##################################################################################################
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: curlimages/curl
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
  4. Deploy layanan sleep:

    kubectl apply -f sleep.yaml -n default
  5. Buka shell di Pod sleep dan kirim permintaan uji:

    kubectl exec -it deploy/sleep -- sh

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

    Respons 200 OK mengonfirmasi konektivitas antara kedua layanan.

Throttle semua permintaan ke port tertentu

Skenario ini membatasi semua permintaan ke port 8000 layanan HTTPBin menjadi 10 permintaan per 60 detik per pod.

Buat aturan throttling

  1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih Traffic Management Center > Rate Limiting. Klik Create.

  3. Pada halaman Create, konfigurasikan parameter berikut, lalu klik OK.

    BagianParameterNilai
    Basic Information About ThrottlingNamespacedefault
    Namehttpbin
    Type of Effective WorkloadApplicable Application
    Relevant WorkloadKey: app, Value: httpbin
    List of Throttling RulesService Port8000 (port HTTP yang dideklarasikan dalam Service Kubernetes HTTPBin)
    Throttling ConfigurationTime Window for Throttling Detection60 detik
    Number of Requests Allowed in Time Window10
  4. Klik OK.

    Scenario 1 - throttling rule configuration

Setara YAML

YAML setara:

apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMLocalRateLimiter
metadata:
  name: httpbin
  namespace: default
spec:
  workloadSelector:
    labels:
      app: httpbin           # Target pods with the app=httpbin label
  isGateway: false            # Apply to application workloads, not gateways
  configs:
    - match:
        vhost:
          name: '*'           # Match all virtual hosts
          port: 8000          # Match requests to port 8000
          route:
            header_match:
              - name: ':path'
                prefix_match: /    # Match all paths
                invert_match: false
      limit:
        fill_interval:
          seconds: 60         # Time window: 60 seconds
        quota: 10             # Allow up to 10 requests per time window per pod

Verifikasi aturan throttling

  1. Buka shell di pod sleep:

    kubectl exec -it deploy/sleep -- sh
  2. Kirim 11 permintaan — 10 permintaan pertama menghabiskan semua token yang tersedia, dan permintaan ke-11 ditolak:

    for i in $(seq 1 11); do curl -s -o /dev/null -w "Request $i: %{http_code}\n" http://httpbin:8000/headers; done

    Output yang diharapkan (10 permintaan pertama mengembalikan 200, permintaan ke-11 mengembalikan 429):

    Request 1: 200
    ...
    Request 10: 200
    Request 11: 429

    Anda juga dapat memeriksa header respons lengkap dari permintaan yang ditolak:

    curl -v http://httpbin:8000/headers
    < HTTP/1.1 429 Too Many Requests
    < x-local-rate-limit: true
    < content-length: 18
    < content-type: text/plain

    Kode status 429 Too Many Requests dan header x-local-rate-limit: true mengonfirmasi bahwa throttling lokal aktif.

Throttle permintaan ke path tertentu pada suatu port

Skenario ini hanya membatasi permintaan ke path /headers pada port 8000 layanan HTTPBin. Permintaan ke path lain, seperti /get, tetap tidak dibatasi.

Buat aturan throttling

  1. Masuk ke Konsol ASM. Di panel navigasi sebelah kiri, pilih Service Mesh > Mesh Management.

  2. Pada halaman Mesh Management, klik nama instans ASM. Di panel navigasi sebelah kiri, pilih Traffic Management Center > Rate Limiting. Klik Create.

  3. Pada halaman Create, konfigurasikan parameter berikut, lalu klik OK.

    BagianParameterNilai
    Basic Information About ThrottlingNamespacedefault
    Namehttpbin
    Type of Effective WorkloadApplicable Application
    Relevant WorkloadKey: app, Value: httpbin
    List of Throttling RulesService Port8000
    Match Request AttributesMatched AttributesRequest Path
    Matching MethodPrefix Match
    Matched Content/headers
    Throttling ConfigurationTime Window for Throttling Detection60 detik
    Number of Requests Allowed in Time Window10

    Scenario 2 - throttling rule configuration with path matching

Verifikasi aturan throttling

  1. Buka shell di dalam sleep pod:

    kubectl exec -it deploy/sleep -- sh
  2. Kirim 11 permintaan ke /headers — 10 permintaan pertama berhasil, permintaan ke-11 ditolak:

    for i in $(seq 1 11); do curl -s -o /dev/null -w "Request $i: %{http_code}\n" http://httpbin:8000/headers; done

    Output yang diharapkan:

    Request 1: 200
    ...
    Request 10: 200
    Request 11: 429
  3. Konfirmasi bahwa permintaan ke path lain tidak dibatasi:

    curl -s -o /dev/null -w "%{http_code}\n" http://httpbin:8000/get

    Output yang diharapkan:

    200

    Respons 200 mengonfirmasi bahwa throttling hanya berlaku untuk path /headers.

Lihat metrik throttling lokal

Throttling lokal mengekspos empat metrik counter Envoy. Gunakan metrik ini untuk memantau perilaku throttling di lingkungan produksi.

MetrikTipeDeskripsi
envoy_http_local_rate_limiter_http_local_rate_limit_enabledCounterTotal permintaan yang dievaluasi oleh filter throttling
envoy_http_local_rate_limiter_http_local_rate_limit_okCounterPermintaan yang diizinkan (token tersedia di bucket)
envoy_http_local_rate_limiter_http_local_rate_limit_rate_limitedCounterPermintaan tanpa token tersedia (belum tentu ditolak — lihat enforced)
envoy_http_local_rate_limiter_http_local_rate_limit_enforcedCounterPermintaan yang ditolak dengan HTTP 429
Catatan

Jumlah rate_limited dapat berbeda dari enforced ketika persentase enforcement (filter_enforced) diatur di bawah 100%. Dalam kasus tersebut, beberapa permintaan yang kehabisan token dilacak tetapi tidak ditolak.

Untuk mengumpulkan metrik ini dengan Prometheus:

  1. Konfigurasikan proxyStatsMatcher pada proxy sidecar. Pilih Regular Expression Match dan atur nilainya ke .*http_local_rate_limit.*. Atau, klik Add Local Throttling Metrics. Untuk detailnya, lihat proxyStatsMatcher.

  2. Redeploy Deployment HTTPBin agar konfigurasi sidecar yang diperbarui berlaku. Lihat "(Optional) Redeploy workloads" dalam Configure sidecar proxies.

  3. Konfigurasikan aturan throttling dan jalankan pengujian permintaan seperti dijelaskan dalam Throttle semua permintaan ke port tertentu atau Throttle permintaan ke path tertentu pada suatu port.

  4. Kueri metrik throttling dari sidecar HTTPBin:

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

    Contoh output:

    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

Langkah selanjutnya

  • Pencocokan parameter kueri: Di ASM 1.19.0 dan versi lebih baru, gunakan bidang limit_overrides untuk mencocokkan permintaan berdasarkan parameter kueri. Lihat ASMLocalRateLimiter field reference.

  • Global throttling: Terapkan batas bersama di seluruh instans pod dengan ASMGlobalRateLimiter.

  • Throttling gerbang masuk: Terapkan throttling lokal atau global pada gerbang masuk.

  • Traffic warm-up: Tingkatkan trafik ke pod baru secara bertahap untuk menghindari timeout saat scaling. Lihat Use the warm-up feature.

  • Pemutusan sirkuit: Lindungi layanan dari kegagalan berantai dengan bidang connectionPool. Lihat Configure circuit breaking.