すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:イングレスゲートウェイのグローバルレート制限の設定

最終更新日:Sep 11, 2026

トラフィックバースト、サービスの過負荷、リソースの枯渇、または悪意のある攻撃に対処するには、特定のゲートウェイルートでグローバルスロットリングを設定します。これにより、精密なトラフィックコントロールによってバックエンドサービスを保護し、コストを削減し、ユーザーエクスペリエンスを向上させることができます。

前提条件

事前準備

レート制限サービスのデプロイ

  1. 次の内容で ratelimit-svc.yaml という名前のファイルを作成します。

    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:
            # 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. ACK クラスターの kubeconfig 環境で、次のコマンドを実行してレート制限サービスと必要な Redis サービスを作成します。

    kubectl を使用してクラスターに接続する方法については、「クラスターの kubeconfig の取得と kubectl を使用したクラスターへの接続」をご参照ください。

    kubectl apply -f ratelimit-svc.yaml

Bookinfo サンプルアプリケーションのデプロイ

  1. GitHub 上の Istio プロジェクトリポジトリから、Bookinfo アプリケーション用の YAML マニフェスト (bookinfo.yaml) をダウンロードします。

  2. ACK クラスターの kubeconfig 環境で、次のコマンドを実行して Bookinfo アプリケーションを ASM インスタンスに関連付けられたクラスターにデプロイします。

    kubectl apply -f bookinfo.yaml
  3. 次の内容で bookinfo-gateway.yaml を作成します。

    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. ASM インスタンスの kubeconfig 環境で、次のコマンドを実行してイングレスゲートウェイに Bookinfo アプリケーションのルートルールを作成します。

    ルート ルールは productpage-route-name1 と名付けられ、bf2.example.com ドメインへのリクエストに一致します。kubectl を使用して ASM インスタンスに接続する方法については、「コントロールプレーン kubectl を使用して Istio リソースにアクセスする」をご参照ください。

    kubectl apply -f bookinfo-gateway.yaml

シナリオ 1:ゲートウェイ ルートに対するグローバル レート制限の設定

このシナリオでは、ドメイン名とポートの組み合わせである bf2.example.com:80 に適用される、ルート productpage-route-name1 のレート制限ルールを設定する方法を説明します。productpage-route-name1 は、「始める前に」で作成した bookinfo VirtualService 内のルートエントリです。このルートは、/productpage、/static、/login、/logout などのパスへのリクエストに一致し、それらを productpage Service に転送します。ルールを設定した後、指定されたレート制限がこれらのパスへのすべてのリクエストに適用されます。

  1. 次の内容の global-ratelimit-gw.yaml という名前のファイルを作成します。

    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: MINUTE
          quota: 1
        match:
          vhost:
            name: bf2.example.com # この名前は VirtualService のドメイン名と一致する必要があります。
            port: 80 # このポートは ASM ゲートウェイのポートと一致する必要があります。
            route:
              name_match: productpage-route-name1  # この名前は VirtualService のルート名と一致する必要があります。

    次の表で主要なフィールドについて説明します。詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。

    パラメーター

    説明

    workloadSelector

    レート制限の対象となるワークロードを選択します。この例では、グローバル レート制限はラベル app: istio-ingressgateway によって選択されたイングレスゲートウェイのワークロードに適用されます。

    isGateway

    ルールがゲートウェイに適用されるかどうかを指定します。この例では true に設定します。

    rateLimitService

    レート制限サービスのドメイン名、ポート、およびコネクションタイムアウトを指定します。「始める前に」でデプロイされたサービスに基づき、設定は次のようになります。

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

    limit

    レート制限のパラメーターです。unit は時間間隔を指定し、quota は間隔ごとに許可されるリクエストの数を指定します。

    この例では、unit は MINUTE に、quota は 1 に設定されています。これにより、一致したルートに対して 1 分間に 1 回のリクエストのみが許可されます。後続のリクエストはシステムによって拒否されます。

    vhost

    ドメイン名とルートの一致条件です。name は VirtualService のドメイン名と一致する必要があり、port はイングレスゲートウェイのポートと一致する必要があります。route.name_match で指定するルート名は、VirtualService のルートエントリの名前と一致する必要があります。

  2. ASM インスタンスの kubeconfig 環境で、次のコマンドを実行して、ゲートウェイ上の productpage-route-name1 ルートに対するグローバル レート制限ルールを作成します。

    kubectl apply -f global-ratelimit-gw.yaml
  3. 次のコマンドを実行して、調整済みのグローバル レート制限ルールの設定を取得します。

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

    期待される出力

    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. 前の手順で出力された ASMGlobalRateLimiter リソースの status フィールドから config.yaml の内容を ratelimit-config.yaml に貼り付け、グローバル レート制限サービスの設定を生成します。

    ASMGlobalRateLimiter の status フィールド配下にある config.yaml フィールドの内容は、ConfigMap の data フィールド内の config.yaml フィールドにそのまま貼り付ける必要があります。

    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. ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、新しい設定をグローバル レート制限サービスに適用します。

    kubectl apply -f ratelimit-config.yaml
  6. 次のコマンドを 2 回連続で実行して、bookinfo アプリケーションにアクセスします。

    <ASM_GATEWAY_IP> をお使いの ASM ゲートウェイの IP アドレスに置き換えてください。ゲートウェイの IP アドレスを取得する方法については、「イングレスゲートウェイの IP アドレスの取得」をご参照ください。

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

    2 回目のリクエストで期待される出力は次のとおりです。

    < 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

    グローバル レート制限は、1 分間に 1 回のリクエストのみを許可するように設定されています。2 回連続でリクエストを送信すると、1 回目は成功しますが、2 回目はゲートウェイによってステータスコード 429 Too Many Requests で拒否されます。これにより、ルートに対するグローバル レート制限が有効であることが確認できます。

シナリオ 2:Ingress ゲートウェイでのグローバルレート制限

このシナリオでは、bf2.example.com:80 のドメインとポートの組み合わせに対してグローバルレート制限ルールを設定する方法を示します。このルールを適用すると、このドメインとポートの組み合わせに送信されるすべてのリクエストに対して、指定されたレート制限が適用されます。

  1. 次の内容で、global-ratelimit-gw.yaml という名前のファイルを作成します。

    Global-ratelimit-gw.yaml

    apiVersion: istio.alibabacloud.com/v1beta1
    kind: ASMGlobalRateLimiter
    metadata:
      name: global-test
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      rateLimitService: # 準備ステップでデプロイしたレート制限サービスの設定。
        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 # この名前は VirtualService のドメインと一致する必要があります。
            port: 80 # このポートは ASM ゲートウェイのポートと一致する必要があります。

    次の表で、主要なフィールドについて説明します。詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。

    パラメーター

    説明

    workloadSelector

    レート制限ルールの対象となるワークロードを指定します。この例では、label istio: ingressgateway で識別される Ingress ゲートウェイのワークロードを対象とします。

    isGateway

    ルールがゲートウェイに適用されるかどうかを指定します。この例では true に設定します。

    rateLimitService

    レート制限サービスのドメイン、ポート、および接続タイムアウトを指定します。準備ステップでデプロイしたサービスに基づき、設定は次のようになります:

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

    limit

    レート制限を定義します。unit フィールドは時間間隔を指定し、quota フィールドは間隔ごとに許可されるリクエストの数を指定します。

    この例では、unit を MINUTE に、quota を 1 に設定しています。この設定により、一致したルートに対して 1 分あたり 1 つのリクエストのみが許可されます。その 1 分以内の後続のリクエストは拒否されます。

    vhost

    一致するドメインとルートを指定します。name と port は、それぞれ VirtualService のドメインと Ingress ゲートウェイのポートと一致する必要があります。

  2. ASM インスタンスの kubeconfig 環境で、ゲートウェイ上の productpage ルートにグローバルレート制限ルールを適用するには、次のコマンドを実行します。

    kubectl apply -f global-ratelimit-gw.yaml
  3. 次のコマンドを実行して、調整されたグローバルレート制限ルールの設定を取得します。

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

    想定される出力

    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. 前の出力の status フィールドから config.yaml キーの内容をコピーし、ratelimit-config.yaml という名前のファイルに貼り付けて、グローバルレート制限サービスを設定します。

    ASMGlobalRateLimiter の status フィールド内の config.yaml フィールドの文字列内容を、ConfigMap の data フィールド内の同名の config.yaml フィールドにそのまま貼り付ける必要があります。

    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. ACK クラスターの kubeconfig 環境で、次のコマンドを実行してグローバルレート制限サービスの設定を更新します。

    kubectl apply -f ratelimit-config.yaml
  6. 次のコマンドを連続して 2 回実行し、Bookinfo アプリケーションにアクセスします。

    <ASM_GATEWAY_IP> を、お使いの ASM ゲートウェイの IP アドレスに置き換えます。 詳細については、「イングレスゲートウェイの IP アドレスを取得する」をご参照ください。

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

    2 回目のリクエストの想定出力は、次のとおりです:

    < 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

    グローバルレート制限ルールは、bf2.example.com:80 のドメインとポートの組み合わせへのアクセスを 1 分あたり 1 リクエストに制限します。連続して 2 つのリクエストを送信すると、最初の 1 つは成功しますが、2 つ目は拒否されます。これにより、イングレスゲートウェイ上のレート制限ルールが正しく機能していることを確認できます。

ユースケース 3:ゲートウェイルートでの条件付きレート制限

説明

このユースケースには、バージョン 1.19.0 以降の ASM インスタンスが必要です。更新手順については、「ASM インスタンスの更新」をご参照ください。

productpage-route-name1 ドメインおよびポート上の bf2.example.com:80 ルートに、レート制限ルールを設定します。 このルールは、ratelimit: "true" リクエストヘッダーと ratelimit=enabled クエリパラメーターを含むリクエストにのみ適用されます。 このルート上のその他のリクエストは、レート制限ルールの影響を受けません。 このルートは、/productpage、/static、/login、および /logout などのパスへのリクエストに一致し、一致したリクエストを productpage サービスに転送します。 レート制限ルールが設定されると、これらのパスに送信され、指定された条件を満たすリクエストはレート制限されます。

  1. 次の内容で global-ratelimit-gw.yaml という名前のファイルを作成します。

    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  # この名前は仮想サービスのルート名と一致する必要があります。
        limit_overrides:
        - request_match:
            header_match:
            - name: ratelimit
              exact_match: "true"
            query_match:
            - name: ratelimit
              exact_match: "enabled"
          limit:
            unit: MINUTE
            quota: 1

    次の表に、主要なフィールドを示します。詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。

    パラメーター

    説明

    workloadSelector

    レート制限の対象となるワークロードを指定します。この例では、グローバルレート制限は Ingress ゲートウェイに適用され、istio: ingressgateway に設定されています。

    isGateway

    ゲートウェイに適用されるかどうかを指定します。この例では、true に設定されています。

    rateLimitService

    レート制限サービスのドメイン名、ポート、および接続タイムアウトを指定します。準備の手順でデプロイされたサービスに基づき、設定は次のようになります。

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

    limit

    仮想サービスルートの基本的なレート制限パラメーターを定義します。unit フィールドは時間間隔を指定し、quota は間隔あたりに許可されるリクエスト数を指定します。この例では unit を SECOND に、quota を 100000 に設定し、1 秒あたり 100,000 リクエストを許可します。この高い制限値は、より具体的なオーバーライドに一致しないリクエストに対するレート制限を事実上無効にし、それらがレート制限されないことを保証します。

    vhost

    ドメインとルートの一致条件を指定します。name および port フィールドは、それぞれ仮想サービスのドメインとイングレスゲートウェイポートに一致する必要があります。route.name_match のルート名は、仮想サービスのルート名と一致する必要があります。

    limit_overrides

    デフォルトのレート制限を上書きします。このフィールドを使用して、特定のリクエストに対してより具体的なレート制限を適用します。この例では:

    • limit_overrides では、request_match フィールドは、ratelimit: "true" リクエストヘッダーと ratelimit=enabled クエリパラメーターの両方を含むリクエストに一致します。

    • limit_overrides の limit フィールドで、unit を MINUTE に、quota を 1 に設定すると、request_match で指定された条件に一致するリクエストは 1 分あたり 1 回に制限されます。

  2. 対応する ASM インスタンスの kubeconfig 環境で、次のコマンドを実行して、ゲートウェイ上の productpage-route-name1 ルートにグローバルなレート制限ルールを作成します。

    kubectl apply -f global-ratelimit-gw.yaml
  3. 次のコマンドを実行して、グローバルレート制限ルールの調整済み設定を取得します。

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

    期待される出力

    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. 前の手順の期待される出力にある、ASMGlobalRateLimiter リソースの status フィールドから config.yaml の内容を ratelimit-config.yaml ファイルに貼り付けて、グローバルレート制限サービス設定を生成します。

    ASMGlobalRateLimiter の config.yaml フィールド配下にある status フィールドの文字列の内容は、ConfigMap の data フィールド配下にある同名の config.yaml フィールドにそのまま貼り付ける必要があります。

    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. ACK クラスターの kubeconfig 環境から、次のコマンドを実行して、クラスター内のグローバルレート制限サービスの設定を更新します。

    kubectl apply -f ratelimit-config.yaml
  6. 次のコマンドを 2 回連続で実行して、Bookinfo アプリケーションにアクセスします。

    <ASM_GATEWAY_IP> をお使いのゲートウェイ IP に置き換えてください。 ゲートウェイ IP を取得する方法については、「イングレスゲートウェイの IP アドレスを取得する」をご参照ください。

    curl -H 'host: bf2.example.com' -H 'ratelimit: "true"' 'http://<ASM_GATEWAY_IP>/productpage?ratelimit=enabled' -v
    curl -H 'host: bf2.example.com' -H 'ratelimit: "true"' 'http://<ASM_GATEWAY_IP>/productpage?ratelimit=enabled' -v

    Bookinfo アプリケーションへの 2 回目のリクエストで期待される出力は次のとおりです。

    < 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

    グローバルレート制限設定では、ratelimit: "true" リクエストヘッダーと ratelimit=enabled クエリパラメーターを含む bookinfo アプリケーションへのリクエストは、1 分あたり 1 回に制限されます。このヘッダーとクエリパラメーターを使用して bookinfo アプリケーションに 2 回連続でリクエストを送信すると、最初のリクエストは成功し、2 番目のリクエストはレート制限されます。これは、ingress ゲートウェイで特定のリクエストを照合するためのグローバルレート制限設定が成功したことを示します。

  7. 次のコマンドを実行して、ratelimit: "true" リクエストヘッダーまたは ratelimit=enabled クエリパラメーターを含めずに、bookinfo アプリケーションに再度アクセスします。

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

    出力は、Bookinfo アプリケーションが正常にアクセスされ、429 ステータスコードが返されないことを示しています。これにより、レート制限ルールがルート上の他のリクエストに影響を与えないことが確認されます。

シナリオ 4:仮想サービスルートに対する IP ベースのスロットリングの設定

説明
  • このシナリオには、バージョン 1.19.0 以降の ASM インスタンスが必要です。アップグレード手順については、「ASM インスタンスの更新」をご参照ください。

  • ASM イングレスゲートウェイで特定のクライアント IP アドレスにスロットリングを設定するには、まずイングレスゲートウェイの 外部トラフィックポリシー が [Local] に設定されていることを確認する必要があります。イングレスゲートウェイの作成方法とその設定オプションについては、「イングレスゲートウェイの作成」をご参照ください。

  • ゲートウェイへのリクエストのクライアント IP アドレスは、ゲートウェイのアクセスログの downstream_remote_address フィールドで確認できます。この例では、スロットリング対象のクライアント IP アドレスを使用してルールを設定します。

このシナリオでは、ドメインとポートの組み合わせ bf2.example.com:80 に関連付けられた productpage-route-name1 仮想サービスルートのスロットリングルールを設定する方法を示します。このルールは、特定のクライアント IP アドレスからのリクエストにのみ適用され、同じルート上の他のリクエストには影響しません。

  1. 次の内容で global-ratelimit-gw.yaml という名前のファイルを作成します。

    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  # この名前は、仮想サービスのルート名と一致している必要があります。
        limit_overrides:
        - request_match:
            remote_address:
              address: xxx.xxx.xxx.xxx # クライアントの IP アドレス。
              v4_prefix_mask_len: xx # クライアント IP アドレス範囲のサブネットマスク。
          limit:
            unit: MINUTE
            quota: 1

    次の表に、主要なフィールドを示します。これらのフィールドの詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。

    パラメーター

    説明

    workloadSelector

    スロットリングを適用するワークロードを選択します。この例では、label app: istio-ingressgateway で選択されるイングレスゲートウェイのワークロードにグローバルスロットリングを適用します。

    isGateway

    ルールがゲートウェイに適用されるかどうかを指定します。この例では、true に設定されています。

    rateLimitService

    スロットリングサービスのドメイン、ポート、および接続タイムアウトです。前提条件でデプロイされたスロットリングサービスに基づき、設定は次のようになります。

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

    limit

    仮想サービスルートの基本的なスロットリングパラメーターです。unit は時間間隔を、quota はその間隔で許可されるリクエストのクォータを指定します。

    この例では、unit を SECOND に、quota を 100000 に設定しており、これにより 1 秒あたり 100,000 リクエストが許可されます。この高い制限により、特定の上書き条件に一致しないリクエストのスロットリングが事実上無効になります。

    vhost

    ドメインとルートの一致条件です。name と port は、それぞれ仮想サービスのドメインとイングレスゲートウェイのポートに一致する必要があります。route.name_match で指定されたルート名は、仮想サービスのルート名と一致する必要があります。

    limit_overrides

    特定のリクエストについて、より具体的なスロットリングのしきい値を定義します。この例では、次のとおりです。

    • request_match フィールドは、remote_address.address を使用してクライアントの送信元 IP アドレスに基づいてリクエストを照合します。remote_address.v4_prefix_mask_len フィールドでサブネットマスク長を定義することにより、IP アドレス範囲を任意で指定することもできます。

    • limit_overrides フィールドでは、limit フィールドの unit が MINUTE、quota が 1 に設定されているため、request_match で指定された条件に一致するリクエストは、1 分あたり 1 つのみ許可されます。

  2. ASM インスタンスの kubeconfig を使用して、次のコマンドを実行し、イングレスゲートウェイ上の productpage-route-name1 ルートに対するグローバルスロットリングルールを作成します。

    kubectl apply -f global-ratelimit-gw.yaml
  3. 次のコマンドを実行して、グローバルスロットリングルールの調整済み設定を取得します。

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

    期待される出力

    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. 前の手順の ASMGlobalRateLimiter リソース出力の status フィールドから config.yaml の内容をコピーし、ratelimit-config.yaml に貼り付けて、グローバルスロットリングサービスを設定します。

    ASMGlobalRateLimiter リソースの status フィールド内にある config.yaml フィールドの文字列を、ConfigMap の data フィールド内にある config.yaml フィールドにそのまま貼り付ける必要があります。

    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. ACK クラスターの kubeconfig を使用して、次のコマンドを実行し、グローバルスロットリングサービスの設定を更新します。

    kubectl apply -f ratelimit-config.yaml
  6. 指定した IP アドレスを持つクライアントから、次のコマンドを2回連続で実行して bookinfo アプリケーションにアクセスします。

    <ASM_GATEWAY_IP> を実際のゲートウェイ IP アドレスに置き換えてください。ゲートウェイ IP アドレスの取得方法については、「イングレスゲートウェイのIP アドレスの取得」をご参照ください。

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

    2回目のリクエストで期待される出力は次のとおりです。

    < 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

    グローバルスロットリング設定は、指定した IP アドレス (または範囲) からのリクエストを1分あたり1リクエストに制限します。その IP アドレスを持つクライアントから2回連続でリクエストを送信すると、1回目は成功しますが、2回目はスロットリングされます。これにより、イングレスゲートウェイのグローバルスロットリングルールが期待どおりに機能していることが確認されます。

  7. 別の IP アドレスを持つクライアントから、次のコマンドを実行して bookinfo アプリケーションに再度アクセスします。

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

    リクエストは成功し、HTTP 429 ステータスコードは返されません。これは、ルート上の他のリクエストがグローバルスロットリングルールの影響を受けないことを示します。

シナリオ 5:ルートにおけるクライアント IP ごとのレート制限の設定

説明
  1. このシナリオでは、バージョン 1.25.0 以降の ASM インスタンスが必要です。アップグレード手順については、「ASM インスタンスのアップグレード」をご参照ください。

  2. このシナリオでは、ASM ingress gateway の外部トラフィックポリシーを Local に設定する必要があります。 これにより、元のクライアント IP アドレスが保持されます。 ingress gateway の作成方法およびその設定オプションの詳細については、「ingress gateway を作成する」をご参照ください。

  3. ゲートウェイへのリクエストのクライアント IP アドレスは、アクセスログの downstream_remote_address フィールドで確認できます。 この例では、レート制限ルールは実際のクライアント IP アドレスに基づいて設定されています。

このシナリオでは、bf2.example.com:80 にある productpage-route-name1 仮想サービスルートにレート制限ルールを設定して、一意の各クライアント IP アドレスを 1 分あたり 1 リクエストにレート制限します。

  1. 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 # 各クライアント IP アドレスに個別にレート制限を適用します。
          limit:
            unit: MINUTE
            quota: 1

    次の表に、主要なフィールドを示します。フィールドの詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。

    パラメーター

    説明

    workloadSelector

    レート制限ルールを適用するワークロードを選択します。この例では、ラベル app: istio-ingressgateway によって選択された Ingress ゲートウェイに、グローバルレート制限が適用されます。

    isGateway

    ルールがゲートウェイに適用されるかどうかを指定します。この例では、true に設定されています。

    rateLimitService

    レート制限サービスのドメイン、ポート、および接続タイムアウトの設定です。「前提条件」セクションでデプロイされたレート制限サービスに基づき、設定は次のようになります:

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

    limit

    仮想サービスルートに適用されるレート制限パラメーターです。次のフィールドが含まれます:

    • unit: レート制限チェックの時間間隔。

    • quota: 時間間隔ごとに許可されるリクエスト数。

    この例では、unit を SECOND に、quota を 100000 という高い制限値に設定することで、特定のオーバーライドが適用されないリクエストのレート制限を事実上無効にし、他のトラフィックに影響が及ばないようにします。

    limit_overrides

    特定のリクエストに対するデフォルトのレート制限をオーバーライドします。この例では:

    • request_match フィールドは、オーバーライドの条件を指定します:

      • remote_address フィールドは、クライアント IP アドレスに基づいてリクエストを照合します。

      • distinct パラメーターを true に設定すると、この制限が各クライアントに個別に適用されます。

      • remote_addess.v4_prefix_mask_len は、クライアントの送信元 IP アドレス範囲のサブネットマスクに一致します (オプション)。

    • limit_overrides 内の limit フィールドは、unit を MINUTE に、quota を 1 に設定します。これにより、request_match の条件に一致するリクエストが 1 分あたり 1 回に制限されます。

    target_services

    レート制限ルールが適用される仮想サービスルートを指定します。

    • kind は、ルールが仮想サービスを対象とすることを指定します。

    • namespace と name は、仮想サービスの名前空間と名前を指定します。

    • port は、ルールをポート 80 上のトラフィックに制限します。

    • section_name は、ルールが仮想サービス内の productpage-route-name1 という名前のルートに適用されることを指定します。

  2. グローバルレート制限ルールを適用します。

    kubectl apply -f global-ratelimit-gw.yaml
  3. グローバルレート制限ルールの調整後の設定を表示します。

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

    期待される出力:

    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. 「前提条件」セクションの ratelimit-config ConfigMap を編集し、config.yaml キーの値を前の手順のステータス出力に置き換えます。

    kubectl edit ConfigMap ratelimit-config

    更新後の内容:

    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. クライアントから、bookinfo アプリケーションに 2 回連続でアクセスします。

    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

    2 番目のリクエストで期待される出力:

    < 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

    この出力は、2 番目のリクエストがレート制限されたことを示しており、Ingress ゲートウェイのグローバルレート制限ルールが正しく設定されていることがわかります。

関連ドキュメント