Service Mesh (ASM) バージョン 1.21 では、新しい負荷分散アルゴリズムであるピーク指数加重移動平均 (ピーク EWMA) が提供されています。このアルゴリズムは、静的重み、レイテンシ、エラー率、その他の要因の移動平均を計算してノードのスコアを取得し、負荷分散に適したノードを選択します。バックエンドサービスがバーストトラフィックを処理する必要がある場合、ASM はピーク EWMA 負荷分散アルゴリズムを使用して、バックエンドサービスポッドの最大負荷とリアルタイムの応答時間を考慮し、適切なポッドにトラフィックを柔軟に分散することで、バーストトラフィックをより適切に処理できます。このトピックでは、EWMA を構成および使用して、ワークロードレイテンシに基づく負荷分散を実装する方法について説明します。
背景情報
ASM は、ラウンドロビン、最小リクエスト、ランダムなど、さまざまな一般的な負荷分散アルゴリズムを提供しています。これらのアルゴリズムは、ほとんどのビジネスシナリオの要件を満たし、特定のパフォーマンスを保証できます。ただし、これらのアルゴリズムは、バックエンドサービスポッドのリアルタイムのステータスとパフォーマンスを考慮せずに、静的ルールに基づいてバックエンドサービスポッドを選択することしかできません。
たとえば、バックエンドサービスポッドのホスト上のリソースが他のアプリケーションによって占有されている場合でも、デフォルトの負荷分散アルゴリズムを使用する ASM インスタンスは、他のアイドル状態のポッドではなく、このポッドを選択します。その結果、バックエンドサービスは、より高いレイテンシでリクエストに応答するか、リクエストがタイムアウトすることさえあります。この場合、負荷分散アルゴリズムがパフォーマンスの低下したこのポッドをインテリジェントに無視し、トラフィックを他のアイドル状態のポッドにルーティングできれば、アプリケーションの全体的なエラー率と応答レイテンシを大幅に削減できます。
前提条件
バージョン 1.21 以降の ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
Container Service for Kubernetes (ACK) クラスタが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスタの追加」および「ASM インスタンスの更新」をご参照ください。
kubectl クライアントがクラスタに接続されていること。詳細については、「クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する」をご参照ください。
ピーク EWMA の使用
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[YAML から作成] をクリックします。
次のサンプルコードを入力し、[作成] をクリックします。次のサンプル YAML コードは、default ネームスペースの simple-server サービスに
PEAK_EWMA負荷分散アルゴリズムを指定しています。apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: simple-server namespace: default spec: host: simple-server.default.svc.cluster.local trafficPolicy: loadBalancer: simple: PEAK_EWMA # ASM の PEAK_EWMA 負荷分散アルゴリズムを使用します。
例
説明
この例では、simple-server アプリケーションがサーバーです。 sleep アプリケーションはテストトラフィックを送信するクライアントとして機能し、simple-server アプリケーションに基づく simple-server.default.svc.cluster.local サービスはサーバーとして機能します。このサービスには、構成の異なる 2 つのデプロイメントがあります。
simple-server-normal: このデプロイメントの応答レイテンシは 50 ms から 100 ms の範囲です。
simple-server-hight-latency: このデプロイメントの応答レイテンシは 500 ms から 2000 ms の範囲です。このデプロイメントは、サービスの一部のワークロードのレイテンシの増加をシミュレートするために使用されます。
ステップ 1:ASM インスタンスのメトリック監視を有効にする
ピーク EWMA 負荷分散アルゴリズムの利点を視覚的に示すために、この例では ASM インスタンスのメトリック監視を有効にして、ピーク EWMA 負荷分散アルゴリズムが有効になる前後のサービスの全体的な応答レイテンシの変化を観察します。メトリック監視を有効にし、Application Real-Time Monitoring Service (ARMS) にメトリックを収集する方法の詳細については、「Managed Service for Prometheus にメトリックを収集する」をご参照ください。
ステップ 2:必要な環境をデプロイする
kubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次の内容を含む sleep.yaml ファイルを作成します。
次のコマンドを実行して、sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml次の内容を含む simple.yaml ファイルを作成します。
次のコマンドを実行して、simple-server-normal アプリケーションと simple-server-high-latency アプリケーションをデプロイします。
kubectl apply -f simple.yaml
ステップ 3:デフォルトの負荷分散アルゴリズムでテストを開始する
デフォルトの負荷分散アルゴリズム LEAST_REQUEST を使用してテストを行い、ベースラインデータを生成します。
次のコマンドを実行してテストを開始します。 simple-server サービスの
/helloパスにアクセスするために 100 件のリクエストが送信されます。kubectl exec -it deploy/sleep -c sleep -- sh -c 'for i in $(seq 1 100); do time curl simple-server:8080/hello; echo "request $i done"; done'予期される出力:
hello this is port: 8080real 0m 0.06s user 0m 0.00s sys 0m 0.00s request 1 done hello this is port: 8080real 0m 0.09s user 0m 0.00s sys 0m 0.00s request 2 done ...... hello this is port: 8080real 0m 1.72s user 0m 0.00s sys 0m 0.00s request 100 doneコマンドを実行した後、[メッシュ管理] ページで目的の ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。 [cloud ASM Istio Service] タブをクリックし、次のフィルター条件を構成します。
ネームスペース:
defaultサービス:
simple-server.default.svc.cluster.localレポーター:
destinationクライアントワークロードネームスペース:
defaultクライアントワークロード:
sleepサービスワークロードネームスペース:
defaultサービスワークロード:
simple-server-normal + simple-server-high-latency
[クライアントワークロード] をクリックして、[送信元別受信リクエスト期間] セクションを表示します。

sleep アプリケーションから
simple-serverサービスへのリクエストの P50 応答レイテンシは 87.5 ms であり、P95 応答レイテンシは 2.05 秒に大幅に上昇していることがわかります。これは、simple-server-high-latencyアプリケーションの応答レイテンシが高いため、simple-server サービスの全体的な応答時間が長くなっているためです。重要上記のテスト結果は、制御された実験環境で得られた理論値です。実際の結果は、ビジネス環境によって異なる場合があります。
ステップ 4:ピーク EWMA 負荷分散アルゴリズムを構成し、テストを再実行する
simple-server サービスのピーク EWMA 負荷分散アルゴリズムを構成する宛先ルールを作成します。
ピーク EWMA の使用 の手順を参照して、次の YAML コンテンツを使用して宛先ルールを作成します。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: simple-server namespace: default spec: host: simple-server.default.svc.cluster.local trafficPolicy: loadBalancer: simple: PEAK_EWMAkubeconfig ファイルの情報に基づいて kubectl を使用して ACK クラスタに接続し、次のコマンドを実行してテストを再実行します。
kubectl exec -it deploy/sleep -c sleep -- sh -c 'for i in $(seq 1 100); do time curl simple-server:8080/hello; echo "request $i done"; done'ステップ 3 を参照してテスト結果を観察します。結果は、P90、P95、および P99 のレイテンシが大幅に減少していることを示しています。これは、ピーク EWMA 負荷分散アルゴリズムが simple-server-high-latency ワークロードのレイテンシが高いことを検出し、負荷分散の重みを減らすためです。その結果、より多くのリクエストがレイテンシの低い simple-server-normal にルーティングされます。 simple-server サービスの観点からは、リクエストの全体的なレイテンシが大幅に削減されます。
