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

Container Compute Service:コンテナのインプレース垂直スケーリング

最終更新日:Jun 21, 2026

ack-advanced-vertical-pod-autoscaler (AVPA) は、Alibaba Cloud が提供するインプレーススケーリングコンポーネントです。メトリクスに基づくインプレーススケーリングとアプリケーション起動高速化をサポートします。このトピックでは、CPU メトリクスに基づく垂直スケーリングについて説明するとともに、この機能の利用シナリオ、設定、制限を紹介します。

背景情報

AVPA は、起動高速化とメトリクスベースの垂直スケーリングをサポートします。これらの機能を Container Service for Kubernetes (ACK) のインプレーススケーリングと組み合わせることで、ビジネスを中断することなく Pod リソースをスケーリングできます。これにより、ビジネス負荷のホットスポットに対応できます。

AVPA とオープンソース VPA の比較

VPA

AVPA

スケーリング方法

Pod を 1 つずつ再作成します。

インプレースホットアップグレードを実行します。

スケーリング範囲

すべての Pod をアップグレードまたはダウングレードします。

個別にアップグレードまたはダウングレードします。

適用可能なワークロード

  • Deployment。

  • StatefulSet (効果は限定的)。

  • CronJob。

  • Deployment。

  • StatefulSet。

  • Job (avpa0.2.0 でサポート)。

  • selector を設定して、任意のワークロードが作成した Pod を選択します。(avpa0.3.0 でサポート)

使用シナリオ

長期的でバランスの取れたワークロードの変更。

周期的なワークロードの変更、予期しないワークロードの変動、および不均衡なワークロード。

使用シナリオ

  • ゲーム事業:周期的に変動する 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 負荷に基づく垂直スケーリングを実行します。

image

サンプルワークロードは、トラフィック Ingress として Service を使用し、負荷シミュレーションツールを備えています。このツールは、API をトリガーすることで、6,000 秒以内に 500 ミリコア (0.5 コア) などの指定量の CPU リソースを消費させることができます。

操作手順

ステップ 1:インプレーススケーリングのフィーチャーゲートの有効化

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

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

  3. [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:ワークロードのデプロイとローカル接続の作成

  1. 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
  2. ワークロードをデプロイします。

    kubectl apply -f hello-avpa.yaml
    kubectl apply -f shadow-hello-avpa.yaml
  3. kubectl 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 リソースを作成して、弾性スケーリングを設定できます。

  1. 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:しきい値情報。

      • typeUtilization に設定します。

      • 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: DoesNotExist

    1 つのワークロードにのみ作用する scaleTargetRef とは異なり、selector は任意の Pod を選択して、さまざまなシナリオのスケーリング要件を満たすことができます。

    パラメーター

    必須

    説明

    selector

    いいえ

    selectorscaleTargetRef は相互に排他的です。selector を使用すると AVPA の設定が簡素化され、特定のタイプのワークロードによって作成された Pod を一元管理できます。これにより、各ワークロードに対して AVPA を設定する必要がなくなります。

    metrics.containerResource

    はい

    メトリクスが収集されるリソースのタイプと使用率のしきい値を指定します。

    • container:メトリクスが収集されるコンテナの名前。

    説明

    ワイルドカード文字 (*) を入力して、すべてのコンテナに一致させることができます。

    コンテナがワイルドカード式と特定のコンテナ一致ルールの両方に一致する場合、コンテナ一致ルールが優先されます。

    • name:収集するメトリクスの名前。CPU メトリクスのみがサポートされています。

    • target:しきい値情報。

      • typeUtilization に設定します。

      • 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'
    
  2. 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-avpa

    spec.behavior パラメーターでは、scaleDownscaleUp はそれぞれスケールダウンとスケールアップのリソースポリシーを記述します。含まれるサブパラメーターは、どちらも同じ意味を持ちます。

    パラメーター

    必須

    説明

    policies[].type

    いいえ

    • Cpus:CPU スケーリングステップの絶対値。

    • CpuPercent:現在のリソース仕様に対するパーセンテージとして CPU スケーリングステップを指定します。

    policies[].value

    いいえ

    • typeCpus に設定されている場合、この設定を使用します。値は 250m1 などに設定できます。

    • typeCpuPercent に設定されている場合、この設定を使用します。値は 5% などのパーセンテージで指定します。

    selectPolicy

    いいえ

    スケーリングステップの計算ポリシーです。有効な値は次のとおりです。

    • Max:複数のポリシーが設定されている場合、最大値をターゲットのステップサイズとして使用します。

    • Min:複数のポリシーが設定されている場合、最小値をターゲットのステップサイズとして使用します。

    metricObserveWindowSeconds

    いいえ

    データ収集の時間枠。収集されたメトリクスがこの時間枠にまたがる場合、システムは負荷を計算し、スケーリングを実行するかどうかを決定します。単位は秒です。デフォルト値は 600 秒、最小値は 300 秒です。

    behavior.parallelism

    いいえ

    スケーリングの並列度。同時にスケーリングされる Pod の数で、デフォルト値は 1 です。

    behavior.stabilizationWindowSeconds

    いいえ

    スケーリングのクールダウン期間は秒単位で指定され、デフォルト値は 600、最小値は 300 です。また、クールダウン期間がデータ収集ウィンドウ metricObserveWindowSeconds より短くならないようにする必要があります。

    スケーリングが必要な場合、AVPA はデフォルトポリシーを使用してターゲットリソース仕様を計算します。このポリシーでは、highWaterMarklowWaterMark の平均値をターゲット負荷レベルとして使用し、スケールアップまたはスケールダウンのスケーリングステップを計算します。たとえば、1 vCPU のコンテナで、上限しきい値と下限しきい値がそれぞれ 6040 に設定され、現在の使用率が 100% の場合、ターゲット使用率は 50% になります。期待されるスケールアップステップは 1 vCPU となり、コンテナは 2 vCPU にスケールアップされます。

    スケーリングが必要な場合、AVPA はデフォルトのポリシーを使用してターゲットリソース仕様を計算します。スケールアップまたはスケールダウンのスケーリングステップは、 と の平均をターゲット負荷レベルとして計算されます。たとえば、 コンテナの場合、高しきい値と低しきい値がそれぞれ と に設定され、現在の使用率が の場合、ターゲット使用率は です。予想されるスケールアップステップは で、コンテナを にスケールアップします。

    説明

    推奨設定:急速なスケールアップと段階的なスケールダウンを推奨します。これにより、リソースをゆっくり解放することで安定性を維持しながら、増加する負荷要求に迅速に対応できます。

    scaleUp:ワークロード要件をより少ないスケーリング回数で満たすために、比較的大きな増分でスケールアップします。例: type: Cpusvalue: 1

    scaleDown:負荷が減少するにつれて、安定性を向上させるためにリソースを小さな増分で段階的にスケールダウンします。例: type: Cpusvalue: 250m

  3. YAML ファイルをデプロイします。

    kubectl apply -f avpa.yaml

手順5:ストレステストの実行

トラフィック Ingress を通じてバックエンド Pod にリクエストを送信し、CPU 負荷を生成します。同じリソース仕様と負荷に基づいて、AVPA が有効になる前後のワークロード監視データを確認します。

  1. リクエストを送信して負荷を生成します。

    現在のテスト 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
  2. メトリクスデータを監視します。

    左側のナビゲーションペインで、操作 > Prometheus 監視 をクリックします。アプリケーションのモニタリング > デプロイ詳細 タブで、監視データを表示します。

    1. CPU 負荷は継続的に増加し、しきい値に達します。10 分後、CPU リソースは 3.2 vCPU にスケールアップされます。30 分後、CPU リソースは 4 vCPU にスケールアップされます。スケールアップ後、CPU 負荷は大幅に低下します。

      image

    2. シャドウワークロードの負荷を監視します。CPU リソースは短時間で枯渇します。

      image

  3. Pod イベントを表示します。

    Pod イベントには、スケーリング中の YAML テンプレートの設定変更が表示されます。

    [Events] タブで、[Pod] サブタブを選択します。StartingVerticalScalingPodInplaceResizingInplaceResizedFinishedFinishedVerticalScalingPod など、垂直スケーリングに関連するイベントを確認できます。イベントから、CPU リクエストが 2 から 3,200m3,500m、そして最終的に 4 にスケールアップしたことがわかります。インプレース調整プロセス全体には約 34〜36 秒かかります。

  4. 低負荷によるスケールダウン動作をシミュレートします。

    CPU 負荷がしきい値を下回ると、CPU リソースはスケールダウンされます。

    • 負荷がスケールダウンのしきい値に達した後、安定性を確保するために、CPU リソースは指定されたステップでスケールダウンされます。

    • 負荷が一貫して低いレベルで維持される場合、コンテナリソースは AVPA 設定で設定された最小仕様 1 vCPU にスケーリングされます。

    image

(オプション) 手順6:リソースの削除

  1. ワークロード、Service、および AVPA リソースを削除します。

    kubectl delete -f hello-avpa.yaml
    kubectl delete -f shadow-hello-avpa.yaml
  2. 左側のナビゲーションペインで、[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 でスケーリングの失敗を照会できます。

説明

これらのイベントに対してアラートルールを作成できます。詳細については、「アラートルールの作成」をご参照ください。