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

Alibaba Cloud Service Mesh:イングレスゲートウェイでのローカルスロットリングの設定

最終更新日:Jan 14, 2025

フラッシュセールなどのシナリオでは、トラフィックが瞬時にピークに達し、システムがサポートする最大負荷を超える可能性があります。その結果、多数の呼び出しが処理待ちになり、システムが応答しなくなります。サービスメッシュ(ASM)は、イングレスゲートウェイを使用してトラフィックを調整するために使用できるローカルスロットリング機能を提供します。このようにして、システムが過負荷になるのを防ぐことができます。このトピックでは、イングレスゲートウェイでローカルスロットリング機能を設定する方法について説明します。

前提条件

  • ASMインスタンスが作成されています。ASMインスタンスは、次の要件を満たしています。

    • ASMインスタンスがEnterprise EditionまたはUltimate Editionの場合、ASMインスタンスのバージョンは v1.11.5.30 以降である必要があります。バージョンが v1.11.5.30 より前の場合は、ASMインスタンスを更新します。詳細については、ASMインスタンスの更新をご参照ください。

    • ASMインスタンスがStandard Editionの場合、ASMインスタンスのバージョンは v1.9 以降である必要があります。さらに、Istioのネイティブレート制限機能のみを使用して、ASMインスタンスのローカルスロットリングを実装できます。参照ドキュメントは、Istioのバージョンによって異なります。最新のIstioバージョンでローカルスロットリングを設定する方法の詳細については、Envoyを使用したレート制限の有効化をご参照ください。

  • クラスターがASMインスタンスに追加されています。詳細については、ASMインスタンスへのクラスターの追加をご参照ください。

  • イングレスゲートウェイがデプロイされています。詳細については、イングレスゲートウェイの作成をご参照ください。

  • BookinfoサービスとNGINXサービスが作成されています。このトピックでは、Bookinfoサービスはdefault名前空間にデプロイされ、NGINXサービスはfoo名前空間にデプロイされます。 Bookinfoサービスの作成方法の詳細については、ASMインスタンスへのアプリケーションのデプロイをご参照ください。

    展開してNGINXサービスの作成方法を表示

    1. 次の内容を含むnginx.yamlファイルを作成します。

      apiVersion: apps/v1 # 1.9.0より前のバージョンではapps/v1beta2を使用します
      kind: Deployment
      metadata:
        name: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
              sidecarset-injected: "true"
          spec:
            containers:
            - name: nginx
              image: nginx:1.14.2
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
      spec:
        ports:
          - name: http
            port: 80
            protocol: TCP
            targetPort: 80
        selector:
          app: nginx
        type: ClusterIP
    2. 次のコマンドを実行して、foo名前空間にNGINXサービスをデプロイします。

      kubectl apply -f nginx.yaml -n foo 
  • Istioゲートウェイと仮想サービスが作成されています。詳細については、Istioゲートウェイの管理および仮想サービスの管理をご参照ください。

    展開してゲートウェイの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

    展開して仮想サービスのYAMLコードを表示

    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
      - match:
        - uri:
            prefix: /nginx
        name: nginx-route-name1
        rewrite:
          uri: /
        route:
        - destination:
            host: nginx.foo.svc.cluster.local
            port:
              number: 80
  • トラフィック生成ツール hey がインストールされています。詳細については、GitHubの hey をご覧ください。

スコープ

ASMのローカルスロットリング機能は、イングレスゲートウェイと、サイドカープロキシが挿入されたサービスに適用できます。

サンプルシナリオの説明

サンプルシナリオでは、BookinfoサービスとNGINXサービスを使用して、イングレスゲートウェイとサービスのトラフィックを調整する方法について説明します。NGINXサービスは、スロットリングが有効になるスコープを確認するために、foo名前空間に個別にデプロイされます。场景示例

シナリオ 1:仮想サービスのルートにスロットリングルールを設定する

ドメインとポートの組み合わせbf2.example.com:80のproductpage-route-name1ルートにスロットリングルールを設定します。 productpage-route-name1は、前提条件セクションで説明されているBookinfoサービス用に作成された仮想サービスのルートです。 productpage-route-name1ルートは、リクエストが次のパスのいずれかを宛先とする場合に一致します。/productpage/static/login、および/logout。 リクエストはproductpageサービスに転送されます。スロットリングルールを設定すると、上記のパス宛てのリクエストはトラフィックレート制限の対象となります。

  1. ローカルスロットリングルールを作成します。

    1. ASMコンソールにログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、[トラフィック管理センター] > [レート制限] を選択します。表示されるページで、[作成] をクリックします。

    3. [作成] ページで、ビジネス要件に基づいて次のパラメーターを設定し、[OK] をクリックします。

      パラメーターの設定の詳細については、ASMLocalRateLimiterフィールドの説明をご参照ください。

      セクション

      パラメーター

      説明

      [スロットリングの基本情報]

      [名前空間]

      ローカルスロットリングルールが有効になるワークロードが存在する名前空間。この例では、すべてのイングレスゲートウェイが istio-system 名前空間にデプロイされているため、[istio-system] を選択する必要があります。

      [名前]

      ローカルスロットリングルール名。この例では、ingressgatewayと入力します。

      [有効なワークロードのタイプ]

      スロットリングが有効になるワークロードのタイプ。 [適用可能なアプリケーション] または [適用可能なゲートウェイ] を選択できます。この例では、[適用可能なゲートウェイ] を選択します。

      [関連ワークロード]

      [有効なワークロードのタイプ]で[適用可能なゲートウェイ]を選択した場合、Istioゲートウェイを選択して、ローカルスロットリングルールが有効になるワークロードを指定できます。このようにして、ローカルスロットリングルールが有効になるワークロードは、Istioゲートウェイに対して選択されたワークロードと同じになります。 この例では、[bookinfo-gateway] を選択します。

      [スロットリングルールのリスト]

      [ゲートウェイドメイン名]

      Istioゲートウェイで宣言されているドメイン名。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[bf2.example.com] を選択します。

      [ゲートウェイポート]

      Istioゲートウェイで宣言されているポート。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[80] を選択します。

      [仮想サービスのルートと一致]

      Istioゲートウェイを定義する仮想サービスで宣言されているルート。スロットリングルールは、仮想サービスで宣言されている指定されたルートに有効になります。この例では、[productpage-route-name1] を選択します。

      [スロットリング設定]

      ローカルスロットリング検出の時間枠の長さと、時間枠内で許可されるリクエスト数を指定します。時間枠内で送信されたリクエスト数が上限を超えると、リクエストに対してスロットリングがトリガーされます。この例では、次の設定を使用します。

      • [スロットリング検出の時間枠][1秒] に設定します。

      • [時間枠内で許可されるリクエスト数][10] に設定します。

      上記の構成は、このサービスのワークロード宛てのリクエストが1秒以内に10を超えることができないことを示しています。

      [詳細設定]

      [詳細設定を表示] をクリックして、スロットリングの実装時にいくつかの詳細設定を行うことができます。ビジネス要件に基づいて詳細設定を行うことができます。この例では、[カスタムスロットリングレスポンス本文] フィールドに{"ret_code": xxx,"message": "Your request be limited"}と入力します。

      image.png

      次のYAMLコードは、前の図で指定されたローカルスロットリングルール設定を示しています。

      • 詳細設定を行わない場合、スロットリング中にデフォルトのレスポンスが返されます。

        展開して、詳細設定が構成されていない場合のローカルスロットリングのYAMLコードを表示

        apiVersion: istio.alibabacloud.com/v1beta1
        kind: ASMLocalRateLimiter
        metadata:
          name: ingressgateway
          namespace: istio-system
        spec:
          configs:
            - limit:
                fill_interval:
                  seconds: 1
                quota: 10
              match:
                vhost:
                  name: bf2.example.com
                  port: 80
                  route:
                    name_match: productpage-route-name1
          isGateway: true
          workloadSelector:
            labels:
              istio: ingressgateway
      • 詳細設定を行った場合は、詳細設定セクションで指定したカスタムレスポンスが返されます。

        展開して、詳細設定が構成されている場合のローカルスロットリングのYAMLコードを表示

        apiVersion: istio.alibabacloud.com/v1beta1
        kind: ASMLocalRateLimiter
        metadata:
          name: ingressgateway
          namespace: istio-system
        spec:
          configs:
            - limit:
                custom_response_body: '{"ret_code": xxx, "message": "Your request be limited" }'  # カスタムレスポンスボディを設定します
                fill_interval:
                  seconds: 1
                quota: 10
              match:
                vhost:
                  name: bf2.example.com
                  port: 80
                  route:
                    name_match: productpage-route-name1
          isGateway: true
          workloadSelector:
            labels:
              istio: ingressgateway
  2. hey で次のコマンドを実行して、継続的なストレステストトラフィックを生成します。

    hey -host bf2.example.com -c 10 -n 100000 http://<イングレスゲートウェイのIPアドレス>/productpage
    hey -host bf2.example.com -c 10 -n 100000 http://<イングレスゲートウェイのIPアドレス>/nginx
  3. 次のコマンドを実行して、イングレスゲートウェイの /productpage パスにアクセスします。

    curl -H 'host: bf2.example.com'  http://<イングレスゲートウェイのIPアドレス>/productpage -v

    期待される出力:

    < HTTP/1.1 429 Too Many Requests
    < Content-Length: 18
    < Content-Type: text/plain
    < Date: Thu, 13 Jan 2022 03:03:09 GMT
    < Server: istio-envoy
    <
    local_rate_limited

    出力は、Bookinfoサービスへのアクセスが調整されていることを示しています。

  4. 次のコマンドを実行して、イングレスゲートウェイの /nginx パスにアクセスします。

    curl -H 'host: bf2.example.com'  http://${ASM_GATEWAY_IP}/nginx  -v

    返された結果には 429 エラーコードが含まれていません。これは、アクセスが調整されていないことを示しています。

シナリオ 2:イングレスゲートウェイで特定のドメイン名と特定のポートの組み合わせにスロットリングルールを設定する

ドメインとポートの組み合わせbf2.example.com:80にスロットリングルールを設定して、bf2.example.com:80のすべてのパスへのアクセスが調整されるようにします。

  1. ローカルスロットリングルールを設定します。

    1. ASMコンソールにログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、[トラフィック管理センター] > [レート制限] を選択します。表示されるページで、[作成] をクリックします。

    3. [作成] ページで、ビジネス要件に基づいて次のパラメーターを設定し、[OK] をクリックします。

      パラメーターの設定の詳細については、ASMLocalRateLimiterフィールドの説明をご参照ください。

      セクション

      パラメーター

      説明

      [スロットリングの基本情報]

      [名前空間]

      ローカルスロットリングルールが有効になるワークロードが存在する名前空間。この例では、すべてのイングレスゲートウェイが istio-system 名前空間にデプロイされているため、[istio-system] を選択する必要があります。

      [名前]

      ローカルスロットリングルール名。この例では、ingressgatewayと入力します。

      [有効なワークロードのタイプ]

      スロットリングが有効になるワークロードのタイプ。 [適用可能なアプリケーション] または [適用可能なゲートウェイ] を選択できます。この例では、[適用可能なゲートウェイ] を選択します。

      [関連ワークロード]

      [有効なワークロードのタイプ]で[適用可能なゲートウェイ]を選択した場合、Istioゲートウェイを選択して、ローカルスロットリングルールが有効になるワークロードを指定できます。このようにして、ローカルスロットリングルールが有効になるワークロードは、Istioゲートウェイに対して選択されたワークロードと同じになります。 この例では、[bookinfo-gateway] を選択します。

      [スロットリングルールのリスト]

      [ゲートウェイドメイン名]

      Istioゲートウェイで宣言されているドメイン名。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[bf2.example.com] を選択します。

      [ゲートウェイポート]

      Istioゲートウェイで宣言されているポート。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[80] を選択します。

      [仮想サービスのルートと一致]

      Istioゲートウェイを定義する仮想サービスで宣言されているルート。スロットリングルールは、仮想サービスで宣言されている指定されたルートに有効になります。この例では、ルートは選択されていません。これは、スロットリングルールが、指定されたドメイン名とポート宛てのすべてのルートに有効になることを示しています。

      [スロットリング設定]

      ローカルスロットリング検出の時間枠の長さと、時間枠内で許可されるリクエスト数を指定します。時間枠内で送信されたリクエスト数が上限を超えると、リクエストに対してスロットリングがトリガーされます。この例では、次の設定を使用します。

      • [スロットリング検出の時間枠][1秒] に設定します。

      • [時間枠内で許可されるリクエスト数][10] に設定します。

      上記の構成は、このサービスのワークロード宛てのリクエストが1秒以内に10を超えることができないことを示しています。

      image.png

      次のYAMLコードは、前の図で指定されたローカルスロットリングルール設定を示しています。

      展開してローカルスロットリングのYAMLコードを表示

      apiVersion: istio.alibabacloud.com/v1beta1
      kind: ASMLocalRateLimiter
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        configs:
          - limit:
              fill_interval:
                seconds: 1
              quota: 10
            match:
              vhost:
                name: bf2.example.com
                port: 80
                route: {} # ルートを指定しないため、すべてのルートに適用されます。
        isGateway: true
        workloadSelector:
          labels:
            istio: ingressgateway
  2. hey で次のコマンドを実行して、継続的なストレステストトラフィックを生成します。

    hey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/nginx
  3. 次のコマンドを実行して、イングレスゲートウェイの /nginx パスにアクセスします。

    curl -H 'host: bf2.example.com'  http://${ASM_GATEWAY_IP}/nginx -v

    HTTP/1.1 429 Too Many Requests メッセージが返されます。これは、イングレスゲートウェイの /nginx パスへのアクセスが調整されていることを示しています。

シナリオ 3:仮想サービスの単一のルートに対して特定のヘッダーを含むリクエストのスロットリングルールを設定する

ドメインとポートの組み合わせ bf2.example.com:80 の nginx-route-name1 ルートにスロットリングルールを設定し、ratelimit: "true" ヘッダーを持つリクエストに対してのみスロットリングルールが有効になるように指定します。ルート上の他のリクエストは、スロットリングルールの対象になりません。 nginx-route-name1 は、前提条件セクションで説明されている Bookinfo サービス用に作成された仮想サービスのルートです。 nginx-route-name1 ルートは、リクエストの宛先が /nginx である場合に一致します。リクエストは NGINX サービスに転送されます。

  1. ローカルスロットリングルールを設定します。

    1. ASMコンソールにログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理]ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、[トラフィック管理センター] > [レート制限] を選択します。表示されるページで、[作成]をクリックします。

    3. [作成]ページで、ビジネス要件に基づいて次のパラメーターを設定し、[OK]をクリックします。

      パラメーターの設定の詳細については、ASMLocalRateLimiterフィールドの説明をご参照ください。

      セクション

      パラメーター

      説明

      [スロットリングの基本情報]

      [名前空間]

      ローカルスロットリングルールが有効になるワークロードが存在する名前空間。この例では、すべてのイングレスゲートウェイがistio-system名前空間にデプロイされているため、[istio-system]を選択する必要があります。

      [名前]

      ローカルスロットリングルール名。この例では、ingressgatewayと入力します。

      [有効なワークロードのタイプ]

      スロットリングが有効になるワークロードのタイプ。 [適用可能なアプリケーション]または [適用可能なゲートウェイ] を選択できます。この例では、[適用可能なゲートウェイ] を選択します。

      [関連ワークロード]

      [有効なワークロードのタイプ]で[適用可能なゲートウェイ]を選択した場合、Istioゲートウェイを選択して、ローカルスロットリングルールが有効になるワークロードを指定できます。このようにして、ローカルスロットリングルールが有効になるワークロードは、Istioゲートウェイに対して選択されたワークロードと同じになります。 この例では、[bookinfo-gateway] を選択します。

      [スロットリングルールのリスト]

      [ゲートウェイドメイン名]

      Istioゲートウェイで宣言されているドメイン名。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[bf2.example.com] を選択します。

      [ゲートウェイポート]

      Istioゲートウェイで宣言されているポート。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[80] を選択します。

      [仮想サービスのルートと一致]

      Istioゲートウェイを定義する仮想サービスで宣言されているルート。スロットリングルールは、仮想サービスで宣言されている指定されたルートに有効になります。この例では、[nginx-route-name1] を選択します。

      [リクエスト属性と一致]

      リクエストマッチングルール。リクエストがリクエストマッチングルールを満たすと、設定されたスロットリングがトリガーされます。この例では、次の設定を使用します。

      • [一致した属性]セクションで、[特定のリクエストヘッダー] を選択します。

      • [リクエストヘッダー][ratelimit] に設定します。

      • [マッチング方法]セクションで、[完全一致] を選択します。

      • [一致したコンテンツ]フィールドにtrueと入力します。

      [スロットリング設定]

      ローカルスロットリング検出の時間枠の長さと、時間枠内で許可されるリクエスト数を指定します。時間枠内で送信されたリクエスト数が上限を超えると、リクエストに対してスロットリングがトリガーされます。この例では、次の設定を使用します。

      • [スロットリング検出の時間枠][1秒] に設定します。

      • [時間枠内で許可されるリクエスト数][10] に設定します。

      上記の構成は、このサービスのワークロード宛てのリクエストが1秒以内に10を超えることができないことを示しています。

      image.png

      次のYAMLコードは、前の図で指定されたローカルスロットリングルール設定を示しています。

      展開してローカルスロットリングのYAMLコードを表示

      apiVersion: istio.alibabacloud.com/v1
      kind: ASMLocalRateLimiter
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        configs:
          - limit:
              fill_interval:
                seconds: 1
              quota: 10
            match:
              vhost:
                name: bf2.example.com
                port: 80
                route:
                  header_match:  # リクエストヘッダーの一致ルール
                    - exact_match: 'true'
                      invert_match: false
                      name: ratelimit
                  name_match: nginx-route-name1
        isGateway: true
        workloadSelector:
          labels:
            istio: ingressgateway
  2. hey で次のコマンドを実行して、ratelimit: true ヘッダーを含むリクエストを送信することによりアクセスを開始します。

    hey -host bf2.example.com -H 'ratelimit: true' -c 10 -n 10000 http://${ASM_GATEWAY_IP}/nginx
  3. 次のコマンドを実行して、イングレスゲートウェイの /nginx パスにアクセスします。

    curl -H 'host: bf2.example.com' -H 'ratelimit: true'  http://${ASM_GATEWAY_IP}/nginx -v

    HTTP/1.1 429 Too Many Requests メッセージが返されます。これは、ratelimit: true ヘッダーを含むイングレスゲートウェイの /nginx パスへのアクセスリクエストが調整されていることを示しています。

  4. 次のコマンドを実行して、ratelimit: true ヘッダーを含まないリクエストを送信することにより、イングレスゲートウェイの /nginx パスにアクセスします。

    curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v

    レスポンスにはステータスコード 429 は含まれていません。これは、ratelimit: true ヘッダーを含まないリクエストは調整されないことを示しています。

関連操作

アクセススロットリングを停止するためにスロットリング設定を削除する

  1. スロットリングルールを削除します。

    1. ASMコンソールにログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理]ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、[トラフィック管理センター] > [レート制限] を選択します。

    3. [レート制限]ページで、削除するスロットリングルールを見つけ、[アクション]列の[削除]をクリックします。 [送信]メッセージで、[OK]をクリックします。

  2. 次のコマンドを実行して、イングレスゲートウェイの /nginx パスにアクセスします。

    curl -H 'host: bf2.example.com'  http://${ASM_GATEWAY_IP}/nginx -v

    返された結果には 429 エラーコードが含まれていません。これは、アクセスが調整されていないことを示しています。

参考文献