ack-advanced-vertical-pod-autoscaler (AVPA) は、Alibaba Cloud が提供するインプレーススケーリングコンポーネントです。メトリクスに基づくインプレーススケーリングとアプリケーション起動高速化をサポートします。このトピックでは、CPU メトリクスに基づく垂直スケーリングについて説明するとともに、この機能の利用シナリオ、設定、制限を紹介します。
背景情報
AVPA は、起動高速化とメトリクスベースの垂直スケーリングをサポートします。これらの機能を Container Service for Kubernetes (ACK) のインプレーススケーリングと組み合わせることで、ビジネスを中断することなく Pod リソースをスケーリングできます。これにより、ビジネス負荷のホットスポットに対応できます。
AVPA とオープンソース VPA の比較
VPA | AVPA | |
スケーリング方法 | Pod を 1 つずつ再作成します。 | インプレースホットアップグレードを実行します。 |
スケーリング範囲 | すべての Pod をアップグレードまたはダウングレードします。 | 個別にアップグレードまたはダウングレードします。 |
適用可能なワークロード |
|
|
使用シナリオ | 長期的でバランスの取れたワークロードの変更。 | 周期的なワークロードの変更、予期しないワークロードの変動、および不均衡なワークロード。 |
使用シナリオ
ゲーム事業:周期的に変動する CPU ワークロードのホットアップグレードおよびダウングレード。
オンラインビジネス:ホットスポット Pod の垂直スケーリング。
制限事項
AVPA は、オープンソースの VPA または HPA とは併用できません。
CPU メトリクスに基づく垂直スケーリングがサポートされています。スケーリング後に CPU 仕様が ACK の要件を満たさなくなった場合、スケーリングリクエストは拒否されます。たとえば、システムは
2vCpu2Giから3vCpu2Giにアップグレードできません。さらに、スケーリング対象のコンテナには、リソースのrequestsを設定する必要があります。垂直スケーリングにより、Pod の CPU requests と limits が自動的に調整されます。 ACK および ACK Serverless クラスターでは、ノードリソースが限られているため、垂直スケーリングが制限されることがあります。
ACK および ACK Serverless クラスターでは、
ack-virtual-nodeのバージョンがv2.14.0以降である必要があります。AVPA はプロファイルを作成せず、既存の Pod にのみ適用されます。したがって、新しい Pod は、ワークロードで定義された元のリソース仕様に基づいて作成されます。
-
現在 ACK は、
ComputeQoS=defaultを持つ汎用およびコンピューティング最適化 ACK Pod の CPU インプレーススケーリングをサポートしています。-
インプレーススケーリングの最大リソース仕様は
16 vCPU 16 Giです。 -
元の CPU 仕様の 2 倍までスケールアップでき、50% までスケールダウンできます。たとえば、
2 vCPU 4 Giの仕様を持つ ACK Pod は、1 vCPU 4 Giから4 vCPU 4 Giの範囲内でスケーリングできます。 -
インプレーススケーリングは、ACK のリソース正規化の制約も受けます。スケーリング後の仕様がサポート範囲外の場合、ACK は最も近いサポートされているリソース仕様に自動的に正規化します。たとえば、
0.75 vCPU 1.5 Giの仕様を持つ ACK Pod は、自動的に1 vCPU 2 Giに正規化されます。
-
操作手順
このトピックでは、サンプルワークロードとオプションのシャドウワークロードを使用して手順を説明します。AVPA はサンプルワークロード用に設定されています。シャドウワークロードはサンプルワークロードと同じリソース仕様ですが、AVPA は設定されていません。この設定により、実際のビジネス負荷をシミュレートし、CPU 負荷に基づく垂直スケーリングを実行します。
サンプルワークロードは、トラフィック Ingress として Service を使用し、負荷シミュレーションツールを備えています。このツールは、API をトリガーすることで、6,000 秒以内に 500 ミリコア (0.5 コア) などの指定量の CPU リソースを消費させることができます。
操作手順
ステップ 1:インプレーススケーリングのフィーチャーゲートの有効化
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
-
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
-
[Core Components] セクションで、[Kube API Server] カードを見つけて [設定] をクリックします。[featureGates] フィールドに
InPlacePodVerticalScaling=trueと入力して、インプレーススケーリングのフィーチャーゲートを有効にします。説明設定プロセス中、[Kube API Server] カードのステータスは [Executing] に変わります。ステータスが [Installed] に戻ると、インプレーススケーリングのフィーチャーゲートが有効になります。
手順2:AVPAのインストール
左側のナビゲーションペインで、[Applications] > Helm を選択します。ack-advanced-vertical-pod-autoscaler コンポーネントを検索してインストールします。詳細については、「ACK で Helm を使用してアプリケーションを管理する」をご参照ください。
手順3:ワークロードのデプロイとローカル接続の作成
YAML ファイルを作成します。ストレステスト用に shadow-hello-avpa.yaml という名前の YAML ファイルを作成することもできます。
hello-avpa.yaml という名前の YAML ファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: hello-avpa namespace: default spec: replicas: 1 selector: matchLabels: name: hello-avpa template: metadata: annotations: scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' labels: name: hello-avpa vpa: enabled spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/simulation-resource-consumer:1.13' name: hello-avpa resources: limits: cpu: '2' memory: '4Gi' requests: cpu: '2' memory: '4Gi' --- apiVersion: v1 kind: Service metadata: name: hello-avpa-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: name: hello-avpa type: ClusterIP(オプション) shadow-hello-avpa.yaml という名前の YAML ファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: shadow-hello-avpa namespace: default spec: replicas: 1 selector: matchLabels: name: shadow-hello-avpa template: metadata: annotations: scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' labels: vpa: enabled name: shadow-hello-avpa spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/simulation-resource-consumer:1.13' name: shadow-hello-avpa resources: limits: cpu: '2' memory: '4Gi' requests: cpu: '2' memory: '4Gi' --- apiVersion: v1 kind: Service metadata: name: shadow-avpa-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: name: shadow-hello-avpa type: ClusterIPワークロードをデプロイします。
kubectl apply -f hello-avpa.yaml kubectl apply -f shadow-hello-avpa.yamlkubectl port-forwardを実行して、ローカル接続を作成します。重要kubectl port-forwardを使用して設定されたポートフォワーディングは、本番環境では信頼性、安全性、拡張性がありません。開発とデバッグ専用です。このコマンドを本番環境でのポートフォワーディング設定に使用しないでください。ACK クラスターの本番環境で使用されるネットワークソリューションの詳細については、「Ingress 管理」をご参照ください。kubectl port-forward svc/hello-avpa-svc -n default 28080:80 kubectl port-forward svc/shadow-avpa-svc -n default 28081:80
手順4:AVPAの設定
AdvancedVerticalPodAutoscaler リソースを作成して、弾性スケーリングを設定できます。
-
avpa.yaml という名前の YAML ファイルを作成します。
TargetRef モード
以下のスケーリング設定は AVPA の TargetRef モードに基づいています。この設定では、CPU 使用率に応じて、
default名前空間にあるhello-avpaという名前のDeploymentが作成したPodのリソースを調整します。apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedVerticalPodAutoscaler metadata: name: hello-avpa namespace: default spec: metrics: - containerResource: container: hello-avpa name: cpu target: averageUtilization: 30 type: Utilization type: ContainerResource watermark: low - containerResource: container: hello-avpa name: cpu target: averageUtilization: 50 type: Utilization type: ContainerResource watermark: high scaleResourceLimit: maximum: cpu: '4' minimum: cpu: '1' scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hello-avpa次の表では、一部のパラメーターについて説明します。
パラメーター
必須
説明
scaleTargetRef
はい
対象のワークロード。現在、Kubernetes ネイティブの Deployment、StatefulSet、Job、および OpenKruise の AdvancedStatefulSet と CloneSet がサポートされています。
metrics.containerResource
はい
メトリクスが収集されるリソースのタイプと使用率のしきい値を指定します。
container:メトリクスが収集されるコンテナの名前。name:収集するメトリクスの名前。CPU メトリクスのみがサポートされています。target:しきい値情報。type:Utilizationに設定します。averageUtilization:平均使用率のしきい値。
説明ACK serverless Pod の場合、メトリクス計算ではコンテナのリソース制限が優先されます。リソース制限が設定されていない場合、計算はリソース要求に基づきます。リソースの制限と要求がどちらも定義されていない Pod のメトリクス計算はサポートされていません。
metrics.watermark
はい
しきい値のタイプを指定します。有効な値は次のとおりです。
low:低ウォーターマーク。メトリクス値がしきい値を下回ると、Pod はスケールダウンされます。high:高ウォーターマーク。メトリクス値がしきい値を超えると、Pod はスケールアップされます。
metrics.type
はい
メトリクス収集の粒度を指定します。メトリクスはコンテナまたは Pod ごとに集計できます。デフォルトは
ContainerResourceです。説明現在、コンテナごとにメトリクスを収集および集計できます。
scaleResourceLimit.minimum
いいえ
垂直スケーリングの下限 (
cpuのみ)。cpu:デフォルトは 250m (ミリコア) です。
scaleResourceLimit.maximum
いいえ
垂直スケーリングの上限 (
cpuのみ)。cpu:デフォルトは 64 (コア) です。
Selector モード
以下の Selector モードは AVPA 0.2.0 で導入され、より柔軟なセレクターを提供して Pod 設定を簡素化します。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedVerticalPodAutoscaler metadata: name: hello-avpa namespace: default spec: metrics: - containerResource: container: "*" name: cpu target: averageUtilization: 30 type: Utilization type: ContainerResource watermark: low - containerResource: container: "*" name: cpu target: averageUtilization: 50 type: Utilization type: ContainerResource watermark: high scaleResourceLimit: maximum: cpu: '4' minimum: cpu: '1' # 必要に応じて、次のサンプルセレクター設定を変更できます。 selector: matchLabels: vpa: enabled matchExpressions: # すべての ACS Pod に適用されるラベル。 - key: alibabacloud.com/compute-class operator: Exists - key: name operator: In values: - hello-avpa # 特定の Pod の AVPA を無効にするための予約済みスイッチ。 - key: alibabacloud.com/disable-avpa operator: DoesNotExist1 つのワークロードにのみ作用する
scaleTargetRefとは異なり、selectorは任意の Pod を選択して、さまざまなシナリオのスケーリング要件を満たすことができます。パラメーター
必須
説明
selector
いいえ
selectorとscaleTargetRefは相互に排他的です。selectorを使用すると AVPA の設定が簡素化され、特定のタイプのワークロードによって作成された Pod を一元管理できます。これにより、各ワークロードに対して AVPA を設定する必要がなくなります。metrics.containerResource
はい
メトリクスが収集されるリソースのタイプと使用率のしきい値を指定します。
container:メトリクスが収集されるコンテナの名前。
説明ワイルドカード文字 (
*) を入力して、すべてのコンテナに一致させることができます。コンテナがワイルドカード式と特定のコンテナ一致ルールの両方に一致する場合、コンテナ一致ルールが優先されます。
name:収集するメトリクスの名前。CPU メトリクスのみがサポートされています。target:しきい値情報。type:Utilizationに設定します。averageUtilization:平均使用率のしきい値。
metrics.watermark
はい
しきい値のタイプを指定します。有効な値は次のとおりです。
low:低ウォーターマーク。メトリクス値がしきい値を下回ると、Pod はスケールダウンされます。high:高ウォーターマーク。メトリクス値がしきい値を超えると、Pod はスケールアップされます。
metrics.type
はい
メトリクス収集の粒度を指定します。メトリクスはコンテナまたは Pod ごとに集計できます。デフォルトは
ContainerResourceです。説明現在、コンテナごとにメトリクスを収集および集計できます。
scaleResourceLimit.minimum
いいえ
垂直スケーリングの下限 (
cpuのみ)。cpu:デフォルトは 250m (ミリコア) です。
scaleResourceLimit.maximum
いいえ
垂直スケーリングの上限 (
cpuのみ)。cpu:デフォルトは 64 (コア) です。
コンテナリソース使用率の計算ルール:
ACK serverless Pod などのサーバーレス Pod の場合、リソース仕様はリソース制限に基づいてプロビジョニングされます。したがって、使用率はまず制限に基づいて計算されます ()。制限が設定されていない場合、計算は要求されたリソースに基づきます ()。要求も制限も設定されていない場合、コンテナメトリクスの計算はサポートされていません。 たとえば、コンテナの宣言によって ACK が 4 vCPU と 4 GiB の Pod を作成し、PodMetrics が 1000m の CPU 使用量を報告した場合、CPU 使用率は 1/4 = 25% です。 ... spec: containers: - resources: limits: cpu: '4' memory: '4Gi' requests: cpu: '1' memory: '4Gi' -
AVPA の設定では、スケーリングステップなどを指定することで、スケーリングの動作をよりきめ細かく制御できます。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedVerticalPodAutoscaler metadata: name: hello-avpa namespace: default spec: behavior: parallelism: 1 stabilizationWindowSeconds: 600 scaleDown: # スケールダウンのリソースステップとポリシーを定義します。通常は段階的な減少が推奨されますが、各スケールダウンは正規化の粒度を超えるのに十分な大きさでなければなりません。 policies: - type: CpuPercent value: 10% periodSeconds: 60 - type: Cpus value: 500m periodSeconds: 60 selectPolicy: Max scaleUp: # スケールアップのリソースステップとポリシーを定義します。通常、スケーリングイベントを少なくして負荷の増加に対応するために、比較的急な増加が推奨されます。 policies: - type: CpuPercent value: 60% periodSeconds: 60 - type: Cpus value: 500m periodSeconds: 60 selectPolicy: Max metricObserveWindowSeconds: 600 metrics: - containerResource: container: hello-avpa name: cpu target: averageUtilization: 30 type: Utilization type: ContainerResource watermark: low - containerResource: container: hello-avpa name: cpu target: averageUtilization: 50 type: Utilization type: ContainerResource watermark: high scaleResourceLimit: maximum: cpu: '4' minimum: cpu: '1' scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hello-avpaspec.behaviorパラメーターでは、scaleDownとscaleUpはそれぞれスケールダウンとスケールアップのリソースポリシーを記述します。含まれるサブパラメーターは、どちらも同じ意味を持ちます。パラメーター
必須
説明
policies[].type
いいえ
-
Cpus:CPU スケーリングステップの絶対値。 -
CpuPercent:現在のリソース仕様に対するパーセンテージとして CPU スケーリングステップを指定します。
policies[].value
いいえ
-
typeがCpusに設定されている場合、この設定を使用します。値は250m、1などに設定できます。 -
typeがCpuPercentに設定されている場合、この設定を使用します。値は5%などのパーセンテージで指定します。
selectPolicy
いいえ
スケーリングステップの計算ポリシーです。有効な値は次のとおりです。
-
Max:複数のポリシーが設定されている場合、最大値をターゲットのステップサイズとして使用します。 -
Min:複数のポリシーが設定されている場合、最小値をターゲットのステップサイズとして使用します。
metricObserveWindowSeconds
いいえ
データ収集の時間枠。収集されたメトリクスがこの時間枠にまたがる場合、システムは負荷を計算し、スケーリングを実行するかどうかを決定します。単位は秒です。デフォルト値は
600秒、最小値は300秒です。behavior.parallelism
いいえ
スケーリングの並列度。同時にスケーリングされる Pod の数で、デフォルト値は
1です。behavior.stabilizationWindowSeconds
いいえ
スケーリングのクールダウン期間は秒単位で指定され、デフォルト値は
600、最小値は300です。また、クールダウン期間がデータ収集ウィンドウmetricObserveWindowSecondsより短くならないようにする必要があります。スケーリングが必要な場合、AVPA はデフォルトポリシーを使用してターゲットリソース仕様を計算します。このポリシーでは、
highWaterMarkとlowWaterMarkの平均値をターゲット負荷レベルとして使用し、スケールアップまたはスケールダウンのスケーリングステップを計算します。たとえば、1 vCPUのコンテナで、上限しきい値と下限しきい値がそれぞれ60と40に設定され、現在の使用率が100%の場合、ターゲット使用率は50%になります。期待されるスケールアップステップは1 vCPUとなり、コンテナは2 vCPUにスケールアップされます。スケーリングが必要な場合、AVPA はデフォルトのポリシーを使用してターゲットリソース仕様を計算します。スケールアップまたはスケールダウンのスケーリングステップは、 と の平均をターゲット負荷レベルとして計算されます。たとえば、 コンテナの場合、高しきい値と低しきい値がそれぞれ と に設定され、現在の使用率が の場合、ターゲット使用率は です。予想されるスケールアップステップは で、コンテナを にスケールアップします。 説明推奨設定:急速なスケールアップと段階的なスケールダウンを推奨します。これにより、リソースをゆっくり解放することで安定性を維持しながら、増加する負荷要求に迅速に対応できます。
scaleUp:ワークロード要件をより少ないスケーリング回数で満たすために、比較的大きな増分でスケールアップします。例:
type: Cpus、value: 1。scaleDown:負荷が減少するにつれて、安定性を向上させるためにリソースを小さな増分で段階的にスケールダウンします。例:
type: Cpus、value: 250m。 -
YAML ファイルをデプロイします。
kubectl apply -f avpa.yaml
手順5:ストレステストの実行
トラフィック Ingress を通じてバックエンド Pod にリクエストを送信し、CPU 負荷を生成します。同じリソース仕様と負荷に基づいて、AVPA が有効になる前後のワークロード監視データを確認します。
-
リクエストを送信して負荷を生成します。
現在のテスト Pod の CPU リソース仕様は
2 vCPUです。最初に、負荷を約 50% に増加させ、1000 ミリコアを消費し、2000 秒間維持します。その後、負荷は 60 秒ごとにさらに 100 ミリコア増加し、30 分後には最終的に 4000 ミリコアに達します。# 負荷を増やします。各コマンドの上限は 1,000 ミリコアです。 curl --data "millicores=1000&durationSec=2000" http://localhost:28080/ConsumeCPU curl --data "millicores=1000&durationSec=2000" http://localhost:28081/ConsumeCPU # 継続的に負荷を増やします。 for i in {1..30} do sleep 60 curl --data "millicores=100&durationSec=2000" http://localhost:28080/ConsumeCPU curl --data "millicores=100&durationSec=2000" http://localhost:28081/ConsumeCPU done -
メトリクスデータを監視します。
左側のナビゲーションペインで、 をクリックします。 タブで、監視データを表示します。
CPU 負荷は継続的に増加し、しきい値に達します。10 分後、CPU リソースは
3.2 vCPUにスケールアップされます。30 分後、CPU リソースは4 vCPUにスケールアップされます。スケールアップ後、CPU 負荷は大幅に低下します。
シャドウワークロードの負荷を監視します。CPU リソースは短時間で枯渇します。

-
Pod イベントを表示します。
Pod イベントには、スケーリング中の YAML テンプレートの設定変更が表示されます。
[Events] タブで、[Pod] サブタブを選択します。
StartingVerticalScalingPod、InplaceResizing、InplaceResizedFinished、FinishedVerticalScalingPodなど、垂直スケーリングに関連するイベントを確認できます。イベントから、CPU リクエストが2から3,200m、3,500m、そして最終的に4にスケールアップしたことがわかります。インプレース調整プロセス全体には約 34〜36 秒かかります。 低負荷によるスケールダウン動作をシミュレートします。
CPU 負荷がしきい値を下回ると、CPU リソースはスケールダウンされます。
負荷がスケールダウンのしきい値に達した後、安定性を確保するために、CPU リソースは指定されたステップでスケールダウンされます。
負荷が一貫して低いレベルで維持される場合、コンテナリソースは AVPA 設定で設定された最小仕様
1 vCPUにスケーリングされます。

(オプション) 手順6:リソースの削除
ワークロード、Service、および AVPA リソースを削除します。
kubectl delete -f hello-avpa.yaml kubectl delete -f shadow-hello-avpa.yaml-
左側のナビゲーションペインで、[Applications] > Helm を選択します。ack-advanced-vertical-pod-autoscaler の行を見つけ、[Actions] 列の [Delete] をクリックします。
よくある質問
AVPAのステータスを照会するには?
kubectl を使用して、AVPA のリアルタイムステータスを照会します。
# この例では、クラスター接続情報は ~/.kube/acs-test ファイルに保存されています。
# export KUBECONFIG=~/.kube/acs-test
kubectl get avpa -n [namespace] [-oyaml]出力例:
$ kubectl get avpa
NAME TARGETTYPE TARGETNAME REPLICAS UPDATING WAITING LASTSCALED AGE
hello-avpa 1 0 0 11d 11dスケーリング中のPodを照会するには?
AVPA 0.3.0 より後のバージョンでは、スケーリング中の Pod には avpa.alibabacloud.com/resizing-lock ラベルが付与されます。
kubectl get po -n [ns] -lavpa.alibabacloud.com/resizing-lockスケーリングに失敗したPodを照会するには?
AVPA 0.3.0 より後のバージョンでは、スケーリングの失敗は Kubernetes イベント に記録されます。InplaceResizedTimeoutFailed キーワードを指定して、Logstore でスケーリングの失敗を照会できます。
これらのイベントに対してアラートルールを作成できます。詳細については、「アラートルールの作成」をご参照ください。