トラフィックバースト、サービスの過負荷、リソースの枯渇、または悪意のある攻撃に対処するには、特定のゲートウェイルートでグローバルスロットリングを設定します。これにより、精密なトラフィックコントロールによってバックエンドサービスを保護し、コストを削減し、ユーザーエクスペリエンスを向上させることができます。
前提条件
-
ACK マネージドクラスターが、バージョン 1.18.0.131 以降の ASM インスタンスに追加されています。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
-
Kubernetes クラスターの
default名前空間の自動インジェクションを有効にしました。詳細については、「サイドカープロキシの自動インジェクションを有効にする」をご参照ください。 -
ingressgatewayという名前のイングレスゲートウェイが作成され、ポート 80 が有効になりました。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
事前準備
レート制限サービスのデプロイ
-
次の内容で ratelimit-svc.yaml という名前のファイルを作成します。
-
ACK クラスターの kubeconfig 環境で、次のコマンドを実行してレート制限サービスと必要な Redis サービスを作成します。
kubectl を使用してクラスターに接続する方法については、「クラスターの kubeconfig の取得と kubectl を使用したクラスターへの接続」をご参照ください。
kubectl apply -f ratelimit-svc.yaml
Bookinfo サンプルアプリケーションのデプロイ
GitHub 上の Istio プロジェクトリポジトリから、Bookinfo アプリケーション用の YAML マニフェスト (bookinfo.yaml) をダウンロードします。
-
ACK クラスターの kubeconfig 環境で、次のコマンドを実行して Bookinfo アプリケーションを ASM インスタンスに関連付けられたクラスターにデプロイします。
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 は、「始める前に」で作成した bookinfo VirtualService 内のルートエントリです。このルートは、/productpage、/static、/login、/logout などのパスへのリクエストに一致し、それらを productpage Service に転送します。ルールを設定した後、指定されたレート制限がこれらのパスへのすべてのリクエストに適用されます。
-
次の内容の
global-ratelimit-gw.yamlという名前のファイルを作成します。次の表で主要なフィールドについて説明します。詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。
パラメーター
説明
workloadSelectorレート制限の対象となるワークロードを選択します。この例では、グローバル レート制限はラベル
app: 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は VirtualService のドメイン名と一致する必要があり、portはイングレスゲートウェイのポートと一致する必要があります。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 -
次のコマンドを 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 -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 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 のドメインとポートの組み合わせに対してグローバルレート制限ルールを設定する方法を示します。このルールを適用すると、このドメインとポートの組み合わせに送信されるすべてのリクエストに対して、指定されたレート制限が適用されます。
-
次の内容で、
global-ratelimit-gw.yamlという名前のファイルを作成します。次の表で、主要なフィールドについて説明します。詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。
パラメーター
説明
workloadSelectorレート制限ルールの対象となるワークロードを指定します。この例では、label
istio: ingressgatewayで識別される Ingress ゲートウェイのワークロードを対象とします。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では
trueに設定します。rateLimitServiceレート制限サービスのドメイン、ポート、および接続タイムアウトを指定します。準備ステップでデプロイしたサービスに基づき、設定は次のようになります:
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limitレート制限を定義します。
unitフィールドは時間間隔を指定し、quotaフィールドは間隔ごとに許可されるリクエストの数を指定します。この例では、
unitをMINUTEに、quotaを1に設定しています。この設定により、一致したルートに対して 1 分あたり 1 つのリクエストのみが許可されます。その 1 分以内の後続のリクエストは拒否されます。vhost一致するドメインとルートを指定します。
nameとportは、それぞれ VirtualService のドメインと Ingress ゲートウェイのポートと一致する必要があります。 -
ASM インスタンスの kubeconfig 環境で、ゲートウェイ上の
productpageルートにグローバルレート制限ルールを適用するには、次のコマンドを実行します。kubectl apply -f global-ratelimit-gw.yaml -
次のコマンドを実行して、調整されたグローバルレート制限ルールの設定を取得します。
kubectl get asmglobalratelimiter global-test -n istio-system -o yaml -
前の出力の
statusフィールドからconfig.yamlキーの内容をコピーし、ratelimit-config.yamlという名前のファイルに貼り付けて、グローバルレート制限サービスを設定します。ASMGlobalRateLimiter の
statusフィールド内のconfig.yamlフィールドの文字列内容を、ConfigMap のdataフィールド内の同名のconfig.yamlフィールドにそのまま貼り付ける必要があります。 -
ACK クラスターの kubeconfig 環境で、次のコマンドを実行してグローバルレート制限サービスの設定を更新します。
kubectl apply -f ratelimit-config.yaml -
次のコマンドを連続して 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 -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 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 サービスに転送します。 レート制限ルールが設定されると、これらのパスに送信され、指定された条件を満たすリクエストはレート制限されます。
-
次の内容で
global-ratelimit-gw.yamlという名前のファイルを作成します。次の表に、主要なフィールドを示します。詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。
パラメーター
説明
workloadSelectorレート制限の対象となるワークロードを指定します。この例では、グローバルレート制限は Ingress ゲートウェイに適用され、
istio: ingressgatewayに設定されています。isGatewayゲートウェイに適用されるかどうかを指定します。この例では、
trueに設定されています。rateLimitServiceレート制限サービスのドメイン名、ポート、および接続タイムアウトを指定します。準備の手順でデプロイされたサービスに基づき、設定は次のようになります。
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limit仮想サービスルートの基本的なレート制限パラメーターを定義します。
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 回に制限されます。
-
-
対応する 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のconfig.yamlフィールド配下にあるstatusフィールドの文字列の内容は、ConfigMapのdataフィールド配下にある同名のconfig.yamlフィールドにそのまま貼り付ける必要があります。 -
ACK クラスターの kubeconfig 環境から、次のコマンドを実行して、クラスター内のグローバルレート制限サービスの設定を更新します。
kubectl apply -f ratelimit-config.yaml -
次のコマンドを 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' -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 番目のリクエストはレート制限されます。これは、ingress ゲートウェイで特定のリクエストを照合するためのグローバルレート制限設定が成功したことを示します。 -
次のコマンドを実行して、
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 アドレスからのリクエストにのみ適用され、同じルート上の他のリクエストには影響しません。
-
次の内容で
global-ratelimit-gw.yamlという名前のファイルを作成します。次の表に、主要なフィールドを示します。これらのフィールドの詳細については、「ASMGlobalRateLimiter CRD リファレンス」をご参照ください。
パラメーター
説明
workloadSelectorスロットリングを適用するワークロードを選択します。この例では、label
app: istio-ingressgatewayで選択されるイングレスゲートウェイのワークロードにグローバルスロットリングを適用します。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では、
trueに設定されています。rateLimitServiceスロットリングサービスのドメイン、ポート、および接続タイムアウトです。前提条件でデプロイされたスロットリングサービスに基づき、設定は次のようになります。
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limit仮想サービスルートの基本的なスロットリングパラメーターです。
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 つのみ許可されます。
-
-
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 -
指定した 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 -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 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回目はスロットリングされます。これにより、イングレスゲートウェイのグローバルスロットリングルールが期待どおりに機能していることが確認されます。
-
別の IP アドレスを持つクライアントから、次のコマンドを実行して bookinfo アプリケーションに再度アクセスします。
curl -H 'host: bf2.example.com' http://<ASM_GATEWAY_IP>/productpage -vリクエストは成功し、HTTP
429ステータスコードは返されません。これは、ルート上の他のリクエストがグローバルスロットリングルールの影響を受けないことを示します。
シナリオ 5:ルートにおけるクライアント IP ごとのレート制限の設定
-
このシナリオでは、バージョン 1.25.0 以降の ASM インスタンスが必要です。アップグレード手順については、「ASM インスタンスのアップグレード」をご参照ください。
-
このシナリオでは、ASM ingress gateway の外部トラフィックポリシーを
Localに設定する必要があります。 これにより、元のクライアント IP アドレスが保持されます。 ingress gateway の作成方法およびその設定オプションの詳細については、「ingress gateway を作成する」をご参照ください。 -
ゲートウェイへのリクエストのクライアント IP アドレスは、アクセスログの
downstream_remote_addressフィールドで確認できます。 この例では、レート制限ルールは実際のクライアント IP アドレスに基づいて設定されています。
このシナリオでは、bf2.example.com:80 にある productpage-route-name1 仮想サービスルートにレート制限ルールを設定して、一意の各クライアント 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レート制限ルールを適用するワークロードを選択します。この例では、ラベル
app: istio-ingressgatewayによって選択された Ingress ゲートウェイに、グローバルレート制限が適用されます。isGatewayルールがゲートウェイに適用されるかどうかを指定します。この例では、
trueに設定されています。rateLimitServiceレート制限サービスのドメイン、ポート、および接続タイムアウトの設定です。「前提条件」セクションでデプロイされたレート制限サービスに基づき、設定は次のようになります:
host: ratelimit.default.svc.cluster.local port: 8081 timeout: seconds: 5limit仮想サービスルートに適用されるレート制限パラメーターです。次のフィールドが含まれます:
-
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という名前のルートに適用されることを指定します。
-
-
グローバルレート制限ルールを適用します。
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 -
「前提条件」セクションの
ratelimit-configConfigMap を編集し、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 -
クライアントから、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 -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 intactこの出力は、2 番目のリクエストがレート制限されたことを示しており、Ingress ゲートウェイのグローバルレート制限ルールが正しく設定されていることがわかります。
関連ドキュメント
-
レート制限サービスに依存せず、リソースを効率的に利用するには、ASM ローカルスロットリングを使用します。手順については、「ASM でのローカルスロットリングの設定」をご参照ください。
-
サイドカーがインジェクトされたアプリケーションサービスのインバウンドトラフィックを制限するには、グローバルスロットリングを使用します。手順については、「アプリケーションサービスのインバウンドトラフィックに対するグローバルスロットリングの設定」をご参照ください。