セールスプロモーションなどのイベントにより、トラフィックが急増することがあります。これらの急増は、システムの最大負荷を超え、呼び出しのバックログが大量に発生し、システム全体がフリーズする可能性があります。Service Mesh (ASM) は、ローカル速度制限機能を提供します。この機能により、ゲートウェイ上のトラフィックを制限して、ご利用のシステムを保護できます。このトピックでは、イングレスゲートウェイのローカル速度制限を設定する方法について説明します。
前提条件
ASM インスタンスが作成されており、次の要件を満たしていること:
商用版 ASM インスタンス (Professional または Ultimate Edition) を使用する場合、インスタンスのバージョンは 1.11.5.30 以降である必要があります。詳細については、「ASM インスタンスのアップグレード」をご参照ください。
Standard 版 ASM インスタンスを使用する場合、インスタンスのバージョンは 1.9 以降である必要があります。Istio のネイティブのレート制限機能のみを使用して、ローカル速度制限を実装できます。参照ドキュメントは Istio のバージョンによって異なります。最新の Istio バージョンでローカル速度制限を設定する方法の詳細については、「Envoy を使用したレート制限の有効化」をご参照ください。
イングレスゲートウェイがデプロイされていること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
bookinfo および nginx サービスが作成されていること。このトピックでは、bookinfo サービスは default 名前空間にデプロイされ、nginx サービスは foo 名前空間にデプロイされます。bookinfo サービスの作成方法の詳細については、「ASM インスタンスに関連付けられたクラスターへのアプリケーションのデプロイ」をご参照ください。
ゲートウェイルールと仮想サービスが作成されていること。詳細については、「ゲートウェイルールの管理」および「仮想サービスの管理」をご参照ください。
hey トラフィック生成ツールがインストールされていること。詳細については、「hey」をご参照ください。
適用対象
ASM のローカル速度制限機能は、ASM ゲートウェイおよびサイドカーがインジェクトされたアプリケーションサービスに適用されます。
シナリオ例の説明
このトピックでは、Bookinfo と Nginx サービスを例として、ゲートウェイとサービスの速度制限の使用方法を説明します。Nginx サービスは、速度制限ルールの範囲を検証するために、foo 名前空間に個別にデプロイされます。
シナリオ 1:単一の仮想サービスルートに対する速度制限ルールの設定
bf2.example.com:80 のドメイン名とポートの組み合わせに対して、productpage-route-name1 ルートの速度制限ルールを設定します。productpage-route-name1 は、「前提条件」セクションで作成した bookinfo 仮想サービスのルート項目です。これは /productpage、/static、/login、/logout などのリクエストパスにマッチし、マッチしたリクエストを productpage サービスに転送します。ルールを設定すると、これらのパスへのトラフィックレートが制限されます。
ローカル速度制限ルールを作成します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、対象の ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで [作成] をクリックします。
[作成] ページで、必要に応じて次のパラメーターを設定し、[OK] をクリックします。
設定項目の詳細については、「ASMLocalRateLimiter CRD リファレンス」をご参照ください。
設定エリア
設定項目
説明
基本的な速度制限情報
名前空間
ローカルレート制限ルールが適用されるワークロードの名前空間。すべての ASM ゲートウェイは istio-system 名前空間にデプロイされるため、この例では [istio-system] を選択する必要があります。
名前
ローカル速度制限設定のカスタム名。この例では、ingressgateway と入力します。
有効なワークロードタイプ
速度制限が有効になるワークロードのタイプ。[アプリケーションサービスに適用] または [ゲートウェイに適用] を選択できます。この例では、[ゲートウェイに適用] を選択します。
関連ワークロード
有効なワークロードタイプをゲートウェイに設定した場合、[ゲートウェイルールの選択] オプションを使用してワークロードを関連付けることができます。ローカルレート制限設定は、選択したゲートウェイルールと同じゲートウェイワークロードに関連付けられます。この例では、[bookinfo-gateway] を選択します。
速度制限ルールリスト
ゲートウェイドメイン名
ゲートウェイルールで宣言されたドメイン名。レート制限ルールは、指定されたポートとドメイン名の組み合わせに対して有効になります。この例では、[bf2.example.com] を選択します。
ゲートウェイポート
ゲートウェイルールで宣言されたポート。速度制限ルールは、指定されたポートとドメイン名の組み合わせに適用されます。この例では、[80] を選択します。
仮想サービスルートのマッチング
ゲートウェイルールに関連付けられている仮想サービスで宣言されたルートを選択します。速度制限ルールは、指定された仮想サービスルートに対して有効になります。この例では、[productpage-route-name1] を選択します。
速度制限の設定
トークンバケットアルゴリズムの検出タイムウィンドウの長さと、そのウィンドウ内で許可されるリクエスト数を指定します。タイムウィンドウ内で送信されたリクエスト数が許可された数を超えると、リクエストは速度制限されます。この例では、次の設定を使用します:
[速度制限検出のタイムウィンドウ] を [1 秒] に設定します。
[タイムウィンドウ内で許可されるリクエスト数] を [10] に設定します。
上記の設定は、1 秒以内にこのサービスのワークロードに 10 件を超えるリクエストを送信できないことを示します。
詳細オプション
[詳細設定の表示] をクリックして、速度制限が発生した際の高度な動作を指定します。必要に応じて詳細オプションを設定できます。この例では、[カスタムの速度制限応答本文] フィールドに
{"ret_code": xxx,"message": "Your request be limited"}と入力します。次の YAML ファイルは、ローカル速度制限の設定を示しています。
詳細オプションを設定しない場合、速度制限がトリガーされるとデフォルトの応答が返されます。
詳細オプションを設定すると、速度制限がトリガーされたときにカスタム応答が返されます。
hey ツールで、次のコマンドを実行して、継続的に大量のトラフィックを生成します。
hey -host bf2.example.com -c 10 -n 100000 http://<ASM gateway IP address>/productpagehey -host bf2.example.com -c 10 -n 100000 http://<ASM gateway IP address>/nginx次のコマンドを実行して、ゲートウェイの /productpage パスにアクセスします。
curl -H 'host: bf2.example.com' http://<ASM gateway IP address>/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 サービスへのアクセスが速度制限されていることを示しています。
次のコマンドを実行して、ゲートウェイの /nginx パスにアクセスします。
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v応答に 429 ステータスコードが含まれていません。これは、アクセスが速度制限されていないことを示します。
シナリオ 2:ゲートウェイ上のドメイン名とポートの組み合わせに対する速度制限ルールの設定
bf2.example.com:80 のドメイン名とポートの組み合わせに対して速度制限ルールを設定します。これにより、この組み合わせのすべてのパスへのトラフィックが制限されます。
速度制限ルールを設定します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、対象の ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで [作成] をクリックします。
[作成] ページで、必要に応じて次のパラメーターを設定し、[OK] をクリックします。
設定項目の詳細については、「ASMLocalRateLimiter CRD リファレンス」をご参照ください。
設定エリア
設定項目
説明
基本的な速度制限情報
名前空間
ローカルレート制限ルールが有効になるワークロードの名前空間。すべての ASM ゲートウェイは istio-system 名前空間にデプロイされるため、この例では [istio-system] を選択する必要があります。
名前
ローカル速度制限設定のカスタム名。この例では、ingressgateway と入力します。
有効なワークロードタイプ
速度制限が有効になるワークロードのタイプ。[アプリケーションサービス] または [ゲートウェイ] を選択できます。この例では、[ゲートウェイ] が選択されています。
関連ワークロード
有効なワークロードタイプをゲートウェイに適用するように設定した場合、[ゲートウェイルールの選択] オプションを使用してワークロードを関連付けることができます。ローカルレート制限設定は、選択したゲートウェイルールと同じゲートウェイワークロードに関連付けられます。この例では、[bookinfo-gateway] を選択します。
速度制限ルールリスト
ゲートウェイドメイン名
ゲートウェイルールで宣言されたドメイン名を選択します。レート制限ルールは、指定されたポートとドメイン名の組み合わせに対して有効になります。この例では、[bf2.example.com] を選択します。
ゲートウェイポート
ゲートウェイルールで宣言されたポートを選択します。速度制限ルールは、指定されたポートとドメイン名の組み合わせに対して有効になります。この例では、[80] を選択します。
仮想サービスルートのマッチング
ゲートウェイルールに関連付けられた仮想サービスで宣言されているルートを選択します。速度制限ルールは、指定された仮想サービスルートに対して有効になります。この例では、ルートを選択しません。これは、速度制限ルールが指定されたドメイン名とポートの下のすべてのルートで有効になることを示します。
速度制限の設定
トークンバケットアルゴリズムの検出タイムウィンドウの長さと、そのウィンドウ内で許可されるリクエスト数を指定します。タイムウィンドウ内で送信されたリクエスト数が許可された数を超えると、リクエストは速度制限されます。この例では、次の設定を使用します:
[スロットリング検出の時間枠] を 1 秒 に設定します。
[タイムウィンドウ内で許可されるリクエスト数] を [10] に設定します。
上記の設定は、1 秒以内にこのサービスのワークロードに 10 件を超えるリクエストを送信できないことを示します。
次の YAML ファイルは、ローカル速度制限の設定を示しています。
hey ツールで、次のコマンドを実行して、継続的に大量のトラフィックを生成します。
hey -host bf2.example.com -c 10 -n 100000 http://${ASM_GATEWAY_IP}/nginx次のコマンドを実行して、ゲートウェイの /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 リクエストパスにマッチし、マッチしたリクエストを nginx サービスに転送します。
速度制限ルールを設定します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、対象の ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで [作成] をクリックします。
[作成] ページで、必要に応じて次のパラメーターを設定し、[OK] をクリックします。
設定項目の詳細については、「ASMLocalRateLimiter CRD リファレンス」をご参照ください。
設定エリア
設定項目
説明
基本的な速度制限情報
名前空間
ローカルレート制限設定の名前空間は、レート制限が適用されるワークロードの名前空間に設定する必要があります。すべての ASM ゲートウェイは istio-system 名前空間にデプロイされるため、この例では [istio-system] を選択する必要があります。
名前
ローカル速度制限設定のカスタム名。この例では、ingressgateway と入力します。
有効なワークロードタイプ
速度制限が有効になるワークロードのタイプ。[適用可能なアプリケーション] または [適用可能なゲートウェイ] を選択できます。この例では、[適用可能なゲートウェイ] を選択します。
関連ワークロード
[有効なワークロードタイプ] を [ゲートウェイ] に設定した場合、[ゲートウェイルールの選択] オプションを使用してワークロードを関連付けることができます。ローカルレート制限設定は、選択したゲートウェイルールと同じゲートウェイワークロードに関連付けられます。この例では、[bookinfo-gateway] を選択します。
速度制限ルールリスト
ゲートウェイドメイン名
ゲートウェイルールで宣言されたドメイン名を選択します。指定されたポートとこのドメイン名の組み合わせによって、レート制限ルールが適用される場所が決まります。この例では、[bf2.example.com] を選択します。
ゲートウェイポート
ゲートウェイルールで宣言されたポートを選択します。速度制限ルールは、指定されたポートとドメイン名の組み合わせに適用されます。この例では、[80] を選択します。
仮想サービスルートのマッチング
ゲートウェイルールに関連付けられている仮想サービスのルートを選択します。速度制限ルールは、指定された仮想サービスルートに適用されます。この例では、[nginx-route-name1] を選択します。
リクエストプロパティのマッチング
速度制限設定を有効にするためのリクエストマッチングルールを指定します。この例では、次の設定を使用します:
[マッチング属性] で、[特定のリクエストヘッダー] を選択します。
[リクエストヘッダー名] を ratelimit に設定します。
[マッチング方法] で、[完全一致] を選択します。
[マッチングする内容] に true と入力します。
速度制限の設定
トークンバケットアルゴリズムの検出タイムウィンドウの長さと、そのウィンドウ内で許可されるリクエスト数を指定します。タイムウィンドウ内で送信されたリクエスト数が許可された数を超えると、リクエストは速度制限されます。この例では、次の設定を使用します:
[速度制限検出のタイムウィンドウ] を [1 秒] に設定します。
[タイムウィンドウ内で許可されるリクエスト数] を [10] に設定します。
上記の設定は、1 秒以内にこのサービスのワークロードに 10 件を超えるリクエストを送信できないことを示します。
次の YAML ファイルは、ローカル速度制限の設定を示しています。
hey ツールで、次のコマンドを実行して、継続的に大量のトラフィックを生成します。すべてのリクエストは、速度制限をトリガーするために
ratelimit: trueヘッダーを付与します。hey -host bf2.example.com -H 'ratelimit: true' -c 10 -n 10000 http://${ASM_GATEWAY_IP}/nginx次のコマンドを実行して、ゲートウェイの
/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パスへのリクエストが速度制限されていることを示します。次のコマンドを実行して、ゲートウェイの
/nginxパスにアクセスしますが、ratelimit: trueヘッダーは付けません。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v応答に 429 ステータスコードが含まれていません。これは、
ratelimit: trueヘッダーのないリクエストは速度制限の影響を受けないことを示します。
関連操作
速度制限設定の削除とアクセスの再開
速度制限ルールを削除します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、対象の ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[トラフィック保護とスケジューリング] ページで、削除したい速度制限ルールを見つけ、[操作] 列の [削除] をクリックします。[確認] ダイアログボックスで、[OK] をクリックします。
次のコマンドを実行して、ゲートウェイの
/nginxパスにアクセスします。curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v応答に 429 ステータスコードが含まれていません。これは、アクセスが速度制限されていないことを示します。