本番環境では、サーバーレス Pod に割り当てられるリソースは通常固定されています。ただし、Pod が消費するリソースは、さまざまなシナリオで動的に変動する可能性があります。これらの変動に対応するために、Container Compute Service (ACS) は、Pod の仕様を変更できるインプレーススケーリング機能を提供します。このトピックでは、ACS Pod のインプレーススケーリングについて説明し、この機能を使用してリソースコストを削減し、アプリケーションの起動を高速化するためのベストプラクティスを提供します。
背景情報
複雑な本番環境では、サービスが消費する計算能力が変動する可能性があります。これにより、Pod の容量計画が困難になります。たとえば、一部のアプリケーションは起動時に大量の CPU リソースを消費しますが、起動後は長期間にわたってリソース消費が低いままです。ステートフルアプリケーションまたはゲームアプリケーションは、その状態または持続的接続を維持しながら、ピーク時とオフピーク時の変動するビジネス需要に対応する必要があります。
これらのシナリオに対応するために、サーバーレス Pod は、実際の使用状況に合わせて、より詳細で柔軟なリソース仕様を必要とします。Pod が仕様を動的に変更し、オンデマンドでスケーリングできれば、容量計画がはるかに簡単になり、コストが実際のリソース消費とより一致するようになります。
ACS Pod のインプレーススケーリング機能を使用すると、約 10 秒の低レイテンシーでコンテナーの CPU リソースをホットアップデートできます。ACS の ack-advanced-vertical-pod-autoscaler (AVPA) コンポーネントと組み合わせることで、この機能は、変化するリソース要件を持つシナリオに対応するためのさまざまな自動スケーリング機能を提供します。
ACS は、
ComputeQoS=defaultを持つ汎用および計算最適化 ACS Pod の CPU リソースのインプレーススケーリングをサポートしています。柔軟なスペックアップとスペックダウンをサポートする最大リソース仕様は
16vCpu16Giです。サポートされているスケーリング範囲では、元の CPU 仕様を最大 100% までスケールアウトし、最大 50% までスケールインできます。たとえば、
2vCpu4GiACS Pod のスケーリング範囲は1vCpu4Giから4vCpu4Giです。インプレーススケーリング機能は、ACS リソースの可用性によっても制限されます。スケーリング後の構成がサポート範囲外の場合、最も近いサポートされている リソース仕様 に自動的に調整されます。たとえば、
0.75vCpu1.5Giの ACS Pod は自動的に1vCpu2Giに調整されます。
シナリオ

インプレーススケーリングは、コンテナーを再起動せずにサイズ変更することをサポートします。この機能は、アプリケーションの起動高速化、ステートフルアプリケーションのインプレーススケーリング、アプリケーションにおけるローカル計算能力のホットスポットへの対応など、計算能力の使用量が変動するシナリオで使用できます。
具体的なシナリオは次のとおりです。
コンパイルやプリロードに大量の計算リソースを必要とするアプリケーションの起動高速化。起動時に多くの CPU リソースを割り当て、起動完了後にスケールダウンできます。
負荷が増加したときの Redis などのステートフルアプリケーションの垂直スケーリング。
大規模なリクエストや持続的接続セッションによるローカルホットスポットが発生するオンラインアプリケーションの垂直スケーリング。
インプレーススケーリング後、アプリケーション Pod は新しい仕様に基づいて課金されます。スケーリングプロセス中またはスケーリングが失敗した場合、課金は元の仕様に基づいて継続されます。
インプレーススケーリングは、コンテナーの利用可能な CPU リソースを動的に調整できます。アプリケーションのプログラミング言語の特性に基づいて、これらの動的リソースを使用することをお勧めします。
インプレーススケーリングは瞬時に行われるわけではありません。使用前にアプリケーションの容量バッファーを見積もることをお勧めします。この機能を使用して、数秒以内に発生するトラフィックおよび負荷のバーストに対応しないでください。
前提条件
バージョン 1.28 以降の ACS クラスターが作成されていること。詳細については、「ACS クラスターの作成」をご参照ください。
kubectl クライアントがクラスターに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
Pod の手動スケーリング
ステップ 1: インプレーススケーリング機能ゲートを有効にする
ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、ターゲットクラスターを見つけてその ID をクリックします。左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。
[コアコンポーネント] エリアで、[Kube API Server > 設定] を選択します。[featureGates] を
InPlacePodVerticalScaling=trueに設定して、インプレーススケーリング機能を有効にします。
説明設定中、[Kube API Server] カードのステータスが [実行中] に変わります。ステータスが [インストール済み] に戻ると、インプレースリソーススケーリング機能ゲートが有効になります。
ステップ 2: ACS Pod をスケーリングする
[クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[YAML から作成] をクリックし、次のサンプル YAML を使用して Pod を作成します。
scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'アノテーションは、Pod のインプレーススケーリングを有効にします。apiVersion: apps/v1 kind: Deployment metadata: labels: app: demo name: demo namespace: default spec: replicas: 1 selector: matchLabels: app: demo template: metadata: annotations: scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' # インプレーススケーリングを有効にします。 labels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default app: demo spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1' imagePullPolicy: IfNotPresent name: spring ports: - containerPort: 8080 protocol: TCP resources: limits: cpu: 1 memory: 4Gi requests: cpu: 1 memory: 4GiPod アノテーション設定項目
設定項目の説明
値
scaling.alibabacloud.com/enable-inplace-resource-resize
Pod の作成時にこのアノテーションを指定して、現在の ACS Pod のインプレーススケーリングを有効にします。
true
Pod が作成されたら、[Pod] ページに移動し、[編集] をクリックして CPU リソースを
1から2に手動で変更します。次に、[更新] をクリックします。
インプレーススケーリング機能が有効になった後、Pod の仕様が再起動なしで変更されることを確認できます。

自動インプレーススケーリングを使用してアプリケーションの起動を高速化する
典型的な Java アプリケーションが良い例です。起動フェーズでは、クラスの読み込みやバイトコードのコンパイルなどの操作に大量のリソースを消費します。アプリケーションが定常状態に入ると、これらのリソースは解放されます。アプリケーションの起動を高速化し、通常運用中のコストを削減するために、サーバーレス Pod は起動時により多くのリソースを使用し、サービスの起動後にスケールダウンできます。
ACS は Java アプリケーションの起動高速化機能を提供します。ACS Pod を、宣言された仕様よりも多くのリソースで起動し、起動完了後に自動的に元の仕様にスケールダウンするように設定できます。JVM パラメーターの設定の詳細については、「JVM パラメーターを設定して Java アプリケーションの起動を高速化する」をご参照ください。
制限
起動高速化機能: 起動高速化機能は、Pod の Ready 状態に依存してスケールイン操作を制御します。readiness プローブが設定されていない場合、コンテナーは起動するとすぐに準備完了と見なされ、自動スケールインのカウントダウンがすぐにトリガーされます。起動高速化機能が有効になっている Pod には、readiness プローブを設定することをお勧めします。
コンテナーの再起動シナリオ: コンテナーの再起動時に自動起動高速化を期待する場合、readiness プローブを設定しないと自動スケールアップが妨げられる可能性があります。
リソース設定要件: 起動高速化機能は、Pod の元のリソースに依存してスケールアップリソースを計算します。したがって、元の requests と limits の値を設定する必要があります。そうしないと、起動高速化機能が機能しない場合があります。
ステップ 1: インプレーススケーリング機能ゲートを有効にする
詳細については、「ステップ 1: インプレーススケーリング機能ゲートを有効にする」をご参照ください。
ステップ 2: ack-advanced-vertical-pod-autoscaler コンポーネントをインストールする
左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。[ack-advanced-vertical-pod-autoscaler] コンポーネントを検索してインストールします。詳細については、「Helm を使用して ACS でアプリケーションを管理する」をご参照ください。

ステップ 3: インプレーススケーリングを使用してアプリケーションの起動を高速化する
Java ワークロードを作成し、起動高速化機能を有効にします。YAML ファイルでは、
scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'に加えて、alibabacloud.com/startup-cpu-burst-factorおよびalibabacloud.com/startup-cpu-burst-duration-secondsアノテーションを使用して、起動 CPU バースト係数と起動 CPU バースト期間を設定する必要もあります。apiVersion: apps/v1 kind: Deployment metadata: labels: app: spring-with-burst name: spring-with-burst namespace: default spec: replicas: 1 selector: matchLabels: app: spring-with-burst template: metadata: annotations: alibabacloud.com/startup-cpu-burst-factor: '2' # 起動スケールアウト係数を 2 に設定します。初期 2C は 4C で起動し、コンテナーが Ready になった後、初期状態にスケールバックします。 alibabacloud.com/startup-cpu-burst-duration-seconds: "30" # 指定しない場合、Pod が Ready になってから 30 秒後に自動的にスケールインされます。 scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' # インプレーススケーリングを有効にします。 labels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default app: spring-with-burst spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1' imagePullPolicy: IfNotPresent name: spring ports: - containerPort: 8080 protocol: TCP resources: limits: cpu: 1 memory: 4Gi requests: cpu: 1 memory: 4Gi readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 20 periodSeconds: 10Pod アノテーション
説明
値
scaling.alibabacloud.com/enable-inplace-resource-resize
ACS Pod のインプレーススケーリングを有効にします。
true
alibabacloud.com/startup-cpu-burst-factor
ACS Pod が元の CPU 仕様の倍数で起動することを指定します。
2
説明インプレーススケーリング機能は、Pod を元の仕様の 2 倍までしかスケールアップできません。たとえば、元の仕様が
2 vCPUの場合、Pod は4 vCPUで起動します。alibabacloud.com/startup-cpu-burst-duration-seconds
起動完了後、ACS Pod がスケールインされるまで待機する秒数を指定します。
30 以上
説明デフォルト値は 30 秒です。Pod は Ready 状態になってから 30 秒後にスケールインされます。Pod が Ready にならない場合、スケールアップされた状態のままになります。
alibabacloud.com/startup-cpu-burst-disable-restart
オプション。コンテナーの再起動時に自動スケールアップを無効にします。
true
説明このアノテーションを追加しない場合、コンテナーの再起動時に自動スケールアップが有効になります。
ステップ 4: Pod の作成とサービスの起動プロセスを観察する
アプリケーションが作成された後、その詳細ページに移動します。Pod が 2 vCPU と 4 GiB のメモリで作成されていることがわかります。Pod が起動し、CPU バースト期間が終了すると、Pod は自動的に 1 vCPU と 4 GiB のメモリにスケールダウンされます。
Pod イベントの表示
[イベント] タブで [Pod] を選択して、スケールダウンの詳細を表示します。この例では、イベントメッセージ
Starting to resize resource down for container: spring cpu: 2 -> 1, memory: 4Gi -> 4Giが表示されます。
イベントをチェックしてスケーリングの進行状況を監視するだけでなく、Pod の status.resize フィールドを確認することもできます。空でない値は、Pod がスケーリング中であることを示します。
Pod モニタリングデータの表示
[モニタリング] タブの [CPU 情報] セクションで、CPU 使用率の変化を観察できます。

ステップ 5: Pod コンテナーの再起動後のサービス起動プロセスを観察する
ack-advanced-vertical-pod-autoscaler 0.0.2 以降のバージョンでは、Pod の再起動後、デフォルトで Pod のインプレーススケーリングが有効になります。Pod に alibabacloud.com/startup-cpu-burst-disable-restart アノテーションを追加して、この機能を明示的に無効にすることができます。コンテナー内のプロセス 1 に kill シグナルを送信してコンテナーのクラッシュをシミュレートし、対応するサービスが高速化されるかどうかを確認します。コマンドを実行する前に、{POD_NAME} を実際の Pod 名に置き換えてください。
kubectl exec -it {POD_NAME} -- kill 1コンテナーが再起動すると、Pod の仕様は 2vCpu4G に変更されます。新しいコンテナーが実行され、事前設定された遅延が経過すると、Pod の仕様は自動的に 1vCpu4Gi にスペックダウンされます。
Pod イベントの表示
[イベント] タブで [Pod] を選択して、スペックアップとスペックダウンの詳細を表示します。この例では、イベントメッセージは
Starting to resize resource for container: spring cpu: 1 -> 2, memory: 4Gi -> 4GiとStarting to resize resource for container: spring cpu: 2 -> 1, memory: 4Gi -> 4Giです。
Pod モニタリングデータの表示
[モニタリング] タブの [CPU 情報] セクションで、CPU 使用率が時間とともに変化することがわかります。
