全部产品
Search
文档中心

Alibaba Cloud Service Mesh:Konfigurasikan pembatasan laju global untuk gerbang masuk

更新时间:Nov 11, 2025

Anda dapat mengonfigurasi throttling global untuk rute tertentu dari gateway ingress guna menerapkan kontrol yang tepat atas trafik. Hal ini membantu mengatasi masalah seperti lonjakan trafik, beban layanan, kehabisan sumber daya, dan serangan jahat. Dengan demikian, stabilitas layanan backend terlindungi, biaya berkurang, dan pengalaman pengguna meningkat.

Prasyarat

  • Kluster Kubernetes terkelola telah ditambahkan ke instans ASM Anda, dan versi instans ASM adalah 1.18.0.131 atau lebih baru. Untuk informasi selengkapnya, lihat Menambahkan kluster ke instans ASM.

  • Injeksi sidecar otomatis diaktifkan untuk namespace default di kluster Kubernetes. Untuk informasi selengkapnya, lihat Mengaktifkan injeksi otomatis.

  • Sebuah gateway ingress bernama ingressgateway telah dibuat dan port 80 diaktifkan. Untuk informasi lebih lanjut, lihat Buat gateway ingress.

Persiapan

Men-deploy layanan pembatasan laju

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

    Tampilkan file 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: registry-cn-hangzhou.ack.aliyuncs.com/dev/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: registry-cn-hangzhou.ack.aliyuncs.com/dev/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.default.svc.cluster.local: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. Di lingkungan kubeconfig kluster ACK, jalankan perintah berikut untuk membuat layanan pembatasan laju beserta layanan Redis dependennya di dalam kluster.

    Untuk informasi selengkapnya tentang cara menghubungkan ke kluster menggunakan kubectl, lihat Mendapatkan file kubeconfig kluster dan menggunakan kubectl untuk menghubungkan ke kluster.

    kubectl apply -f ratelimit-svc.yaml

Men-deploy aplikasi sampel Bookinfo

  1. Unduh file bookinfo.yaml aplikasi Bookinfo dari repositori Istio di GitHub.

  2. Untuk men-deploy aplikasi Bookinfo ke kluster instans ASM, jalankan perintah berikut di lingkungan kubeconfig kluster ACK.

    kubectl apply -f bookinfo.yaml
  3. Buat file bookinfo-gateway.yaml dengan konten berikut:

    Tampilkan file bookinfo-gateway.yaml

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: bookinfo-gateway
      namespace: default
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - bf2.example.com
          port:
            name: http
            number: 80
            protocol: http
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo
      namespace: default
    spec:
      gateways:
        - bookinfo-gateway
      hosts:
        - bf2.example.com
      http:
        - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
          name: productpage-route-name1
          route:
            - destination:
                host: productpage
                port:
                  number: 9080
  4. Di lingkungan kubeconfig untuk instans ASM, jalankan perintah berikut untuk membuat aturan routing untuk aplikasi Bookinfo pada gerbang masuk.

    Aturan routing tersebut bernama productpage-route-name1 dan mencocokkan permintaan untuk nama domain bf2.example.com. Untuk informasi selengkapnya tentang cara menggunakan kubectl untuk mengakses instans ASM, lihat Menggunakan kubectl pada lapisan kontrol untuk mengakses sumber daya Istio.

    kubectl apply -f bookinfo-gateway.yaml

Skenario 1: Konfigurasikan aturan throttling global untuk rute gateway ingress tertentu

Konfigurasikan aturan pembatasan laju untuk rute productpage-route-name1 yang terkait dengan kombinasi nama domain dan port bf2.example.com:80. Rute productpage-route-name1 merupakan bagian dari layanan virtual bookinfo yang dibuat di bagian Persiapan. Rute ini mencocokkan permintaan untuk path seperti /productpage, /static, /login, dan /logout, serta meneruskan permintaan yang cocok ke layanan productpage. Setelah aturan pembatasan laju dikonfigurasi, permintaan yang dikirim ke path-path tersebut akan dikenai pembatasan laju.

  1. Buat file global-ratelimit-gw.yaml dengan konten berikut:

    Tampilkan file global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      rateLimitService: # Konfigurasi layanan pembatasan laju yang di-deploy di bagian Persiapan.
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: MINUTE
          quota: 1
        match:
          vhost:
            name: bf2.example.com # Nama ini harus sama dengan nama domain di VirtualService.
            port: 80 # Nomor port ini harus sesuai dengan port gerbang ASM.
            route:
              name_match: productpage-route-name1  # Nama ini harus sama dengan aturan routing di VirtualService.

    Tabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut, lihat Deskripsi bidang ASMGlobalRateLimiter.

    Bidang

    Deskripsi

    workloadSelector

    Workload tempat aturan pembatasan laju berlaku. Dalam contoh ini, pembatasan laju global berlaku pada gerbang masuk ingressgateway. Atur parameter ini menjadi istio: ingressgateway.

    isGateway

    Menentukan apakah aturan berlaku untuk gerbang. Dalam contoh ini, parameter ini diatur ke true.

    rateLimitService

    Nama domain, port, dan pengaturan batas waktu koneksi untuk layanan throttling. Blok kode berikut menunjukkan pengaturan layanan throttling yang diterapkan di Preparations:

       host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Parameter konfigurasi pembatasan laju yang berlaku. unit menentukan satuan waktu untuk deteksi pembatasan laju. quota menentukan jumlah total permintaan yang diizinkan per satuan waktu.

    Dalam contoh ini, unit diatur ke MINUTE dan quota diatur ke 1. Ini berarti hanya satu permintaan yang dapat dikirim per menit pada rute yang cocok. Permintaan berlebih akan dibatasi.

    vhost

    Konfigurasi nama domain dan item rute yang dicocokkan oleh aturan pembatasan laju. Nilai name dan port harus sama dengan nama domain di layanan virtual yang diterapkan pada gerbang dan port gerbang masuk. Nama rute yang ditentukan di route.name_match harus sama dengan nama item rute di layanan virtual.

  2. Di lingkungan kubeconfig instans ASM, jalankan perintah berikut untuk membuat aturan pembatasan laju global untuk rute productpage-route-name1 pada gerbang.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Jalankan perintah berikut untuk mendapatkan konfigurasi aturan throttling global:

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Tampilkan output yang diharapkan

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 1
          unit: MINUTE
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          app: istio-ingressgateway
    status:
      config.yaml: |
        descriptors:
        - key: generic_key
          rate_limit:
            requests_per_unit: 1
            unit: MINUTE
          value: RateLimit[global-test.istio-system]-Id[597770312]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Salin konten field config.yaml dari field status sumber daya ASMGlobalRateLimiter pada output langkah sebelumnya. Tempelkan konten tersebut ke dalam file `ratelimit-config.yaml` untuk menghasilkan konfigurasi layanan pembatasan laju global.

    Isi string field config.yaml, yang terletak di bawah field status ASMGlobalRateLimiter, harus ditempelkan persis seperti aslinya ke dalam field config.yaml di bagian data ConfigMap.

    Tampilkan file ratelimit-config.yaml

    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-test.istio-system]-Id[597770312]
        domain: ratelimit.default.svc.cluster.local
  5. Di lingkungan kubeconfig kluster ACK, jalankan perintah berikut untuk memperbarui konfigurasi layanan pembatasan laju global di kluster.

    kubectl apply -f ratelimit-config.yaml
  6. Jalankan perintah berikut untuk mengakses aplikasi Bookinfo dua kali.

    Ganti <IP gerbang ASM> dengan alamat IP aktual gerbang. Untuk informasi selengkapnya tentang cara mendapatkan alamat IP gerbang, lihat Mendapatkan alamat gerbang masuk.

    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v
    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v

    Blok kode berikut menunjukkan output yang diharapkan untuk akses kedua ke aplikasi Bookinfo:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    Dalam konfigurasi throttling global, hanya satu permintaan yang diizinkan untuk mengakses aplikasi Bookinfo dalam satu menit. Ketika Anda mengakses aplikasi Bookinfo dua kali dalam satu menit, permintaan pertama berhasil dan throttling dipicu pada permintaan kedua. Ini menunjukkan bahwa throttling global berlaku pada rute gateway ingress tertentu.

Skenario 2: Konfigurasikan aturan throttling global untuk nama domain tertentu dan port tertentu pada gateway ingress

Anda dapat mengonfigurasi aturan pembatasan laju global untuk kombinasi nama domain dan port bf2.example.com:80. Setelah aturan dikonfigurasi, permintaan yang dikirim ke nama domain dan port ini akan dikenai pembatasan laju.

  1. Buat file global-ratelimit-gw.yaml dengan konten berikut:

    Tampilkan file global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      rateLimitService: # Konfigurasi layanan pembatasan laju yang di-deploy di bagian Persiapan.
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: MINUTE
          quota: 1
        match:
          vhost:
            name: bf2.example.com # Nama ini harus sama dengan nama domain di VirtualService.
            port: 80 # Nomor port ini harus sesuai dengan port gerbang ASM.

    Tabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut, lihat Deskripsi bidang ASMGlobalRateLimiter.

    Bidang

    Deskripsi

    workloadSelector

    Workload tempat aturan pembatasan laju berlaku. Dalam contoh ini, pembatasan laju global berlaku pada gerbang masuk ingressgateway. Atur parameter ini menjadi istio: ingressgateway.

    isGateway

    Menentukan apakah aturan berlaku untuk gerbang. Dalam contoh ini, parameter ini diatur ke true.

    rateLimitService

    Nama domain, port, dan pengaturan batas waktu koneksi layanan throttling. Blok kode berikut menunjukkan pengaturan layanan throttling yang dideploy di Persiapan:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Parameter konfigurasi pembatasan laju yang berlaku. unit menentukan satuan waktu untuk deteksi pembatasan laju. quota menentukan jumlah total permintaan yang diizinkan per satuan waktu.

    Dalam contoh ini, unit diatur ke MINUTE dan quota diatur ke 1. Ini berarti hanya satu permintaan yang dapat dikirim per menit pada rute yang cocok. Permintaan berlebih akan dibatasi.

    vhost

    Konfigurasi nama domain dan item rute yang dicocokkan oleh aturan pembatasan laju. Nilai name dan port harus sama dengan nama domain di layanan virtual yang diterapkan pada gerbang dan port gerbang masuk.

  2. Di lingkungan kubeconfig untuk instans ASM, jalankan perintah berikut untuk membuat aturan pembatasan laju global yang berlaku untuk rute productpage-route-name1 pada gerbang.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Jalankan perintah berikut untuk mendapatkan konfigurasi aturan throttling global:

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Tampilkan output yang diharapkan

    apiVersion: istio.alibabacloud.com/v1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 1
          unit: MINUTE
        match:
          vhost:
            name: bf2.example.com
            port: 80
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          istio: ingressgateway
    status:
      config.yaml: |
        descriptors:
        - key: generic_key
          rate_limit:
            requests_per_unit: 1
            unit: MINUTE
          value: RateLimit[global-test.istio-system]-Id[2100900480]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Dari output langkah sebelumnya, salin konten field config.yaml di dalam field status sumber daya ASMGlobalRateLimiter dan tempelkan ke file ratelimit-config.yaml untuk membuat konfigurasi layanan pembatasan laju global.

    Tempelkan isi string dari field config.yaml, yang berada di bawah field status sumber daya ASMGlobalRateLimiter, persis seperti aslinya ke dalam field config.yaml di bagian data ConfigMap.

    Tampilkan file ratelimit-config.yaml

    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-test.istio-system]-Id[2100900480]
        domain: ratelimit.default.svc.cluster.local
  5. Di lingkungan kubeconfig untuk kluster ACK, jalankan perintah berikut untuk memperbarui konfigurasi layanan pembatasan laju global di kluster.

    kubectl apply -f ratelimit-config.yaml
  6. Jalankan perintah berikut untuk mengakses aplikasi Bookinfo dua kali.

    Ganti <IP gerbang ASM> dengan alamat IP gerbang. Untuk informasi selengkapnya tentang cara mendapatkan alamat IP gerbang, lihat Mendapatkan alamat gerbang masuk.

    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v
    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v

    Blok kode berikut menunjukkan output yang diharapkan untuk akses kedua ke aplikasi Bookinfo:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    Konfigurasi pembatasan laju global hanya mengizinkan satu permintaan per menit untuk kombinasi nama domain dan port bf2.example.com:80. Ketika Anda mengakses kombinasi nama domain dan port ini dua kali berturut-turut, permintaan pertama berhasil dan permintaan kedua dibatasi. Hasil ini menunjukkan bahwa aturan pembatasan laju global untuk gerbang masuk telah berhasil dikonfigurasi.

Skenario 3: Konfigurasikan aturan throttling global untuk permintaan yang berisi header spesifik dan parameter kueri pada rute tertentu dalam layanan virtual untuk gateway ingress

Catatan

Dalam skenario ini, versi instance ASM harus 1.19.0 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui instance ASM, lihat Perbarui instance ASM.

Skenario ini menunjukkan cara mengonfigurasi aturan pembatasan laju untuk rute productpage-route-name1, yang terkait dengan kombinasi nama domain dan port bf2.example.com:80. Aturan ini hanya berlaku untuk permintaan yang berisi header permintaan ratelimit: "true" dan parameter kueri ratelimit=enabled. Aturan ini mencocokkan permintaan untuk path seperti /productpage, /static, /login, dan /logout, serta meneruskan permintaan yang cocok ke layanan productpage. Setelah Anda mengonfigurasi aturan pembatasan laju, permintaan yang dikirim ke path-path tersebut akan dikenai pembatasan laju.

  1. Buat file global-ratelimit-gw.yaml dengan konten berikut:

    Tampilkan file global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: istio-ingressgateway
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: SECOND
          quota: 100000
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1  # Nama ini harus sama dengan nama rute di layanan virtual.
        limit_overrides:
        - request_match:
            header_match:
            - name: ratelimit
              exact_match: "true"
            query_match:
            - name: ratelimit
              exact_match: "enabled"
          limit:
            unit: MINUTE
            quota: 1

    Tabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut, lihat Deskripsi bidang ASMGlobalRateLimiter.

    Bidang

    Deskripsi

    workloadSelector

    Workload tempat aturan pembatasan laju berlaku. Dalam contoh ini, pembatasan laju global berlaku pada gerbang masuk ingressgateway. Atur parameter ini menjadi istio: ingressgateway.

    isGateway

    Menentukan apakah aturan berlaku untuk gerbang. Dalam contoh ini, parameter ini diatur ke true.

    rateLimitService

    Nama domain, port, dan pengaturan batas waktu koneksi layanan throttling. Blok kode berikut menunjukkan pengaturan layanan throttling yang dideploy di Persiapan:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Parameter konfigurasi pembatasan laju yang berlaku pada rute layanan virtual. unit menentukan satuan waktu untuk deteksi pembatasan laju. quota menentukan jumlah total permintaan yang diizinkan per satuan waktu. Dalam contoh ini, unit diatur ke SECOND dan quota diatur ke 100000. Ini berarti 100.000 permintaan diizinkan per detik pada rute yang cocok. Pengaturan ini kira-kira setara dengan tidak ada pembatasan laju yang dikonfigurasi. Tujuannya adalah hanya permintaan yang memenuhi kondisi tertentu yang dibatasi, sedangkan permintaan lain tidak perlu memicu pembatasan laju.

    vhost

    Konfigurasi nama domain dan item rute yang dicocokkan oleh aturan pembatasan laju. Nilai name dan port harus sama dengan nama domain di layanan virtual yang diterapkan pada gerbang dan port gerbang masuk. Nama rute yang ditentukan di route.name_match harus sama dengan nama item rute di layanan virtual.

    limit_overrides

    Menentukan apakah ambang batas throttling yang dikonfigurasi akan diganti. Anda dapat menggunakan bidang ini untuk menentukan ambang batas throttling secara individual untuk permintaan tertentu. Dalam contoh ini:

    • Field request_match di limit_overrides diatur untuk mencocokkan secara eksak permintaan yang berisi header permintaan ratelimit: "true" dan memiliki parameter kueri ratelimit=enabled di path permintaan.

    • Di field limit dari limit_overrides, unit diatur ke MINUTE dan quota diatur ke 1. Ini berarti untuk permintaan yang memenuhi kondisi yang ditentukan oleh request_match, hanya satu permintaan yang diizinkan per menit.

  2. Di lingkungan kubeconfig instans ASM, jalankan perintah berikut untuk membuat aturan pembatasan laju global untuk rute productpage-route-name1 pada gerbang.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Jalankan perintah berikut untuk mendapatkan konfigurasi aturan throttling global:

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Tampilkan output yang diharapkan

    apiVersion: istio.alibabacloud.com/v1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 100000
          unit: SECOND
        limit_overrides:
        - limit:
            quota: 1
            unit: MINUTE
          request_match:
            header_match:
            - exact_match: "true"
              name: ratelimit
            query_match:
            - exact_match: enabled
              name: ratelimit
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          app: istio-ingressgateway
    status:
      config.yaml: |
        descriptors:
        - descriptors:
          - descriptors:
            - key: query_match
              rate_limit:
                requests_per_unit: 1
                unit: MINUTE
              value: RateLimit[global-test.istio-system]-Id[1102463266]
            key: header_match
            value: RateLimit[global-test.istio-system]-Id[1102463266]
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Untuk menghasilkan konfigurasi layanan pembatasan laju global, tempelkan konten field config.yaml dari field status sumber daya ASMGlobalRateLimiter (yang ditemukan pada output langkah sebelumnya) ke dalam file `ratelimit-config.yaml`.

    Isi string dari field config.yaml di bawah field status sumber daya ASMGlobalRateLimiter harus ditempelkan persis seperti aslinya ke dalam field config.yaml di bagian data ConfigMap.

    Tampilkan file ratelimit-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ratelimit-config
    data:
      config.yaml: |
        descriptors:
        - descriptors:
          - descriptors:
            - key: query_match
              rate_limit:
                requests_per_unit: 1
                unit: MINUTE
              value: RateLimit[global-test.istio-system]-Id[1102463266]
            key: header_match
            value: RateLimit[global-test.istio-system]-Id[1102463266]
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
  5. Di lingkungan kubeconfig kluster ACK, jalankan perintah berikut untuk memperbarui konfigurasi layanan pembatasan laju global di kluster.

    kubectl apply -f ratelimit-config.yaml
  6. Jalankan perintah berikut untuk mengakses aplikasi Bookinfo dua kali.

    Ganti <IP gerbang ASM> dengan alamat IP aktual gerbang. Untuk informasi selengkapnya tentang cara mendapatkan alamat IP gerbang, lihat Mendapatkan alamat gerbang masuk.

    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v
    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v

    Blok kode berikut menunjukkan output yang diharapkan untuk akses kedua ke aplikasi Bookinfo:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    Konfigurasi pembatasan laju global hanya mengizinkan satu permintaan per menit ke aplikasi Bookinfo untuk permintaan yang berisi header permintaan ratelimit: "true" dan parameter kueri ratelimit=enabled. Ketika Anda mengakses aplikasi Bookinfo dua kali berturut-turut dengan header permintaan dan parameter kueri ini, permintaan pertama berhasil dan permintaan kedua dibatasi. Hal ini menunjukkan bahwa konfigurasi pembatasan laju global untuk gerbang masuk berhasil mencocokkan permintaan tertentu.

  7. Jalankan perintah berikut untuk mengakses aplikasi Bookinfo lagi, tetapi jangan sertakan header permintaan ratelimit: "true" atau parameter kueri ratelimit=enabled dalam permintaan.

    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v

    Output menunjukkan bahwa tidak ada kode status 429 yang ditemukan dan aplikasi Bookinfo berhasil diakses. Ini menunjukkan bahwa permintaan lain pada rute tersebut tidak tunduk pada aturan throttling global.

Skenario 4: Konfigurasikan aturan throttling global untuk alamat IP klien tertentu pada rute tertentu dalam layanan virtual untuk gateway ingress

Catatan
  • Dalam skenario ini, versi instance ASM harus 1.19.0 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui instance ASM, lihat Perbarui instance ASM.

  • Untuk mengonfigurasi throttling untuk alamat IP klien tertentu pada gateway ingress, pastikan bahwa External Traffic Policy dari gateway ingress diatur ke Local. Untuk informasi lebih lanjut tentang cara membuat gateway ingress dan deskripsi parameter gateway ingress, lihat Buat gateway ingress.

  • Anda dapat memperoleh alamat IP klien dari permintaan yang dikirim ke gerbang dari field downstream_remote_address di log akses gerbang. Dalam contoh ini, konfigurasikan alamat IP klien yang ingin Anda batasi sesuai kebutuhan.

Konfigurasikan aturan pembatasan laju untuk rute layanan virtual productpage-route-name1 di bawah kombinasi nama domain dan port bf2.example.com:80. Aturan pembatasan laju hanya berlaku untuk permintaan dari alamat IP klien tertentu, sedangkan permintaan lain pada rute ini tidak terpengaruh.

  1. Buat file global-ratelimit-gw.yaml dengan konten berikut:

    Tampilkan file global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: istio-ingressgateway
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: SECOND
          quota: 100000
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1  # Nama ini harus sama dengan nama rute di layanan virtual.
        limit_overrides:
        - request_match:
            remote_address:
              address: xxx.xxx.xxx.xxx # Alamat IP klien.
              v4_prefix_mask_len: xx # Masker subnet rentang alamat IP klien.
          limit:
            unit: MINUTE
            quota: 1

    Tabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut, lihat Deskripsi bidang ASMGlobalRateLimiter.

    Bidang

    Deskripsi

    workloadSelector

    Workload tempat aturan pembatasan laju berlaku. Dalam contoh ini, pembatasan laju global berlaku pada gerbang masuk ingressgateway. Atur parameter ini menjadi istio: ingressgateway.

    isGateway

    Menentukan apakah aturan berlaku untuk gerbang. Dalam contoh ini, parameter ini diatur ke true.

    rateLimitService

    Nama domain, port, dan pengaturan batas waktu koneksi layanan throttling. Blok kode berikut menunjukkan pengaturan layanan throttling yang dideploy di Persiapan:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Parameter konfigurasi pembatasan laju yang berlaku pada rute layanan virtual. unit menentukan satuan waktu untuk deteksi pembatasan laju. quota menentukan jumlah total permintaan yang diizinkan per satuan waktu.

    Dalam contoh ini, unit diatur ke SECOND dan quota diatur ke 100000. Ini berarti 100.000 permintaan diizinkan per detik pada rute yang cocok. Pengaturan ini kira-kira setara dengan tidak ada pembatasan laju yang dikonfigurasi. Tujuannya adalah hanya permintaan yang memenuhi kondisi tertentu yang dibatasi, sedangkan permintaan lain tidak perlu memicu pembatasan laju.

    vhost

    Konfigurasi nama domain dan item rute yang dicocokkan oleh aturan pembatasan laju. Nilai name dan port harus sama dengan nama domain di layanan virtual yang diterapkan pada gerbang dan port gerbang masuk. Nama rute yang ditentukan di route.name_match harus sama dengan nama item rute di layanan virtual.

    limit_overrides

    Menentukan apakah ambang batas throttling yang dikonfigurasi akan diganti. Anda dapat menggunakan bidang ini untuk menentukan ambang batas throttling secara individual untuk permintaan tertentu. Dalam contoh ini:

    • Di field request_match, remote_address.address digunakan untuk mencocokkan alamat IP sumber permintaan klien, dan remote_addess.v4_prefix_mask_len digunakan untuk mencocokkan masker subnet rentang alamat IP sumber klien (opsional).

    • Di field limit dari field limit_overrides, unit diatur ke MINUTE dan quota diatur ke 1. Ini berarti untuk permintaan yang memenuhi kondisi yang ditentukan oleh request_match, hanya satu permintaan yang diizinkan per menit.

  2. Di lingkungan kubeconfig instans ASM, jalankan perintah berikut untuk membuat aturan pembatasan laju global yang berlaku untuk rute productpage-route-name1 pada gerbang.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Jalankan perintah berikut untuk mendapatkan konfigurasi aturan throttling global:

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml

    Tampilkan output yang diharapkan

    apiVersion: istio.alibabacloud.com/v1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      configs:
      - limit:
          quota: 100000
          unit: SECOND
        limit_overrides:
        - limit:
            quota: 1
            unit: MINUTE
          request_match:
            remote_address:
              address: 106.11.XX.XX
              v4_prefix_mask_len: 24
        match:
          vhost:
            name: bf2.example.com
            port: 80
            route:
              name_match: productpage-route-name1
        name: productpage
      isGateway: true
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      workloadSelector:
        labels:
          app: istio-ingressgateway
    status:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: masked_remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
            value: xxxxxx
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Salin konten field config.yaml dari field status sumber daya ASMGlobalRateLimiter pada output dari langkah sebelumnya. Tempelkan konten ini ke file ratelimit-config.yaml untuk menghasilkan konfigurasi layanan pembatasan laju global.

    Isi string dari field config.yaml di dalam field status sumber daya ASMGlobalRateLimiter harus ditempelkan persis seperti aslinya ke dalam field config.yaml di bagian data ConfigMap.

    Tampilkan file ratelimit-config.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ratelimit-config
    data:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: masked_remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
            value: xxxxxx
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[1102463266]
        domain: ratelimit.default.svc.cluster.local
  5. Di lingkungan kubeconfig kluster ACK, jalankan perintah berikut untuk memperbarui konfigurasi layanan pembatasan laju global di kluster.

    kubectl apply -f ratelimit-config.yaml
  6. Jalankan perintah berikut untuk mengakses aplikasi Bookinfo dua kali.

    Ganti <IP gerbang ASM> dengan alamat IP aktual gerbang Anda. Untuk informasi selengkapnya tentang cara mendapatkan alamat IP gerbang, lihat Mendapatkan alamat gerbang masuk.

    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v
    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v

    Blok kode berikut menunjukkan output yang diharapkan untuk akses kedua ke aplikasi Bookinfo:

    < 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: 48
    < date: Thu, 26 Oct 2023 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    Dalam konfigurasi throttling global, hanya satu permintaan yang diizinkan untuk mengakses aplikasi Bookinfo dalam satu menit. Permintaan harus dikirim dari alamat IP tertentu atau blok CIDR. Ketika Anda menggunakan klien dengan alamat IP tertentu untuk mengakses gateway ingress, permintaan pertama berhasil dan throttling dipicu pada permintaan kedua. Ini menunjukkan bahwa throttling global berlaku pada permintaan yang dikirim dari alamat IP tertentu.

  7. Jalankan perintah berikut untuk mengakses aplikasi Bookinfo lagi menggunakan alamat IP yang berbeda:

    curl -H 'host: bf2.example.com'  http://<IP gerbang ASM>/productpage -v

    Output menunjukkan bahwa tidak ada kode status 429 yang ditemukan dan aplikasi Bookinfo berhasil diakses. Ini menunjukkan bahwa permintaan lain pada rute tersebut tidak tunduk pada aturan throttling global.

Skenario 5: Konfigurasikan aturan pembatasan laju terpisah untuk alamat IP klien yang berbeda pada rute layanan virtual tertentu dari gerbang masuk

Catatan
  1. Skenario ini memerlukan instans ASM versi 1.25.0 atau lebih baru. Untuk informasi selengkapnya tentang cara memutakhirkan instans, lihat Memutakhirkan instans ASM.

  2. Skenario ini mensyaratkan bahwa kebijakan trafik eksternal gerbang masuk ASM diatur ke Local. Untuk informasi selengkapnya tentang pembuatan gerbang masuk dan item konfigurasinya, lihat Membuat gerbang masuk.

  3. Anda dapat memperoleh alamat IP klien dari permintaan yang dikirim ke gerbang dari field downstream_remote_address di log akses gerbang. Dalam contoh ini, konfigurasikan alamat IP klien yang ingin Anda batasi berdasarkan kebutuhan Anda.

Dalam skenario ini, Anda mengonfigurasi aturan pembatasan laju untuk rute layanan virtual productpage-route-name1 di bf2.example.com:80. Aturan tersebut menentukan bahwa setiap alamat IP klien dibatasi secara terpisah, hanya mengizinkan satu permintaan per menit dari setiap alamat IP klien.

  1. Buat file global-ratelimit-gw.yaml.

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: istio-ingressgateway
      rateLimitService:
        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5
      isGateway: true
      configs:
      - name: productpage
        limit:
          unit: SECOND
          quota: 100000
        target_services:
        - name: bookinfo
          namespace: default
          kind: VirtualService
          port: 80
          section_name: productpage-route-name1
        limit_overrides:
        - request_match:
            remote_address:
              distinct: true # Menentukan bahwa alamat IP klien yang berbeda dibatasi secara terpisah.
          limit:
            unit: MINUTE
            quota: 1

    Tabel berikut menjelaskan beberapa field tersebut. Untuk informasi selengkapnya tentang field-field tersebut, lihat Deskripsi CRD ASMGlobalRateLimiter.

    Field

    Deskripsi

    workloadSelector

    Workload tempat aturan pembatasan laju berlaku. Dalam contoh ini, pembatasan laju global berlaku pada gerbang masuk ingressgateway. Atur parameter ini menjadi istio: ingressgateway.

    isGateway

    Menentukan apakah aturan berlaku untuk gerbang. Dalam contoh ini, parameter ini diatur ke true.

    rateLimitService

    Nama domain, port, dan timeout koneksi layanan pembatasan laju. Berdasarkan layanan pembatasan laju yang di-deploy di bagian Persiapan, konfigurasinya sebagai berikut:

        host: ratelimit.default.svc.cluster.local
        port: 8081
        timeout:
          seconds: 5

    limit

    Parameter konfigurasi pembatasan laju yang berlaku pada rute layanan virtual. Dalam parameter ini:

    • unit menentukan satuan waktu untuk deteksi pembatasan laju.

    • quota menentukan jumlah total permintaan yang diizinkan per satuan waktu.

    Dalam contoh ini, unit diatur ke SECOND dan quota diatur ke 100000. Ini berarti 100.000 permintaan diizinkan per detik pada rute yang cocok. Pengaturan ini kira-kira setara dengan tidak ada pembatasan laju yang dikonfigurasi. Tujuannya adalah hanya permintaan yang memenuhi kondisi tertentu yang dibatasi, sedangkan permintaan lain tidak perlu memicu pembatasan laju.

    limit_overrides

    Konfigurasi penggantian ambang batas pembatasan laju. Anda dapat menggunakan field ini untuk menentukan ambang batas pembatasan laju terpisah untuk permintaan tertentu. Dalam contoh ini:

    • Di field request_match:

      • remote_address.address digunakan untuk mencocokkan alamat IP sumber permintaan klien.

      • remote_address.address.distinct diatur ke true untuk mengaktifkan pembatasan laju terpisah untuk alamat IP klien yang berbeda.

      • remote_addess.v4_prefix_mask_len mencocokkan masker subnet rentang alamat IP sumber klien (opsional).

    • Di field limit dari field limit_overrides, unit diatur ke MINUTE dan quota diatur ke 1. Ini berarti untuk permintaan yang memenuhi kondisi yang ditentukan oleh request_match, hanya satu permintaan yang diizinkan per menit.

    target_services

    Konfigurasi rute layanan virtual yang dicocokkan oleh item pembatasan laju. Dalam parameter ini:

    • kind menentukan bahwa aturan pembatasan laju berlaku pada rute layanan virtual.

    • namespace dan name menentukan namespace dan nama layanan virtual.

    • port menentukan bahwa aturan pembatasan laju hanya berlaku pada rute trafik di port 80.

    • section_name menentukan bahwa aturan pembatasan laju berlaku pada item rute bernama productpage-route-name1 di layanan virtual.

  2. Deploy aturan pembatasan laju global.

    kubectl apply -f global-ratelimit-gw.yaml
  3. Dapatkan konfigurasi aturan pembatasan laju global yang telah direkonsiliasi.

    kubectl get asmglobalratelimiter global-test -n istio-system -o yaml |grep status: -A 50

    Output yang diharapkan:

    status:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[537612397]
        domain: ratelimit.default.svc.cluster.local
      message: ok
      status: successful
  4. Perbarui field config.yaml di bagian data ConfigMap dari bagian Persiapan dengan output dari langkah sebelumnya.

    kubectl edit ConfigMap ratelimit-config

    Konten yang diperbarui:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ratelimit-config
    data:
      config.yaml: |
        descriptors:
        - descriptors:
          - key: remote_address
            rate_limit:
              requests_per_unit: 1
              unit: MINUTE
          key: generic_key
          rate_limit:
            requests_per_unit: 100000
            unit: SECOND
          value: RateLimit[global-test.istio-system]-Id[537612397]
        domain: ratelimit.default.svc.cluster.local
  5. Akses aplikasi Bookinfo dua kali berturut-turut dari klien yang berbeda.

    export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -H 'host: bf2.example.com' http://$GATEWAY_URL:80/productpage -v
    curl -H 'host: bf2.example.com' http://$GATEWAY_URL:80/productpage -v

    Output yang diharapkan untuk akses 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: 48
    < date: Thu, 26 Jul 2025 04:10:11 GMT
    < server: istio-envoy
    < content-length: 0
    < 
    * Connection #0 to host 116.62.XXX.XXX left intact

    Permintaan kedua dibatasi, yang menunjukkan bahwa konfigurasi pembatasan laju global untuk gerbang masuk berhasil.

Referensi