フラッシュセールなどのシナリオでは、トラフィックが瞬時にピークに達し、システムがサポートする最大負荷を超える可能性があります。その結果、多数の呼び出しが処理待ちになり、システムが応答しなくなります。サービスメッシュ(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インスタンスへのアプリケーションのデプロイをご参照ください。
Istioゲートウェイと仮想サービスが作成されています。詳細については、Istioゲートウェイの管理および仮想サービスの管理をご参照ください。
トラフィック生成ツール 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サービスに転送されます。スロットリングルールを設定すると、上記のパス宛てのリクエストはトラフィックレート制限の対象となります。
ローカルスロットリングルールを作成します。
ASMコンソールにログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、ビジネス要件に基づいて次のパラメーターを設定し、[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"}と入力します。
次のYAMLコードは、前の図で指定されたローカルスロットリングルール設定を示しています。
詳細設定を行わない場合、スロットリング中にデフォルトのレスポンスが返されます。
詳細設定を行った場合は、詳細設定セクションで指定したカスタムレスポンスが返されます。
hey で次のコマンドを実行して、継続的なストレステストトラフィックを生成します。
hey -host bf2.example.com -c 10 -n 100000 http://<イングレスゲートウェイのIPアドレス>/productpagehey -host bf2.example.com -c 10 -n 100000 http://<イングレスゲートウェイのIPアドレス>/nginx次のコマンドを実行して、イングレスゲートウェイの /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サービスへのアクセスが調整されていることを示しています。
次のコマンドを実行して、イングレスゲートウェイの /nginx パスにアクセスします。
curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/nginx -v返された結果には 429 エラーコードが含まれていません。これは、アクセスが調整されていないことを示しています。
シナリオ 2:イングレスゲートウェイで特定のドメイン名と特定のポートの組み合わせにスロットリングルールを設定する
ドメインとポートの組み合わせbf2.example.com:80にスロットリングルールを設定して、bf2.example.com:80のすべてのパスへのアクセスが調整されるようにします。
ローカルスロットリングルールを設定します。
ASMコンソールにログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、ビジネス要件に基づいて次のパラメーターを設定し、[OK] をクリックします。
パラメーターの設定の詳細については、ASMLocalRateLimiterフィールドの説明をご参照ください。
セクション
パラメーター
説明
[スロットリングの基本情報]
[名前空間]
ローカルスロットリングルールが有効になるワークロードが存在する名前空間。この例では、すべてのイングレスゲートウェイが istio-system 名前空間にデプロイされているため、[istio-system] を選択する必要があります。
[名前]
ローカルスロットリングルール名。この例では、ingressgatewayと入力します。
[有効なワークロードのタイプ]
スロットリングが有効になるワークロードのタイプ。 [適用可能なアプリケーション] または [適用可能なゲートウェイ] を選択できます。この例では、[適用可能なゲートウェイ] を選択します。
[関連ワークロード]
[有効なワークロードのタイプ]で[適用可能なゲートウェイ]を選択した場合、Istioゲートウェイを選択して、ローカルスロットリングルールが有効になるワークロードを指定できます。このようにして、ローカルスロットリングルールが有効になるワークロードは、Istioゲートウェイに対して選択されたワークロードと同じになります。 この例では、[bookinfo-gateway] を選択します。
[スロットリングルールのリスト]
[ゲートウェイドメイン名]
Istioゲートウェイで宣言されているドメイン名。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[bf2.example.com] を選択します。
[ゲートウェイポート]
Istioゲートウェイで宣言されているポート。指定されたポートとドメイン名によって、スロットリングルールが適用される場所が決まります。この例では、[80] を選択します。
[仮想サービスのルートと一致]
Istioゲートウェイを定義する仮想サービスで宣言されているルート。スロットリングルールは、仮想サービスで宣言されている指定されたルートに有効になります。この例では、ルートは選択されていません。これは、スロットリングルールが、指定されたドメイン名とポート宛てのすべてのルートに有効になることを示しています。
[スロットリング設定]
ローカルスロットリング検出の時間枠の長さと、時間枠内で許可されるリクエスト数を指定します。時間枠内で送信されたリクエスト数が上限を超えると、リクエストに対してスロットリングがトリガーされます。この例では、次の設定を使用します。
[スロットリング検出の時間枠] を [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 -vHTTP/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 サービスに転送されます。
ローカルスロットリングルールを設定します。
ASMコンソールにログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理]ページで、ASMインスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[作成]をクリックします。
[作成]ページで、ビジネス要件に基づいて次のパラメーターを設定し、[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を超えることができないことを示しています。

次の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 -vHTTP/1.1 429 Too Many Requestsメッセージが返されます。これは、ratelimit: trueヘッダーを含むイングレスゲートウェイの/nginxパスへのアクセスリクエストが調整されていることを示しています。次のコマンドを実行して、
ratelimit: trueヘッダーを含まないリクエストを送信することにより、イングレスゲートウェイの/nginxパスにアクセスします。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 エラーコードが含まれていません。これは、アクセスが調整されていないことを示しています。