ASMAdaptiveConcurrency カスタムリソース定義 (CRD) は、サンプリングされたリクエストデータに基づいて、サービスに許可される同時リクエストの最大数を動的に調整できます。 同時リクエスト数がサービスでサポートされる最大値を超えると、サービスを保護するために超過リクエストは拒否されます。 このトピックでは、ASMAdaptiveConcurrency CRD を使用してアダプティブ同時実行制御を実装する方法について説明します。
前提条件
バージョン 1.12.4.19 以降の サービスメッシュ (ASM) インスタンスが作成されていること。 詳細については、「ASM インスタンスを作成する」をご参照ください。
クラスタが ASM インスタンスに追加されていること。 詳細については、「ASM インスタンスにクラスタを追加する」をご参照ください。
kubectl クライアントがクラスタに接続されていること。 詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」をご参照ください。
背景情報
負荷容量を超えた場合、サービスは超過リクエストを拒否することが想定されています。 これにより、他の連鎖反応を防ぎます。 ASM インスタンスの宛先ルールを構成して、基本的なサーキットブレーカーを実装できます。 保留中のリクエストの特定の数など、サーキットブレーカーをトリガーするためのしきい値を指定する必要があります。 ASM インスタンスのデータプレーンへのアクセスリクエスト数がしきい値を超えると、超過リクエストは拒否されます。ただし、実際のシナリオでは、サービスの負荷容量を正確に見積もることは困難です。
ASMAdaptiveConcurrency CRD は、アダプティブ同時実行制御アルゴリズムを使用して、サンプルレイテンシと計算された最小レイテンシを定期的に比較し、一連の計算を実行することにより、サービスの同時実行制限を動的に調整します。 これにより、同時実行制限はサービスの負荷容量に近くなり、超過リクエストは拒否されます。 リクエストが拒否された場合、HTTP ステータスコード 503 とエラーメッセージ reached concurrency limit が返されます。
最小ラウンドトリップ時間 (MinRTT) の定期的な計算中、接続数は min_concurrency パラメーターで指定された小さな値に制限されます。 サービスの ASMAdaptiveConcurrency CRD を作成した後、宛先ルールを作成してサービスの再試行機能を有効にすることをお勧めします。 これにより、MinRTT 計算中に拒否されたリクエストは、サイドカープロキシの再試行に基づいて可能な限り処理できます。
手順 1:サンプルアプリケーションをデプロイする
testserver アプリケーションと gotest アプリケーションをデプロイします。 testserver アプリケーションの負荷容量を 500 の同時リクエストに設定します。 同時実行制限を超えるリクエストは、処理のためにキューに入れられます。 各リクエストの処理に必要な時間を 1000 ミリ秒に設定します。 gotest アプリケーションの各レプリカが一度に 200 リクエストを開始するように設定します。
testserver アプリケーションをデプロイします。
次の内容を含む testserver.yaml ファイルを作成します。
-mパラメーターは、アプリケーションがサポートする同時リクエストの最大数を指定します。-tパラメーターは、各リクエストの処理に必要な時間を指定します。次のコマンドを実行して、testserver アプリケーションをデプロイします。
kubectl apply -f testserver.yaml
testserver アプリケーションに testserver という名前のサービスをデプロイします。
次の内容を含む testservice.yaml ファイルを作成します。
次のコマンドを実行して、testserver サービスをデプロイします。
kubectl apply -f testservice.yaml
gotest アプリケーションをデプロイします。
次の内容を含む gotest.yaml ファイルを作成します。
次のコマンドを実行して、gotest アプリケーションをデプロイします。
kubectl apply -f gotest.yaml
手順 2:ASMAdaptiveConcurrency CRD を作成する
kubectl を使用して ASM インスタンスに接続します。 詳細については、「コントロールプレーンで kubectl を使用して Istio リソースにアクセスする」をご参照ください。
adaptiveconcurrency.yaml ファイルを作成し、以下の内容を記述します。
次のコマンドを実行して、ASMAdaptiveConcurrency CRD を作成します。
kubectl apply -f adaptiveconcurrency.yaml
手順 3:Managed Service for Prometheus を有効にする
同時実行コントローラーの実行状態を理解し、パラメーターを最適化するために、アダプティブ同時実行制御に関連するメトリックを Managed Service for Prometheus にエクスポートできます。 Managed Service for Prometheus コンソールで同時実行コントローラーの実行状態を確認できます。
Managed Service for Prometheus を有効にします。 詳細については、「Managed Service for Prometheus を使用する」をご参照ください。
Managed Service for Prometheus が testserver サービスのデータを取得できるように、クラスタで ServiceMonitor を構成します。
次の内容を含む servicemonitor.yaml ファイルを作成します。
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: testserver-envoy-metrics namespace: default spec: endpoints: - interval: 5s path: /stats/prometheus port: metrics namespaceSelector: any: true selector: matchLabels: app: testserverkubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行して ServiceMonitor を作成します。
kubectl apply -f servicemonitor.yaml
手順 4:ASMAdaptiveConcurrency CRD が有効になっていることを確認する
gotest アプリケーションのレプリカ数を 5 に設定します。
gotest アプリケーションのレプリカは一度に 200 リクエストを開始します。 アプリケーションの 5 つのレプリカは、合計で一度に 1,000 リクエストを開始します。
ACK コンソール にログインします。 左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、クラスタの名前をクリックするか、詳細[操作] 列の をクリックします。 クラスタの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] ページで、[名前空間] を default に設定し、gotest アプリケーションの [操作] 列で gotest を選択します。
[YAML の編集] ダイアログボックスで、
replicasを5に設定し、[更新] をクリックします。
次の JSON ファイルをアップロードして、Grafana ダッシュボードをインポートします。 インポートされたダッシュボードで同時実行コントローラーの実行状態を確認できます。 詳細については、「ARMS ドキュメント」をご参照ください。
ダッシュボードで、ASMAdaptiveConcurrency CRD が存在するクラスタを選択します。 [サービス] パラメーターを testserver に、[ポッド] パラメーターを ALL に設定します。
gotest アプリケーションは testserver サービスに 1,000 リクエストを開始しますが、testserver サービスによって処理される同時リクエストの数は 500 未満です。 これは、ASMAdaptiveConcurrency CRD が有効になっていることを示しています。