すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:KnativeでMSE Ingressを使用して自動スケーリングを実装する

最終更新日:Nov 15, 2024

マイクロサービスアーキテクチャを含むシナリオでは、Knativeサービスのトラフィック分散およびルーティングにmicroservices Engine (MSE) Ingressを使用することを推奨します。 MSE Ingressは完全に管理され、O&Mフリーで、リクエストに基づく正確な自動スケーリングをサポートし、個々のポッドのリクエストの同時実行を正確に制御します。 このソリューションは、多数のクラウドネイティブ分散アプリケーションがデプロイされているシナリオでのトラフィック管理要件を効果的に満たします。

前提条件

仕組み

個々のポッドのスループットは限られています。 複数のリクエストが同じポッドにルーティングされると、対応するサーバーが過負荷になる可能性があります。 したがって、各ポッドによって処理される同時リクエストの数を正確に制御する必要があります。 例えば、人工知能生成コンテンツ (AIGC) シナリオでは、単一の要求が大量のGPUリソースを占有することがある。 各ポッドによって処理される同時リクエストの数を厳密に制限する必要があります。 MSE Ingressを使用することで、Knativeはポッドを正確にスケールアウトして、多数のクラウドネイティブ分散アプリケーションがデプロイされているシナリオでトラフィック管理要件を満たすことができます。

次の図では、MultidimPodAutoscaler (MPA) は、MSE Ingressからの同時リクエストの合計数を取得し、リクエストの処理に必要なポッドの数を計算してから、ポッドをスケーリングします。 これにより、ロード対応の自動スケーリングが実装されます。 MSE Ingressは、ルーティングのルールと条件に基づいて、リクエストをさまざまなサービスまたはバージョンに正確にルーティングできます。

image.png

ステップ1: MSE Ingressのデプロイ

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [ネイティブ] を選択します。

  3. On theコンポーネントタブをクリックします。Knativeのデプロイ、選択MSE[Gateway] パラメーターを指定し、プロンプトに従ってデプロイを終了します。

手順2: MSE Ingressを使用してサービスにアクセス

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [ネイティブ] を選択します。

  3. Knativeページの [サービス] タブで、名前空間既定に設定し、[テンプレートから作成] をクリックして、次のYAMLコンテンツをテンプレートエディターにコピーし、[作成] をクリックします。

    テンプレートは、helloworld-goという名前のサービスを作成します。

    重要

    {REGION-ID} をクラスターが存在するリージョンに置き換えて、Knative Serviceが期待どおりにイメージをプルできるようにします。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev # Scale pods based on MSE metrics. Pods can be scaled to zero. 
            autoscaling.knative.dev/max-scale: '20' # Set the maximum number of pods allowed to 20. 
        spec:
          containerConcurrency: 5 # Set the maximum number of concurrent requests that each pod can process to 5. 
          containers:
          - image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 # {REGION-ID} is the region where your cluster resides, such as cn-hangzhou.
            env:
            - name: TARGET
              value: "Knative"

    サービスの [ステータス] 列に [作成済み] が表示された場合、サービスがデプロイされます。

  4. [サービス] ページで、helloworld-goサービスのドメイン名とゲートウェイIPアドレスをそれぞれ [デフォルトドメイン] 列と [ゲートウェイ] 列に記録します。

  5. 次のコマンドを実行して、helloworld-go Serviceにアクセスします。

    curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX # Specify the actual gateway IP address and domain name that you obtained.

    期待される出力:

    Hello Knative!

ステップ3: 同時リクエスト数に基づいて自動スケーリングを実行する

  1. 負荷テストツールをインストールします。

    heyの詳細については、「Hey」をご参照ください。

  2. サービスでストレステストを実行するには、次のコマンドを実行します。

    # Send 100,000 requests, and set the concurrency to 50 and request timeout period to 180 seconds. 
    hey -n 100000 -c 50 -t 180 -host "helloworld-go.default.example.com" "http://8.141.XX.XX"

    期待される出力:

    Summary:
      Total:        86.0126 secs
      Slowest:      0.1672 secs
      Fastest:      0.0276 secs
      Average:      0.0337 secs
      Requests/sec: 1162.6199
      
      Total data:   1500000 bytes
      Size/request: 15 bytes
    
    Response time histogram:
      0.028 [1]     |
      0.042 [95291] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.056 [4573]  |■■
      0.069 [64]    |
      0.083 [19]    |
      0.097 [2]     |
      0.111 [0]     |
      0.125 [0]     |
      0.139 [18]    |
      0.153 [23]    |
      0.167 [9]     |
    
    
    Latency distribution:
      10% in 0.0294 secs
      25% in 0.0305 secs
      50% in 0.0327 secs
      75% in 0.0367 secs
      90% in 0.0386 secs
      95% in 0.0405 secs
      99% in 0.0433 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:   0.0000 secs, 0.0276 secs, 0.1672 secs
      DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs
      req write:    0.0000 secs, 0.0000 secs, 0.0009 secs
      resp wait:    0.0336 secs, 0.0276 secs, 0.1671 secs
      resp read:    0.0000 secs, 0.0000 secs, 0.0009 secs
    
    Status code distribution:
      [200] 100000 responses

    出力は、100,000が送信されたことを示す。 すべての要求が処理されます。

  3. 次のコマンドを実行して、ポッドのスケーリングを照会します。

    説明

    このコマンドは、手動で終了するまで永続的に実行されます。 Ctrl + Cを押してコマンドを終了します。

    kubectl get pods --watch

    image.png

手順4 (オプション): サービスのモニタリングデータの表示

Knativeは、すぐに使えるモニタリング機能を提供します。 [Knative] ページで、[モニタリングダッシュボード] タブをクリックし、helloworld-go Serviceのモニタリングデータを表示します。 Knativeダッシュボードを有効にする方法の詳細については、「PrometheusのマネージドサービスでKnativeダッシュボードを表示する」をご参照ください。