All Products
Search
Document Center

Alibaba Cloud Service Mesh:Mengonfigurasi throttling lokal

Last Updated:Jun 21, 2026

Untuk melindungi layanan Anda dari lonjakan traffic, kelebihan beban, kehabisan resource, atau serangan berbahaya, konfigurasikan throttling lokal di pusat manajemen traffic. Fitur ini menjaga traffic tetap berada dalam ambang batas yang terkendali sehingga memastikan ketersediaan dan stabilitas kinerja layanan. Throttling lokal diimplementasikan oleh proxy Envoy menggunakan algoritma token bucket untuk mengontrol laju permintaan ke layanan Anda. Algoritma ini menambahkan token ke dalam bucket pada interval reguler, dan setiap permintaan mengonsumsi satu token. Jika bucket kehabisan token, permintaan baru akan ditolak sementara, sehingga mencegah layanan menjadi kewalahan.

Prasyarat

  • Instans ASM telah dibuat dan memenuhi persyaratan berikut:

    • Untuk ASM Enterprise Edition (Professional atau Ultimate), versi instans harus 1.14.3 atau lebih baru. Untuk informasi selengkapnya tentang cara melakukan upgrade instans ASM, lihat Upgrade an ASM instance.

    • Untuk ASM Standard Edition, versi instans harus 1.9 atau lebih baru. Anda hanya dapat menggunakan metode Istio native untuk mengonfigurasi throttling lokal. Dokumentasi bervariasi tergantung pada versi Istio. Untuk informasi terbaru, lihat dokumentasi Istio Enabling Rate Limits using Envoy.

  • Injeksi otomatis sidecar proxy diaktifkan untuk namespace default di kluster Kubernetes. Untuk informasi selengkapnya, lihat Enable automatic sidecar proxy injection.

  • Layanan sampel httpbin dan sleep telah dideploy, dan layanan sleep dapat mengakses layanan httpbin. Untuk informasi selengkapnya, lihat Deploy the httpbin application.

Skenario 1: Terapkan throttling ke port layanan

Skenario ini menunjukkan cara menerapkan throttling lokal ke port 8000 layanan httpbin. Setelah dikonfigurasi, aturan ini berlaku untuk semua permintaan yang dikirim ke port tersebut.

  1. Buat aturan throttling lokal.

    1. Masuk ke ASM console. 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 > Traffic Protection and Scheduling. Pada halaman yang muncul, klik Create.

    3. Pada halaman Create, konfigurasikan parameter dan klik OK.

      Bagian

      Parameter

      Deskripsi

      Basic Information About Throttling

      Namespace

      Namespace tempat workload yang terpengaruh oleh throttling lokal berada. Dalam contoh ini, pilih default.

      Name

      Nama kustom untuk konfigurasi throttling lokal. Dalam contoh ini, masukkan httpbin.

      Type of Effective Workload

      Jenis workload tempat aturan throttling diterapkan. Nilai yang valid: Application Service dan Gateway. Dalam contoh ini, pilih Applicable Application.

      Relevant Workload

      Masukkan sekumpulan pasangan kunci-nilai label untuk memilih workload tertentu. Dalam contoh ini, atur Label Name ke app dan Label Value ke httpbin.

      List of Throttling Rules

      Service Port

      Nomor port yang dideklarasikan dalam Service Kubernetes dari layanan tersebut. Ini harus merupakan port HTTP. Dalam contoh ini, masukkan port HTTP 8000 layanan httpbin.

      Throttling Configuration

      Tentukan jendela waktu dan jumlah maksimum permintaan yang diizinkan dalam jendela tersebut untuk algoritma token bucket. Jika jumlah permintaan yang dikirim dalam jendela waktu melebihi batas ini, permintaan berikutnya akan dithrottling. Contoh ini menggunakan konfigurasi berikut:

      • Atur Time Window for Throttling Detection ke 60s.

      • Atur Allowed requests in window ke 10.

      Konfigurasi ini membatasi workload layanan hingga maksimal 10 permintaan dalam setiap jendela 60 detik.

      File YAML berikut adalah contoh konfigurasi throttling lokal.

      Konfigurasi throttling lokal YAML

      apiVersion: istio.alibabacloud.com/v1beta1
      kind: ASMLocalRateLimiter
      metadata:
        name: httpbin
        namespace: default
      spec:
        configs:
          - limit:
              fill_interval:
                seconds: 60
              quota: 10
            match:
              vhost:
                name: '*'
                port: 8000
                route:
                  header_match:
                    - invert_match: false
                      name: ':path'
                      prefix_match: /
        isGateway: false
        workloadSelector:
          labels:
            app: httpbin
  2. Verifikasi aturan throttling lokal.

    1. Jalankan perintah berikut untuk memulai sesi bash di kontainer sleep:

      kubectl exec -it deploy/sleep -- sh
    2. Jalankan perintah berikut untuk mengirim 10 permintaan:

      for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done
    3. Jalankan perintah berikut untuk mengirim permintaan ke-11:

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

      Output yang diharapkan:

      *   Trying 172.16.245.130:8000...
      * Connected to httpbin (172.16.245.130) port 8000
      > GET /headers HTTP/1.1
      > Host: httpbin:8000
      > User-Agent: curl/8.5.0
      > Accept: */*
      >
      < HTTP/1.1 429 Too Many Requests
      < x-local-rate-limit: true
      < content-length: 18
      < content-type: text/plain
      < date: Tue, 26 Dec 2023 08:02:58 GMT
      < server: envoy
      < x-envoy-upstream-service-time: 2

      Output menunjukkan kode status HTTP 429, yang mengindikasikan bahwa permintaan tersebut dithrottling.

Skenario 2: Terapkan throttling ke path permintaan

Skenario ini menunjukkan cara menerapkan throttling lokal ke permintaan yang dikirim ke path /headers pada port 8000 layanan httpbin. Setelah dikonfigurasi, aturan ini hanya berlaku untuk permintaan yang sesuai dengan path dan port tersebut.

  1. Buat aturan throttling lokal.

    1. Masuk ke ASM console. 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 > Traffic Protection and Scheduling. Pada halaman yang muncul, klik Create.

    3. Pada halaman Create, konfigurasikan parameter dan klik OK.

      Bagian

      Parameter

      Deskripsi

      Basic Information About Throttling

      Namespace

      Namespace tempat workload yang terpengaruh oleh throttling lokal berada. Dalam contoh ini, pilih default.

      Name

      Nama kustom untuk konfigurasi throttling lokal. Dalam contoh ini, masukkan httpbin.

      Type of Effective Workload

      Jenis workload tempat aturan throttling diterapkan. Nilai yang valid: Application Service dan Gateway. Dalam contoh ini, pilih Applicable Application.

      Relevant Workload

      Masukkan sekumpulan pasangan kunci-nilai label untuk memilih workload tertentu. Dalam contoh ini, atur Label Name ke app dan Label Value ke httpbin.

      List of Throttling Rules

      Service Port

      Nomor port yang dideklarasikan dalam Service Kubernetes dari layanan tersebut. Ini harus merupakan port HTTP. Dalam contoh ini, masukkan port HTTP 8000 layanan httpbin.

      Match Request Attributes

      Tentukan kondisi pencocokan untuk permintaan. Aturan hanya diterapkan pada permintaan yang memenuhi kondisi ini. Contoh ini menggunakan konfigurasi berikut:

      • Atur Matched Attributes ke Request Path.

      • Atur Matching Method ke Prefix Match.

      • Atur Matched Content ke /headers.

      Throttling Configuration

      Tentukan jendela waktu dan jumlah maksimum permintaan yang diizinkan dalam jendela tersebut untuk algoritma token bucket. Jika jumlah permintaan yang dikirim dalam jendela waktu melebihi batas ini, permintaan berikutnya akan dithrottling. Contoh ini menggunakan konfigurasi berikut:

      • Atur Time Window for Throttling Detection ke 60s.

      • Atur Allowed requests in window ke 10.

      Konfigurasi ini membatasi workload layanan hingga maksimal 10 permintaan dalam setiap jendela 60 detik.

  2. Verifikasi aturan throttling lokal.

    1. Jalankan perintah berikut untuk memulai sesi bash di kontainer sleep:

      kubectl exec -it deploy/sleep -- sh
    2. Jalankan perintah berikut untuk mengirim 10 permintaan:

      for i in $(seq 1 10); do curl -v http://httpbin:8000/headers; done
    3. Jalankan perintah berikut untuk mengirim permintaan ke-11:

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

      Output yang diharapkan:

      *   Trying 172.16.245.130:8000...
      * Connected to httpbin (172.16.245.130) port 8000
      > GET /headers HTTP/1.1
      > Host: httpbin:8000
      > User-Agent: curl/8.5.0
      > Accept: */*
      >
      < HTTP/1.1 429 Too Many Requests
      < x-local-rate-limit: true
      < content-length: 18
      < content-type: text/plain
      < date: Tue, 26 Dec 2023 08:02:58 GMT
      < server: envoy
      < x-envoy-upstream-service-time: 2

      Output menunjukkan kode status HTTP 429, yang mengindikasikan bahwa permintaan tersebut dithrottling.

    4. Jalankan perintah berikut untuk mengirim permintaan ke path /get layanan httpbin:

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

      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 03:46:11 GMT
      < content-type: application/json
      < content-length: 431
      < access-control-allow-origin: *
      < access-control-allow-credentials: true
      < x-envoy-upstream-service-time: 1
      <
      {
        "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"
      }

      Output menunjukkan kode status 200 OK. Hal ini mengonfirmasi bahwa permintaan ke path lain layanan httpbin tidak terpengaruh oleh aturan throttling.

Operasi terkait

Lihat metrik throttling lokal

Fitur throttling lokal menghasilkan metrik berikut:

Metrik

Deskripsi

envoy_http_local_rate_limiter_http_local_rate_limit_enabled

Jumlah total permintaan yang memicu filter rate limit.

envoy_http_local_rate_limiter_http_local_rate_limit_ok

Jumlah total permintaan yang diizinkan karena tersedia token.

envoy_http_local_rate_limiter_http_local_rate_limit_rate_limited

Jumlah total permintaan yang ditandai untuk throttling karena token tidak tersedia. Ini tidak berarti permintaan ditolak.

envoy_http_local_rate_limiter_http_local_rate_limit_enforced

Jumlah total permintaan yang dithrottling, misalnya, mengembalikan respons 429.

Konfigurasikan pengaturan proxyStatsMatcher pada sidecar proxy untuk melaporkan metrik ini. Kemudian, Anda dapat menggunakan Prometheus untuk mengumpulkan dan melihatnya.

  1. Konfigurasikan sidecar proxy untuk melaporkan metrik throttling dengan menggunakan proxyStatsMatcher.

    Saat mengonfigurasi proxyStatsMatcher, pilih Regular Expression Match dan atur ke .*http_local_rate_limit.*. Atau, klik Add Local Throttling Metrics. Untuk informasi selengkapnya, lihat proxyStatsMatcher.

  2. Redeploy layanan httpbin. Untuk informasi selengkapnya, lihat Redeploy workloads.

  3. Selesaikan konfigurasi throttling lokal dan kirim permintaan uji seperti yang dijelaskan dalam Skenario 1 atau Skenario 2.

  4. Jalankan perintah berikut untuk melihat metrik throttling lokal layanan httpbin:

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

    Output yang diharapkan:

    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

Konfigurasi pengumpulan metrik dan notifikasi

Setelah Anda mengonfigurasi pelaporan metrik, Anda dapat menyiapkan pengumpulan metrik di Prometheus dan membuat aturan notifikasi berdasarkan metrik utama untuk menerima pemberitahuan tepat waktu saat terjadi throttling. Contoh berikut menggunakan Managed Service for Prometheus.

  1. Di Managed Service for Prometheus, tambahkan komponen Alibaba Cloud ASM ke kluster bidang data Anda atau upgrade ke versi terbaru. Hal ini memastikan bahwa Managed Service for Prometheus dapat mengambil metrik throttling lokal yang diekspos. Untuk informasi selengkapnya, lihat Integration management. Jika Anda telah mengintegrasikan instans Prometheus self-managed untuk mengumpulkan metrik service mesh, Anda tidak perlu melakukan langkah ini. Untuk informasi selengkapnya, lihat Integrate a self-managed Prometheus instance for mesh monitoring.

  2. Buat aturan notifikasi untuk throttling lokal. Untuk informasi selengkapnya, lihat Create a Prometheus alert rule by using a custom PromQL query. Tabel berikut memberikan contoh cara mengonfigurasi parameter utama. Anda dapat mengonfigurasi parameter lain sesuai kebutuhan.

    Parameter

    Contoh

    Deskripsi

    Custom PromQL query

    (sum by(namespace, pod_name) (increase(envoy_http_local_rate_limiter_http_local_rate_limit_enforced[1m]))) > 0

    Kueri PromQL ini menggunakan fungsi increase untuk menemukan jumlah permintaan yang dithrottling dalam satu menit terakhir, dikelompokkan berdasarkan namespace dan nama pod. Notifikasi dipicu jika jumlah permintaan yang dithrottling dalam satu menit lebih besar dari 0.

    Pesan notifikasi

    Throttling lokal telah terjadi! Namespace: {{$labels.namespace}}, Pod: {{$labels.pod_name}}. Permintaan yang dithrottling dalam 1 menit terakhir: {{ $value }}

    Isi pemberitahuan notifikasi. Pesan contoh ini mencakup namespace dan nama pod yang memicu notifikasi, serta jumlah permintaan yang dithrottling dalam satu menit terakhir.

FAQ

Mengapa aturan throttling saya tidak berfungsi?

Protokol layanan salah

Throttling lokal hanya mendukung protokol HTTP. Sebelum mengonfigurasi aturan throttling, pastikan layanan Anda berkomunikasi melalui HTTP atau protokol lapisan aplikasi yang dibangun di atas HTTP, seperti gRPC atau Dubbo3.

Selain itu, Anda harus mendefinisikan protokol layanan dengan benar agar service mesh dapat mengidentifikasinya secara akurat. Untuk informasi selengkapnya, lihat How to correctly define the protocol type for a service.

Dampak CRD Sidecar terhadap lalu lintas inbound

Secara default, service mesh secara otomatis mengonfigurasi pendengar lalu lintas inbound untuk sidecar proxy berdasarkan deklarasi port dalam definisi Service. Baik throttling lokal maupun rate limiting global bergantung pada perilaku default ini.

Anda mungkin menggunakan Definisi Sumber Daya Kustom (CRD) Sidecar untuk memodifikasi konfigurasi lalu lintas inbound default layanan, misalnya, untuk mengizinkan pod lain mengakses aplikasi yang mendengarkan di localhost. Untuk informasi selengkapnya, lihat How to expose a localhost application to other pods.

Dalam kasus ini, karena pendengar default dimodifikasi, menentukan port Service Kubernetes dalam aturan throttling lokal tidak akan berfungsi. Anda harus mengatur Service Port dalam aturan throttling lokal ke port inbound aktual yang ditentukan dalam CRD Sidecar.

Sebagai contoh, jika Anda mengonfigurasi CRD Sidecar berikut untuk layanan httpbin saat mencoba menerapkan throttling lokal ke port 8000:

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: localhost-access
  namespace: default
spec:
  ingress:
    - defaultEndpoint: '127.0.0.1:80'
      port:
        name: http
        number: 80
        protocol: HTTP
  workloadSelector:
    labels:
      app: httpbin

Saat membuat aturan throttling lokal, Anda harus mengatur Service Port ke 80, bukan 8000.

Dokumen terkait