イングレスゲートウェイの特定のルートに対してグローバルスロットリングを設定することで、トラフィックバースト、サービス過負荷、リソース枯渇、悪意のある攻撃などの問題に対処するためのトラフィックを正確に制御できます。 これにより、バックエンドサービスの安定性が保護され、コストが削減され、ユーザーエクスペリエンスが向上します。
前提条件
マネージド Kubernetes クラスターが ASM インスタンスに追加されており、ASM インスタンスのバージョンが 1.18.0.131 以降です。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
Kubernetes クラスターの
default名前空間で自動サイドカーインジェクションが有効になっています。詳細については、「自動インジェクションを有効にする」をご参照ください。ingressgateway という名前のイングレスゲートウェイが作成され、ポート 80 が有効になっています。 詳細については、イングレスゲートウェイの作成をご参照ください。
準備
スロットリングサービスのデプロイ
以下の内容を含む ratelimit-svc.yaml ファイルを作成します。
ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、クラスター内にスロットリングサービスとその依存 Redis サービスを作成します。
kubectl を使用してクラスターに接続する方法の詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
kubectl apply -f ratelimit-svc.yaml
Bookinfo サンプルアプリケーションのデプロイ
GitHub 上の Istio リポジトリ から、Bookinfo アプリケーションの bookinfo.yaml ファイルをダウンロードします。
Bookinfo アプリケーションを ASM インスタンスのクラスターにデプロイするには、ACK クラスターの kubeconfig 環境で次のコマンドを実行します。
kubectl apply -f bookinfo.yaml以下の内容を含む bookinfo-gateway.yaml を作成します。
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 サービスに転送します。スロットリングルールが設定されると、これらのパスに送信されたリクエストはレート制限の対象となります。
次の内容を含む global-ratelimit-gw.yaml ファイルを作成します。
次の表に、いくつかのフィールドについて説明します。 詳細については、「ASMGlobalRateLimiter フィールドの説明」をご参照ください。
フィールド
説明
workloadSelectorスロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを
istio: ingressgatewayに設定します。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では、このパラメーターは
trueに設定されています。rateLimitService調整サービスのドメイン名、ポート、および接続タイムアウト設定。 次のコードブロックは、準備 でデプロイされた調整サービスの設定を示しています。
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limit有効になるスロットリング設定パラメーター。
unitはスロットリング検出の時間単位を指定します。quotaは時間単位あたりに許可されるリクエストの総数を指定します。この例では、
unitはMINUTEに設定され、quotaは1に設定されています。これは、一致するルートで 1 分あたり 1 つのリクエストしか送信できないことを示します。超過したリクエストはスロットリングされます。vhostスロットリングルールが一致するドメイン名とルート項目の設定。
nameとportの値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。route.name_matchで指定されたルート名は、VirtualService のルート項目の名前と同じである必要があります。ASM インスタンスの kubeconfig 環境で、次のコマンドを実行して、ゲートウェイの
productpage-route-name1ルートに対するグローバルスロットリングルールを作成します。kubectl apply -f global-ratelimit-gw.yaml次のコマンドを実行して、グローバル調整ルールの設定を取得します。
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml前のステップの出力にある ASMGlobalRateLimiter リソースの
statusフィールドからconfig.yamlフィールドの内容をコピーします。その内容を `ratelimit-config.yaml` ファイルに貼り付けて、グローバルスロットリングサービスの設定を生成します。ASMGlobalRateLimiter の
statusフィールドの下にあるconfig.yamlフィールドの文字列コンテンツは、ConfigMap のdataセクションのconfig.yamlフィールドにそのまま貼り付ける必要があります。ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、クラスター内のグローバルスロットリングサービスの設定を更新します。
kubectl apply -f ratelimit-config.yaml次のコマンドを実行して、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 に対してグローバルスロットリングルールを設定できます。ルールが設定されると、このドメイン名とポートに送信されたリクエストはレート制限されます。
次の内容を含む global-ratelimit-gw.yaml ファイルを作成します。
次の表に、いくつかのフィールドについて説明します。詳細については、「ASMGlobalRateLimiter フィールドの説明」をご参照ください。
フィールド
説明
workloadSelectorスロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを
istio: ingressgatewayに設定します。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では、このパラメーターは
trueに設定されています。rateLimitService調整サービスのドメイン名、ポート、および接続タイムアウト設定。準備 でデプロイされた調整サービスの設定を次のコードブロックに示します。
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limit有効になるスロットリング設定パラメーター。
unitはスロットリング検出の時間単位を指定します。quotaは時間単位あたりに許可されるリクエストの総数を指定します。この例では、
unitはMINUTEに設定され、quotaは1に設定されています。これは、一致するルートで 1 分あたり 1 つのリクエストしか送信できないことを示します。超過したリクエストはスロットリングされます。vhostスロットリングルールが一致するドメイン名とルート項目の設定。
nameとportの値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。ASM インスタンスの kubeconfig 環境で、次のコマンドを実行して、ゲートウェイの
productpage-route-name1ルートに適用されるグローバルスロットリングルールを作成します。kubectl apply -f global-ratelimit-gw.yaml次のコマンドを実行して、グローバル調整ルールの設定を取得します。
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml前のステップの出力から、ASMGlobalRateLimiter リソースの
statusフィールド内のconfig.yamlフィールドの内容をコピーし、ratelimit-config.yaml ファイルに貼り付けて、グローバルスロットリングサービスの設定を作成します。ASMGlobalRateLimiter リソースの
statusフィールドの下にあるconfig.yamlフィールドの文字列コンテンツを、ConfigMap のdataセクションのconfig.yamlフィールドにそのまま貼り付けます。ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、クラスター内のグローバルスロットリングサービスの設定を更新します。
kubectl apply -f ratelimit-config.yaml次のコマンドを実行して、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 -vBookinfo アプリケーションへの 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 intactbf2.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 サービスに転送します。スロットリングルールを設定すると、これらのパスに送信されたリクエストはレート制限の対象となります。
以下の内容を含む global-ratelimit-gw.yaml ファイルを作成します。
次の表に、いくつかのフィールドについて説明します。 詳細については、「ASMGlobalRateLimiter フィールドの説明」をご参照ください。
フィールド
説明
workloadSelectorスロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを
istio: ingressgatewayに設定します。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では、このパラメーターは
trueに設定されています。rateLimitService調整サービスのドメイン名、ポート、および接続タイムアウト設定。準備 にデプロイされた調整サービスの設定を次のコードブロックに示します。
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitVirtualService ルートで有効になるスロットリング設定パラメーター。
unitはスロットリング検出の時間単位を指定します。quotaは時間単位あたりに許可されるリクエストの総数を指定します。この例では、unitはSECONDに設定され、quotaは100000に設定されています。これは、一致するルートで 1 秒あたり 100,000 件のリクエストが許可されることを示します。この設定は、スロットリングが設定されていない場合とほぼ同じです。指定された条件を満たすリクエストのみがスロットリングされ、他のリクエストはスロットリングをトリガーする必要がないことを意図しています。vhostスロットリングルールが一致するドメイン名とルート項目の設定。
nameとportの値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。route.name_matchで指定されたルート名は、VirtualService のルート項目の名前と同じである必要があります。limit_overrides設定済みの調整しきい値をオーバーライドするかどうかを指定します。このフィールドを使用して、特定のリクエストに対して個別に調整しきい値を指定できます。この例では、次のとおりです。
limit_overridesのrequest_matchフィールドは、ratelimit: "true"リクエストヘッダーを含み、リクエストパスにratelimit=enabledクエリパラメーターを持つリクエストに完全に一致するように設定されています。limit_overridesのlimitフィールドでは、unitはMINUTEに設定され、quotaは1に設定されています。これは、request_matchで指定された条件を満たすリクエストに対して、1 分あたり 1 つのリクエストのみが許可されることを示します。
ASM インスタンスの kubeconfig 環境で、次のコマンドを実行して、ゲートウェイの
productpage-route-name1ルートに対するグローバルスロットリングルールを作成します。kubectl apply -f global-ratelimit-gw.yaml次のコマンドを実行して、グローバル調整ルールの設定を取得します。
kubectl get asmglobalratelimiter global-test -n istio-system -o yamlグローバルスロットリングサービスの設定を生成するには、前のステップの出力にある ASMGlobalRateLimiter リソースの
statusフィールドからconfig.yamlフィールドの内容を `ratelimit-config.yaml` ファイルに貼り付けます。ASMGlobalRateLimiter リソースの
statusフィールドの下にあるconfig.yamlフィールドの文字列コンテンツは、ConfigMap のdataセクションのconfig.yamlフィールドにそのまま貼り付ける必要があります。ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、クラスター内のグローバルスロットリングサービスの設定を更新します。
kubectl apply -f ratelimit-config.yaml次のコマンドを実行して、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 -vBookinfo アプリケーションへの 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 番目のリクエストはスロットリングされます。これは、イングレスゲートウェイのグローバルスロットリング設定が特定のリクエストに正常に一致していることを示します。次のコマンドを実行して 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 アドレスからのリクエストにのみ有効であり、このルート上の他のリクエストは影響を受けません。
次の内容を含む global-ratelimit-gw.yaml ファイルを作成します。
次の表に、いくつかのフィールドについて説明します。詳細については、「ASMGlobalRateLimiter フィールドの説明」をご参照ください。
フィールド
説明
workloadSelectorスロットリングルールが有効になるワークロード。この例では、グローバルスロットリングは ingressgateway イングレスゲートウェイで有効になります。このパラメーターを
istio: ingressgatewayに設定します。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では、このパラメーターは
trueに設定されています。rateLimitService調整サービスのドメイン名、ポート、および接続タイムアウト設定。準備 にデプロイされた調整サービスの設定を次のコードブロックに示します。
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitVirtualService ルートで有効になるスロットリング設定パラメーター。
unitはスロットリング検出の時間単位を指定します。quotaは時間単位あたりに許可されるリクエストの総数を指定します。この例では、
unitはSECONDに設定され、quotaは100000に設定されています。これは、一致するルートで 1 秒あたり 100,000 件のリクエストが許可されることを示します。この設定は、スロットリングが設定されていない場合とほぼ同じです。指定された条件を満たすリクエストのみがスロットリングされ、他のリクエストはスロットリングをトリガーする必要がないことを意図しています。vhostスロットリングルールが一致するドメイン名とルート項目の設定。
nameとportの値は、ゲートウェイに適用される VirtualService のドメイン名とイングレスゲートウェイのポートと同じである必要があります。route.name_matchで指定されたルート名は、VirtualService のルート項目の名前と同じである必要があります。limit_overrides設定済みの調整しきい値をオーバーライドするかどうかを指定します。このフィールドを使用して、特定のリクエストに対して個別に調整しきい値を指定できます。この例では、次のとおりです。
request_matchフィールドでは、remote_address.addressを使用してクライアントリクエストのソース IP アドレスに一致させ、remote_addess.v4_prefix_mask_lenを使用してクライアントのソース IP アドレス範囲のサブネットマスクに一致させます (オプション)。limit_overridesフィールドのlimitフィールドでは、unitはMINUTEに設定され、quotaは1に設定されています。これは、request_matchで指定された条件を満たすリクエストに対して、1 分あたり 1 つのリクエストのみが許可されることを示します。
ASM インスタンスの kubeconfig 環境で、次のコマンドを実行して、ゲートウェイの
productpage-route-name1ルートに適用されるグローバルスロットリングルールを作成します。kubectl apply -f global-ratelimit-gw.yaml次のコマンドを実行して、グローバル調整ルールの設定を取得します。
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml前のステップの出力にある ASMGlobalRateLimiter リソースの
statusフィールドからconfig.yamlフィールドの内容をコピーします。この内容を ratelimit-config.yaml ファイルに貼り付けて、グローバルスロットリングサービスの設定を生成します。ASMGlobalRateLimiter リソースの
statusフィールド内のconfig.yamlフィールドの文字列コンテンツは、ConfigMap のdataセクションのconfig.yamlフィールドにそのまま貼り付ける必要があります。ACK クラスターの kubeconfig 環境で、次のコマンドを実行して、クラスター内のグローバルスロットリングサービスの設定を更新します。
kubectl apply -f ratelimit-config.yaml次のコマンドを実行して、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 -vBookinfo アプリケーションへの 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 アドレスから送信されたリクエストに対してグローバル調整が有効になっていることを示します。
別の IP アドレスを使用して Bookinfo アプリケーションに再度アクセスするには、次のコマンドを実行します。
curl -H 'host: bf2.example.com' http://<ASM gateway IP>/productpage -v出力は、429 ステータスコードが見つからず、Bookinfo アプリケーションに正常にアクセスできたことを示しています。これは、ルート上の他のリクエストがグローバル調整ルールの対象ではないことを示します。
シナリオ 5: イングレスゲートウェイの特定の VirtualService ルートで、異なるクライアント IP アドレスに対して個別のスロットリングルールを設定する
このシナリオでは、バージョン 1.25.0 以降の ASM インスタンスが必要です。インスタンスのアップグレードの詳細については、「ASM インスタンスのアップグレード」をご参照ください。
このシナリオでは、ASM イングレスゲートウェイの外部トラフィックポリシーを
Localに設定する必要があります。イングレスゲートウェイの作成とその設定項目の詳細については、「イングレスゲートウェイを作成する」をご参照ください。ゲートウェイに送信されたリクエストのクライアント IP アドレスは、ゲートウェイのアクセスログの
downstream_remote_addressフィールドから取得できます。この例では、要件に基づいてスロットリングするクライアント IP アドレスを設定します。
このシナリオでは、bf2.example.com:80 の productpage-route-name1 VirtualService ルートのスロットリングルールを設定します。このルールは、各クライアント IP アドレスが個別にスロットリングされ、各クライアント IP から 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: 5limitVirtualService ルートで有効になるスロットリング設定パラメーター。このパラメーターでは:
unitはスロットリング検出の時間単位を指定します。quotaは時間単位あたりに許可されるリクエストの総数を指定します。
この例では、
unitはSECONDに設定され、quotaは100000に設定されています。これは、一致するルートで 1 秒あたり 100,000 件のリクエストが許可されることを示します。この設定は、スロットリングが設定されていない場合とほぼ同じです。指定された条件を満たすリクエストのみがスロットリングされ、他のリクエストはスロットリングをトリガーする必要がないことを意図しています。limit_overridesスロットリングのしきい値のオーバーライド設定。このフィールドを使用して、特定のリクエストに対して個別のスロットリングのしきい値を指定できます。この例では:
request_matchフィールドでは:remote_address.addressは、クライアントリクエストのソース IP アドレスに一致させるために使用されます。remote_address.address.disinctはtrueに設定され、異なるクライアント IP アドレスに対して個別のスロットリングを有効にします。remote_addess.v4_prefix_mask_lenは、クライアントのソース IP アドレス範囲のサブネットマスクに一致します (オプション)。
limit_overridesフィールドのlimitフィールドでは、unitはMINUTEに設定され、quotaは1に設定されています。これは、request_matchで指定された条件を満たすリクエストに対して、1 分あたり 1 つのリクエストのみが許可されることを示します。
target_servicesスロットリング項目が一致する VirtualService ルート設定。このパラメーターでは:
kindは、スロットリングルールが VirtualService ルートで有効になることを指定します。namespaceとnameは、VirtualService の名前空間と名前を指定します。portは、スロットリングルールがポート 80 のトラフィックルートにのみ有効になることを指定します。section_nameは、スロットリングルールが VirtualService のproductpage-route-name1という名前のルート項目で有効になることを指定します。
グローバルスロットリングルールをデプロイします。
kubectl apply -f global-ratelimit-gw.yaml調整されたグローバルスロットリングルールの設定を取得します。
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前のステップの出力を使用して、「準備」セクションの 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異なるクライアントから連続して 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 -v2 回目のアクセスの期待される出力:
< 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 intact2 番目のリクエストはスロットリングされます。これは、イングレスゲートウェイのグローバルスロットリング設定が成功したことを示します。
参考資料
スロットリングサービスを使用せずに、またはリソース消費量の少ない方法でスロットリングを実装する場合は、ASM でローカルスロットリングを設定できます。詳細については、「Traffic Management Center でローカルスロットリングを設定する」をご参照ください。
サイドカープロキシが挿入されたサービスへのインバウンドトラフィックを制御および制限する場合は、グローバルスロットリングを設定できます。詳細については、「ASMGlobalRateLimiter を使用してイングレスゲートウェイとサービスへのインバウンドトラフィックのグローバルスロットリングを設定する」をご参照ください。