マイクロサービスアーキテクチャを含むシナリオでは、Knativeサービスのトラフィック分散およびルーティングにmicroservices Engine (MSE) Ingressを使用することを推奨します。 MSE Ingressは完全に管理され、O&Mフリーで、リクエストに基づく正確な自動スケーリングをサポートし、個々のポッドのリクエストの同時実行を正確に制御します。 このソリューションは、多数のクラウドネイティブ分散アプリケーションがデプロイされているシナリオでのトラフィック管理要件を効果的に満たします。
前提条件
Knativeはクラスターにデプロイされています。 詳細については、「Knativeのデプロイ」「」をご参照ください。
MSE Ingressコントローラーがインストールされ、MSEへのアクセスが許可されています。 詳細については、「MSE IngressコントローラーによるMSEへのアクセス許可」をご参照ください。
仕組み
個々のポッドのスループットは限られています。 複数のリクエストが同じポッドにルーティングされると、対応するサーバーが過負荷になる可能性があります。 したがって、各ポッドによって処理される同時リクエストの数を正確に制御する必要があります。 例えば、人工知能生成コンテンツ (AIGC) シナリオでは、単一の要求が大量のGPUリソースを占有することがある。 各ポッドによって処理される同時リクエストの数を厳密に制限する必要があります。 MSE Ingressを使用することで、Knativeはポッドを正確にスケールアウトして、多数のクラウドネイティブ分散アプリケーションがデプロイされているシナリオでトラフィック管理要件を満たすことができます。
次の図では、MultidimPodAutoscaler (MPA) は、MSE Ingressからの同時リクエストの合計数を取得し、リクエストの処理に必要なポッドの数を計算してから、ポッドをスケーリングします。 これにより、ロード対応の自動スケーリングが実装されます。 MSE Ingressは、ルーティングのルールと条件に基づいて、リクエストをさまざまなサービスまたはバージョンに正確にルーティングできます。
ステップ1: MSE Ingressのデプロイ
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
On theコンポーネントタブをクリックします。Knativeのデプロイ、選択MSE[Gateway] パラメーターを指定し、プロンプトに従ってデプロイを終了します。
手順2: MSE Ingressを使用してサービスにアクセス
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
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"
サービスの [ステータス] 列に [作成済み] が表示された場合、サービスがデプロイされます。
[サービス] ページで、
helloworld-go
サービスのドメイン名とゲートウェイIPアドレスをそれぞれ [デフォルトドメイン] 列と [ゲートウェイ] 列に記録します。次のコマンドを実行して、
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: 同時リクエスト数に基づいて自動スケーリングを実行する
負荷テストツールをインストールします。
heyの詳細については、「Hey」をご参照ください。
サービスでストレステストを実行するには、次のコマンドを実行します。
# 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が送信されたことを示す。 すべての要求が処理されます。
次のコマンドを実行して、ポッドのスケーリングを照会します。
説明このコマンドは、手動で終了するまで永続的に実行されます。
Ctrl + C
を押してコマンドを終了します。kubectl get pods --watch
手順4 (オプション): サービスのモニタリングデータの表示
Knativeは、すぐに使えるモニタリング機能を提供します。 [Knative] ページで、[モニタリングダッシュボード] タブをクリックし、helloworld-go Serviceのモニタリングデータを表示します。 Knativeダッシュボードを有効にする方法の詳細については、「PrometheusのマネージドサービスでKnativeダッシュボードを表示する」をご参照ください。