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

Alibaba Cloud Service Mesh:イングレスゲートウェイのグローバルスロットリングを設定する

最終更新日:Nov 06, 2025

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

前提条件

  • マネージド Kubernetes クラスターが ASM インスタンスに追加されており、ASM インスタンスのバージョンが 1.18.0.131 以降です。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。

  • Kubernetes クラスターの default 名前空間で自動サイドカーインジェクションが有効になっています。詳細については、「自動インジェクションを有効にする」をご参照ください。

  • ingressgateway という名前のイングレスゲートウェイが作成され、ポート 80 が有効になっています。 詳細については、イングレスゲートウェイの作成をご参照ください。

準備

スロットリングサービスのデプロイ

  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 アプリケーションの bookinfo.yaml ファイルをダウンロードします。

  2. Bookinfo アプリケーションを ASM インスタンスのクラスターにデプロイするには、ACK クラスターの kubeconfig 環境で次のコマンドを実行します。

    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 ルートは、「準備」セクションで作成された booinfo VirtualService の一部です。このルートは、/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:
          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 フィールドの説明」をご参照ください。

    フィールド

    説明

    workloadSelector

    スロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを istio: ingressgateway に設定します。

    isGateway

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

    rateLimitService

    調整サービスのドメイン名、ポート、および接続タイムアウト設定。 次のコードブロックは、準備 でデプロイされた調整サービスの設定を示しています。

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

    limit

    有効になるスロットリング設定パラメーター。unit はスロットリング検出の時間単位を指定します。quota は時間単位あたりに許可されるリクエストの総数を指定します。

    この例では、unitMINUTE に設定され、quota1 に設定されています。これは、一致するルートで 1 分あたり 1 つのリクエストしか送信できないことを示します。超過したリクエストはスロットリングされます。

    vhost

    スロットリングルールが一致するドメイン名とルート項目の設定。nameport の値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。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. 次のコマンドを実行して、Bookinfo アプリケーションに 2 回アクセスします。

    <ASM gateway 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

    次のコードブロックは、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

    グローバル調整設定では、1 分以内に Bookinfo アプリケーションにアクセスできるリクエストは 1 つだけです。 1 分以内に Bookinfo アプリケーションに 2 回アクセスすると、最初の リクエストは成功し、2 回目の リクエストで調整がトリガーされることがわかります。 これは、グローバル調整が特定のイングレスゲートウェイルートで有効になっていることを示します。

シナリオ 2:イングレスゲートウェイの特定のドメイン名と特定のポートに対してグローバル調整ルールを設定する

ドメイン名とポートの組み合わせ 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 フィールドの説明」をご参照ください。

    フィールド

    説明

    workloadSelector

    スロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを istio: ingressgateway に設定します。

    isGateway

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

    rateLimitService

    調整サービスのドメイン名、ポート、および接続タイムアウト設定。準備 でデプロイされた調整サービスの設定を次のコードブロックに示します。

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

    limit

    有効になるスロットリング設定パラメーター。unit はスロットリング検出の時間単位を指定します。quota は時間単位あたりに許可されるリクエストの総数を指定します。

    この例では、unitMINUTE に設定され、quota1 に設定されています。これは、一致するルートで 1 分あたり 1 つのリクエストしか送信できないことを示します。超過したリクエストはスロットリングされます。

    vhost

    スロットリングルールが一致するドメイン名とルート項目の設定。nameport の値は、ゲートウェイに適用される 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/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. 前のステップの出力から、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[2100900480]
        domain: ratelimit.default.svc.cluster.local
  5. ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、クラスター内のグローバルスロットリングサービスの設定を更新します。

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

    <ASM gateway 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

    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

    bf2.example.com:80 ドメイン名とポートの組み合わせでは、グローバルスロットリング設定により 1 分あたり 1 つのリクエストのみが許可されます。このドメイン名とポートの組み合わせに連続して 2 回アクセスすると、最初のリクエストは成功し、2 番目のリクエストはスロットリングされます。この結果は、イングレスゲートウェイのグローバルスロットリングルールが正常に設定されたことを示します。

シナリオ 3: イングレスゲートウェイの仮想サービスの特定ルートで、特定のヘッダーとクエリパラメーターを含むリクエストに対してグローバルスロットリングルールを設定する

説明

このシナリオでは、ASMインスタンスのバージョンが 1.19.0 以降である必要があります。ASMインスタンスのアップグレード方法の詳細については、「ASMインスタンスの更新」をご参照ください。

このシナリオでは、ドメイン名とポートの組み合わせ bf2.example.com:80 に関連付けられた productpage-route-name1 ルートのスロットリングルールを設定する方法を示します。このルールは、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  # この名前は VirtualService のルート名と同じである必要があります。
        limit_overrides:
        - request_match:
            header_match:
            - name: ratelimit
              exact_match: "true"
            query_match:
            - name: ratelimit
              exact_match: "enabled"
          limit:
            unit: MINUTE
            quota: 1

    次の表に、いくつかのフィールドについて説明します。 詳細については、「ASMGlobalRateLimiter フィールドの説明」をご参照ください。

    フィールド

    説明

    workloadSelector

    スロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを istio: ingressgateway に設定します。

    isGateway

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

    rateLimitService

    調整サービスのドメイン名、ポート、および接続タイムアウト設定。準備 にデプロイされた調整サービスの設定を次のコードブロックに示します。

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

    limit

    VirtualService ルートで有効になるスロットリング設定パラメーター。unit はスロットリング検出の時間単位を指定します。quota は時間単位あたりに許可されるリクエストの総数を指定します。この例では、unitSECOND に設定され、quota100000 に設定されています。これは、一致するルートで 1 秒あたり 100,000 件のリクエストが許可されることを示します。この設定は、スロットリングが設定されていない場合とほぼ同じです。指定された条件を満たすリクエストのみがスロットリングされ、他のリクエストはスロットリングをトリガーする必要がないことを意図しています。

    vhost

    スロットリングルールが一致するドメイン名とルート項目の設定。nameport の値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。route.name_match で指定されたルート名は、VirtualService のルート項目の名前と同じである必要があります。

    limit_overrides

    設定済みの調整しきい値をオーバーライドするかどうかを指定します。このフィールドを使用して、特定のリクエストに対して個別に調整しきい値を指定できます。この例では、次のとおりです。

    • limit_overridesrequest_match フィールドは、ratelimit: "true" リクエストヘッダーを含み、リクエストパスに ratelimit=enabled クエリパラメーターを持つリクエストに完全に一致するように設定されています。

    • limit_overrideslimit フィールドでは、unitMINUTE に設定され、quota1 に設定されています。これは、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 リソースの status フィールドの下にある config.yaml フィールドの文字列コンテンツは、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. 次のコマンドを実行して、Bookinfo アプリケーションに 2 回アクセスします。

    <ASM gateway 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

    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 番目のリクエストはスロットリングされます。これは、イングレスゲートウェイのグローバルスロットリング設定が特定のリクエストに正常に一致していることを示します。

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

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

    出力は、429 ステータスコードが見つからず、Bookinfo アプリケーションに正常にアクセスされたことを示します。これは、ルート上の他のリクエストがグローバル調整ルールの対象ではないことを示します。

シナリオ 4:イングレスゲートウェイの仮想サービス内の特定のルートで、特定のクライアント IP アドレスに対してグローバル調整ルールを設定する

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

  • イングレスゲートウェイ上の特定のクライアント IP アドレスに対して調整を設定するには、イングレスゲートウェイの [外部トラフィックポリシー][ローカル] に設定されていることを確認する必要があります。イングレスゲートウェイの作成方法とイングレスゲートウェイパラメーターの説明の詳細については、「イングレスゲートウェイの作成」をご参照ください。

  • ゲートウェイに送信されたリクエストのクライアント IP アドレスは、ゲートウェイのアクセスログの downstream_remote_address フィールドから取得できます。この例では、必要に応じてスロットリングするクライアント IP アドレスを設定します。

ドメイン名とポートの組み合わせ bf2.example.com:80 の下の productpage-route-name1 VirtualService ルートのスロットリングルールを設定します。スロットリングルールは、特定のクライアント 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  # この名前は VirtualService のルート名と同じである必要があります。
        limit_overrides:
        - request_match:
            remote_address:
              address: xxx.xxx.xxx.xxx # クライアントの IP アドレス。
              v4_prefix_mask_len: xx # クライアント IP アドレス範囲のサブネットマスク。
          limit:
            unit: MINUTE
            quota: 1

    次の表に、いくつかのフィールドについて説明します。詳細については、「ASMGlobalRateLimiter フィールドの説明」をご参照ください。

    フィールド

    説明

    workloadSelector

    スロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを istio: ingressgateway に設定します。

    isGateway

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

    rateLimitService

    調整サービスのドメイン名、ポート、および接続タイムアウト設定。準備 にデプロイされた調整サービスの設定を次のコードブロックに示します。

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

    limit

    VirtualService ルートで有効になるスロットリング設定パラメーター。unit はスロットリング検出の時間単位を指定します。quota は時間単位あたりに許可されるリクエストの総数を指定します。

    この例では、unitSECOND に設定され、quota100000 に設定されています。これは、一致するルートで 1 秒あたり 100,000 件のリクエストが許可されることを示します。この設定は、スロットリングが設定されていない場合とほぼ同じです。指定された条件を満たすリクエストのみがスロットリングされ、他のリクエストはスロットリングをトリガーする必要がないことを意図しています。

    vhost

    スロットリングルールが一致するドメイン名とルート項目の設定。nameport の値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。route.name_match で指定されたルート名は、VirtualService のルート項目の名前と同じである必要があります。

    limit_overrides

    設定済みの調整しきい値をオーバーライドするかどうかを指定します。このフィールドを使用して、特定のリクエストに対して個別に調整しきい値を指定できます。この例では、次のとおりです。

    • request_match フィールドでは、remote_address.address を使用してクライアントリクエストのソース IP アドレスに一致させ、remote_addess.v4_prefix_mask_len を使用してクライアントのソース IP アドレス範囲のサブネットマスクに一致させます (オプション)。

    • limit_overrides フィールドの limit フィールドでは、unitMINUTE に設定され、quota1 に設定されています。これは、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. 次のコマンドを実行して、Bookinfo アプリケーションに 2 回アクセスします。

    <ASM gateway 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

    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

    グローバル調整設定では、1 分以内に Bookinfo アプリケーションにアクセスできるリクエストは 1 つだけです。リクエストは、特定の IP アドレスまたは CIDR ブロックから送信する必要があります。特定の IP アドレスを使用するクライアントを使用してイングレスゲートウェイにアクセスすると、最初のリクエストは成功し、2 番目のリクエストで調整がトリガーされます。これは、特定の IP アドレスから送信されたリクエストに対してグローバル調整が有効になっていることを示します。

  7. 別の IP アドレスを使用して Bookinfo アプリケーションに再度アクセスするには、次のコマンドを実行します。

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

    出力は、429 ステータスコードが見つからず、Bookinfo アプリケーションに正常にアクセスできたことを示しています。これは、ルート上の他のリクエストがグローバル調整ルールの対象ではないことを示します。

シナリオ 5: イングレスゲートウェイの特定の VirtualService ルートで、異なるクライアント IP アドレスに対して個別のスロットリングルールを設定する

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

  2. このシナリオでは、ASM イングレスゲートウェイの外部トラフィックポリシーを Local に設定する必要があります。イングレスゲートウェイの作成とその設定項目の詳細については、「イングレスゲートウェイを作成する」をご参照ください。

  3. ゲートウェイに送信されたリクエストのクライアント IP アドレスは、ゲートウェイのアクセスログの downstream_remote_address フィールドから取得できます。この例では、要件に基づいてスロットリングするクライアント IP アドレスを設定します。

このシナリオでは、bf2.example.com:80 の productpage-route-name1 VirtualService ルートのスロットリングルールを設定します。このルールは、各クライアント IP アドレスが個別にスロットリングされ、各クライアント 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

    スロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを istio: ingressgateway に設定します。

    isGateway

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

    rateLimitService

    スロットリングサービスのドメイン名、ポート、および接続タイムアウト。「準備」セクションでデプロイされたスロットリングサービスに基づいて、設定は次のようになります。

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

    limit

    VirtualService ルートで有効になるスロットリング設定パラメーター。このパラメーターでは:

    • unit はスロットリング検出の時間単位を指定します。

    • quota は時間単位あたりに許可されるリクエストの総数を指定します。

    この例では、unitSECOND に設定され、quota100000 に設定されています。これは、一致するルートで 1 秒あたり 100,000 件のリクエストが許可されることを示します。この設定は、スロットリングが設定されていない場合とほぼ同じです。指定された条件を満たすリクエストのみがスロットリングされ、他のリクエストはスロットリングをトリガーする必要がないことを意図しています。

    limit_overrides

    スロットリングのしきい値のオーバーライド設定。このフィールドを使用して、特定のリクエストに対して個別のスロットリングのしきい値を指定できます。この例では:

    • request_match フィールドでは:

      • remote_address.address は、クライアントリクエストのソース IP アドレスに一致させるために使用されます。

      • remote_address.address.disincttrue に設定され、異なるクライアント IP アドレスに対して個別のスロットリングを有効にします。

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

    • limit_overrides フィールドの limit フィールドでは、unitMINUTE に設定され、quota1 に設定されています。これは、request_match で指定された条件を満たすリクエストに対して、1 分あたり 1 つのリクエストのみが許可されることを示します。

    target_services

    スロットリング項目が一致する VirtualService ルート設定。このパラメーターでは:

    • kind は、スロットリングルールが VirtualService ルートで有効になることを指定します。

    • namespacename は、VirtualService の名前空間と名前を指定します。

    • port は、スロットリングルールがポート 80 のトラフィックルートにのみ有効になることを指定します。

    • section_name は、スロットリングルールが VirtualService の 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. 前のステップの出力を使用して、「準備」セクションの ConfigMap の data セクションにある 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. 異なるクライアントから連続して 2 回 Bookinfo アプリケーションにアクセスします。

    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 番目のリクエストはスロットリングされます。これは、イングレスゲートウェイのグローバルスロットリング設定が成功したことを示します。

参考資料