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

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

最終更新日:Dec 27, 2024

マイクロサービスアーキテクチャを使用するシナリオでは、トラフィックを分散およびルーティングするために Knative で MSE Ingress を使用することをお勧めします。MSE Ingress は、運用管理不要のフルマネージド Ingress です。MSE Ingress を使用して、リクエストに基づいて自動スケーリングを実装できます。単一のポッドによって処理される同時リクエスト数を正確に制御できるため、大規模なクラウドネイティブ分散アプリケーションのトラフィックガバナンス要求を満たすのに役立ちます。

前提条件

  • Knative が ACS クラスタにデプロイされていること。詳細については、Knative のデプロイを参照してください。

  • MSE Ingress コントローラーがインストールされ、MSE Ingress コントローラーに権限が付与されていること。詳細については、MSE Ingress コントローラーへの権限の付与を参照してください。

仕組み

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

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

image.png

ステップ 1: MSE Ingress をデプロイする

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

  2. クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、アプリケーション > Knative を選択します。

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

ステップ 2: MSE Ingress を使用してサービスにアクセスする

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

  2. クラスタページで、管理するクラスタを見つけて、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、アプリケーション > Knative を選択します。

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

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

    重要

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

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev # MSE メトリックに基づいてポッドをスケーリングします。ポッドはゼロにスケーリングできます。
            autoscaling.knative.dev/max-scale: '20' # 許可されるポッドの最大数を 20 に設定します。
        spec:
          containerConcurrency: 5 # 各ポッドが処理できる同時リクエストの最大数を 5 に設定します。
          containers:
          - image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 # {REGION-ID} は、クラスタが存在するリージョンです (例: cn-hangzhou)。
            env:
            - name: TARGET
              value: "Knative"

    サービスの ステータス列に 作成済みと表示されている場合、サービスはデプロイされています。

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

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

    curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX # 取得した実際のゲートウェイ IP アドレスとドメイン名を指定します。

    予期される出力:

    Hello Knative!

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

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

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

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

    # 100,000 件のリクエストを送信し、同時実行数を 50 に、リクエストタイムアウト期間を 180 秒に設定します。
    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

(オプション) ステップ 3: Knative モニタリングダッシュボードを表示する

Knative は、すぐに使えるモニタリング機能を提供します。Knative ページで、モニタリングダッシュボードタブをクリックして、指定されたサービスのモニタリングデータを表示します。Knative ダッシュボードの詳細については、Knative ダッシュボードの表示を参照してください。

image.png

関連情報