RateLimitingPolicy を使用すると、Service Mesh(ASM)トラフィックスケジューリングスイートでポリシーを事前に設定できます。ASMインスタンス内のサービスのグローバルトラフィックのスロットリングを宣言的に設定できます。このトピックでは、RateLimitingPolicy のフィールドについて説明します。
例
次の設定は、Kubernetesクラスター内の HTTPBin サービスでスロットリングが実行されることを示しています。スロットリングに使用されるトークンバケットには、30秒ごとに 2 つのトークンが補充されます。つまり、30秒ごとに 2 つのリクエストが許可されます。トークンバケットの最大トークン数は 2 で、これはバーストトラフィックが許可されないことを示しています。リクエストは、user_id リクエストヘッダーによってグループ化されます。システムは、異なる user_id リクエストヘッダーを持つリクエストに対して個別にスロットリングを実行するかどうかを判断し、異なる user_id リクエストヘッダーを持つリクエストは、それぞれのトークンバケット内のトークンを消費します。
apiVersion: istio.alibabacloud.com/v1
kind: RateLimitingPolicy
metadata:
name: ratelimit
namespace: istio-system
spec:
rate_limiter:
bucket_capacity: 2
fill_amount: 2
parameters:
interval: 30s
limit_by_label_key: http.request.header.user_id
selectors:
- agent_group: default
control_point: ingress
service: httpbin.default.svc.cluster.localRateLimitingPolicy フィールドの説明
RateLimitingPolicy は、ASMトラフィックスケジューリングスイートにおけるグローバルスロットリングポリシーを定義します。スロットリングが有効になるサービス、スロットリングポリシーの実行時パラメーター、およびスロットリングに使用されるトークンバケットの属性を指定します。
RateLimitingPolicySpec
RateLimitingPolicySpec は、RateLimitingPolicy のコア設定であり、spec フィールドに対応します。
フィールド | タイプ | 必須 | 説明 |
rate_limiter | はい | スロットリングポリシーを実行するリミッターの設定。 |
RateLimiter
RateLimiter は、リミッターのパラメーターと、リミッターが使用するトークンバケットを指定します。
フィールド | タイプ | 必須 | 説明 |
fill_amount | double | はい | トークンバケットに毎回補充されるトークンの数。このフィールドは、RateLimiterParameters の interval フィールドと組み合わせて使用して、リクエストのスロットリングを実装できます。 |
bucket_capacity | double | はい | リミッターが使用するトークンバケットの最大容量。リクエストレートがトークンバケットの補充レートよりも低い場合、トークンバケット内のトークン数は、最大容量 |
parameters | はい | リミッターの設定パラメーター。 | |
request_parameters | いいえ | リミッターがリクエストに対して実行する操作の設定。 | |
selectors | []Selector | はい | スロットリングが有効になる特定のリクエスト。 |
RateLimiterParameters
RateLimiterParameters は、リミッターの設定パラメーターを指定します。
フィールド | タイプ | 必須 | 説明 |
interval | Duration | はい | リミッターが毎回トークンバケットを補充する間隔。たとえば、値 |
limit_by_label_key | string | いいえ | スロットリングポリシーがリクエストをグループ化するために使用するリクエストラベル。このフィールドを指定すると、異なるラベルを持つリクエストに対して個別にスロットリングが実行され、異なるラベルを持つリクエストは独自のトークンバケットを使用します。リクエストのラベルを指定する方法の詳細については、「リクエストラベルの説明」をご参照ください。 |
continuous_fill | bool | いいえ | リミッターがトークンバケットをスムーズに補充するかどうかを指定します。このフィールドが true に設定されている場合、リミッターは、interval フィールドで指定された期間が経過した直後に一度に一定数のトークンを補充するのではなく、interval フィールドで指定された期間内に一定数のトークンを継続的に補充します。補充されるトークン数は、fill_amount フィールドで指定されます。デフォルト値:true。 |
delay_initial_fill | bool | いいえ | スロットリングポリシーが有効になったときにトークンバケットの補充を遅延させるかどうかを指定します。このフィールドが |
lazy_sync | いいえ | リミッターの遅延同期機能の設定。 | |
max_idle_time | Duration | いいえ | このフィールドは、 |
RateLimiterRequestParameters
RateLimiterRequestParameters は、リミッターがリクエストに対して操作を実行するためのカスタム設定を指定します。
フィールド | タイプ | 必須 | 説明 |
denied_response_status_code | int | いいえ | このフィールドを使用して、スロットリングが発生したときに返されるデフォルトの HTTP 429 ステータスコードをオーバーライドできます。 |
tokens_label_key | string | いいえ | このフィールドを使用して、リクエストによって消費されるトークン数をオーバーライドできます。リクエストが指定されたラベルを持っている場合、ラベルの数値は消費されるトークン数を示します。 |
RateLimiterParametersLazySync
RateLimiterParametersLazySync は、リミッターの遅延同期機能に関連する設定パラメーターを指定します。遅延同期は、ASMトラフィックスケジューリングスイートのリミッターの機能です。遅延同期が有効になっていない場合、Envoy はリモートエージェントとリクエストごとに同期して、スロットリングが必要かどうかを判断します。これにより、単一サービスの正確なスロットリングが可能になります。遅延同期が有効になっている場合、Envoy はローカルでスロットリングの決定を行い、リモートエージェントと定期的に同期します。これにより、スロットリングの精度は低下しますが、スロットリングの決定が高速化され、リクエストレイテンシが短縮されます。
フィールド | タイプ | 必須 | 説明 |
enabled | bool | いいえ | 遅延同期を有効にするかどうかを指定します。デフォルト値:false。 |
num_sync | int | いいえ | Envoy が interval フィールドで指定された期間内に、スロットリングが実行されたリクエスト数をリモートエージェントと同期させる回数。デフォルト値:4。 |
リクエストラベルの説明
ASMトラフィックスケジューリングスイートでは、リクエストラベルは、リクエストの特性または分類を示すキーと値のペアです。ラベルに基づいて、異なるリクエストに対してスケジューリングを実行できます。たとえば、特定のリクエストラベルに従ってリクエストをグループ化し、各リクエストグループのスロットリングに個別のトークンバケットを使用できます。リクエストのラベルは、リクエストメタデータや Baggage ヘッダーなど、複数のソースから取得できます。
リクエストメタデータ
各 HTTP リクエストの基本メタデータは、リクエストの一連のラベルに自動的に変換されます。HTTP リクエストのメタデータとリクエストラベル間のマッピング:
http.method:HTTP リクエストのメソッド。例:
POST。http.flavor:HTTP リクエストのプロトコルバージョン。例:
1.1。http.host:HTTP リクエストのホスト。例:
httpbin.default.svc.cluster.local。http.target:HTTP リクエストのパス名。例:
/get。http.request_content_length:HTTP リクエストボディのサイズ。例:
431。http.request.header.header_name:HTTP リクエストヘッダー内の
header_nameという名前のリクエストヘッダー。たとえば、http.request.header.user_agent は、user_agentリクエストヘッダーを示します。
Baggage
Baggage は、OpenTelemetry によって開発された標準化されたメカニズムであり、分散システムのコールチェーン全体でコンテキスト情報をプロセス間で転送します。baggage という名前の HTTP ヘッダーを HTTP ヘッダーに追加できます。baggage ヘッダーの値は、キーと値のペア形式です。baggage ヘッダーを使用して、テナント ID、トレース ID、セキュリティ資格情報などのコンテキストデータを転送できます。このようにして、コードを変更することなく、トレース分析機能とログ関連付け機能を使用できます。例:
baggage: userId=alice,isProduction=falseリクエストが Baggage ヘッダーを持っている場合、Baggage ヘッダー内の各キーと値のペアは、同じ名前のリクエストラベルに自動的に変換されます。たとえば、前の例の Baggage ヘッダーは、userId: alice と isProduction: false の 2 つのリクエストラベルに変換されます。