ASM トラフィックスケジューリングスイートの ConcurrencyLimitingPolicy 機能を使用して、サービスに送信される同時リクエスト数 (つまり、処理中のリクエスト数) を制限し、サービスの過負荷を回避できます。このポリシーは、処理中のリクエスト数を記録し、数が指定されたしきい値を超えると新しいリクエストを拒否します。このトピックでは、ConcurrencyLimitingPolicy を使用して同時リクエスト数を制限する方法について説明します。
前提条件
コンテナサービス Kubernetes (ACK) マネージドクラスタが ASM インスタンスに追加され、ASM インスタンスのバージョンが V1.21.6.97 以降であること。詳細については、「ASM インスタンスへのクラスタの追加」をご参照ください。
ACK クラスタのデフォルトの名前空間で、自動サイドカープロキシインジェクションが有効になっていること。詳細については、「グローバル名前空間の管理」をご参照ください。
kubectl を使用して ACK クラスタに接続していること。詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」をご参照ください。
ASM トラフィックスケジューリングスイートが有効になっていること。詳細については、「ASM トラフィックスケジューリングスイートを有効にする」をご参照ください。
HTTPBin アプリケーションがデプロイされ、ゲートウェイ経由で sleep サービスからアクセスできること。詳細については、「HTTPBin アプリケーションをデプロイする」をご参照ください。
手順 1: ConcurrencyLimitingPolicy フィールドを使用して同時実行制限ポリシーを作成する
kubectl を使用して ASM インスタンスに接続します。詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
次の内容を含む ConcurrencyLimitPolicy.yaml ファイルを作成します。
apiVersion: istio.alibabacloud.com/v1 kind: ConcurrencyLimitingPolicy metadata: name: concurrencylimit namespace: istio-system spec: concurrency_limiter: max_concurrency: 1 parameters: max_inflight_duration: 60s selectors: - service: httpbin.default.svc.cluster.local次の表に、いくつかのフィールドについて説明します。詳細については、「ConcurrencyLimitingPolicy フィールドの説明」をご参照ください。
フィールド
説明
max_concurrency
同時リクエストの最大数。この例では、このフィールドは 1 に設定されています。これは、サービスが一度に 1 つのリクエストのみ処理できることを示します。
max_inflight_duration
リクエスト処理のタイムアウト期間。クラスタ内のポッドの再起動などの予期しないイベントが原因で、ASM トラフィックスケジューリングスイートがリクエスト終了イベントの記録に失敗する可能性があります。このようなリクエストが同時実行制限アルゴリズムの判断に影響を与えないようにするために、リクエスト処理のタイムアウト期間を指定する必要があります。このタイムアウト期間の前にリクエストが応答されていない場合、システムはそのようなリクエストが処理されたと見なします。このフィールドは、リクエストの予想される最大応答時間を評価して設定できます。この例では、このフィールドは 60s に設定されています。
selectors
同時実行制限ポリシーが適用されるサービス。この例では、サービス httpbin.default.svc.cluster.local が使用されています。これは、同時実行制限ポリシーが httpbin.default.svc.cluster.local サービスに適用されることを示します。
次のコマンドを実行して、同時実行制限ポリシーを有効にします。
kubectl apply -f ConcurrencyLimitingPolicy.yaml予想される出力:
concurrencylimitingpolicy.istio.alibabacloud.com/concurrencylimit created
手順 2: 同時実行制限ポリシーが有効になっていることを確認する
次のコマンドを実行して、sleep サービスのシェルコマンドラインを開きます。
kubectl exec -it deploy/sleep -- sh次のコマンドを実行して、完了までに 30 秒かかるバックエンドからリクエストを送信し、30 秒以内に 2 番目のリクエストを送信します。
curl httpbin:8000/delay/30 -I & curl httpbin:8000 -I予想される出力:
HTTP/1.1 429 Too Many Requests date: Fri, 26 Jul 2024 13:50:55 GMT server: envoy x-envoy-upstream-service-time: 1 transfer-encoding: chunked ~ $ HTTP/1.1 200 OK server: envoy date: Fri, 26 Jul 2024 13:51:05 GMT content-type: application/json content-length: 269 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 10006 [1]+ Done curl httpbin:8000/delay/30 -I出力は、2 番目のリクエストに対して HTTP 429 ステータスコードを含む応答が返されたことを示しています。これは、同時実行制限ポリシーが有効になっていることを証明しています。
参考資料
Grafana で ConcurrencyLimitingPolicy が有効になっているかどうかを確認できます。Grafana の Prometheus インスタンスが ASM トラフィックスケジューリングスイート で構成されていることを確認する必要があります。
次の内容を Grafana にインポートして、ConcurrencyLimitingPolicy のダッシュボードを作成できます。
ダッシュボードは次のとおりです。
