垂直 Pod 自動スケーリングを構成する

垂直 Pod 自動スケーリングは、Kubernetes Pod 内のコンテナの CPU リソースとメモリリソースのリクエストと上限の設定を自動化します。垂直 Pod 自動スケーリングは、過去と現在のリソース使用量を分析して推奨事項を提示します。この推奨事項は、表示することも、Pod を更新して自動的に適用することもできます。この機能は、リソース割り当てを適切なサイズに調整することで、安定性と費用対効果を向上させます。

始める前に

垂直 Pod 自動スケーリングを構成する前に、次の前提条件を満たしていることを確認してください。

  • ベアメタル クラスタが実行されている。
  • クラスタに対する kubectl アクセス権がある。
  • Metrics Server がクラスタで使用可能である。ベアメタル クラスタには、デフォルトで Metrics Server が含まれています。

垂直 Pod 自動スケーリングを有効にする

プレビュー アノテーションを設定し、クラスタ仕様を構成して、ベアメタル クラスタで垂直 Pod 自動スケーリングを有効にします。

  1. Cluster カスタム リソースにプレビュー アノテーションを追加または更新します。

    Cluster カスタム リソースを直接編集するか、クラスタ構成ファイルを変更して bmctl update を使用します。

    metadata:
      annotations:
        preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
    
  2. Cluster カスタム リソースの spec を変更して verticalPodAutoscaling フィールドを含め、enableUpdater モードと enableMemorySaver モードを指定します。

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: cluster1
      namespace: cluster-cluster1
      annotations:
        preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
    spec:
      # ... other cluster spec fields
      verticalPodAutoscaling:
        enableUpdater: true       # Set to true for automated updates
        enableMemorySaver: true   # Set to true to reduce recommender memory usage
    
  3. クラスタ構成ファイルを変更した場合は、次のコマンドを使用して変更を適用します。

    bmctl update cluster -c CLUSTER_NAME --kubeconfig KUBECONFIG
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。

    • KUBECONFIG: クラスタの kubeconfig ファイルのパス。

VerticalPodAutoscaler カスタム リソースを作成する

クラスタで垂直 Pod 自動スケーリングを有効にしたら、特定のワークロードをターゲットにする VerticalPodAutoscaler カスタム リソースを定義します。

  1. ターゲット ワークロードと同じ Namespace に VerticalPodAutoscaler リソースを定義します。

    このカスタム リソースは、targetRef とリソース ポリシーを使用して、ターゲットとする Pod を指定します。

    apiVersion: "autoscaling.k8s.io/v1"
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: hamster
      resourcePolicy:
        containerPolicies:
          -   containerName: '*'
            minAllowed:
              cpu: 100m
              memory: 50Mi
            maxAllowed:
              cpu: 1
              memory: 500Mi
            controlledResources: ["cpu", "memory"]
    
  2. 次のコマンドを使用して VerticalPodAutoscaler マニフェストを適用します。

    kubectl apply -f VPA_MANIFEST \
        --kubeconfig KUBECONFIG
    

    次のように置き換えます。

    • VPA_MANIFEST: VerticalPodAutoscaler マニフェスト ファイルのパス。

    • KUBECONFIG: クラスタの kubeconfig ファイルのパス。

垂直 Pod 自動スケーリング モードについて

垂直 Pod 自動スケーリングは、リソースの推奨事項の適用方法を制御するさまざまなモードで動作します。

レコメンデーション モード

レコメンデーション モードでは、垂直 Pod 自動スケーリングによってレコメンダー コンポーネントがインストールされます。このコンポーネントは、リソース使用量を分析し、作成した VerticalPodAutoscaler カスタム リソースのステータス セクションに CPU とメモリのリクエストと上限の推奨値を公開します。

リソース リクエストと上限の推奨事項を表示するには、次のコマンドを使用します。

kubectl describe vpa VPA_NAME \
    --kubeconfig KUBECONFIG \
    -n CLUSTER_NAMESPACE
Replace the following:

*   `VPA_NAME`: the name of the `VerticalPodAutoscaler`
    that's targeting the workloads for which you are considering resource
    adjustments.

*   `KUBECONFIG`: the path of the cluster kubeconfig
    file.

*   `CLUSTER_NAMESPACE`: the name of the cluster that's
    running vertical Pod autoscaling.

レスポンスには、次の例のような Status セクションが含まれます。

Status:
  Conditions:
    Last Transition Time:  2025-08-04T23:53:32Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     100m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     1
        Memory:  500Mi

このモードでは、Pod は自動的に更新されません。これらの推奨事項を使用して、Pod 構成を手動で更新します。enableUpdater が設定されていないか、false の場合、これがデフォルトの動作です。

自動更新モード

enableUpdater enableUpdatertrue に設定すると、ベアメタル ライフサイクル コントローラは、推奨事項に加えて、垂直 Pod 自動スケーリング アップデータとアドミッション コントローラ コンポーネントをデプロイします。アップデータは、現在のリソース リクエストが推奨事項から大幅に逸脱している Pod をモニタリングします。

VerticalPodAutoscaler リソースの更新ポリシーは、アップデータが推奨事項を適用する方法を指定します。デフォルトの更新モードは Auto です。これは、Updater が Pod の作成時に更新されたリソース設定を割り当てることを意味します。次の VerticalPodAutoscaler のサンプルは、更新モードを Initial に設定する方法を示しています。

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: hamster-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: hamster
  resourcePolicy:
  updatePolicy:
    updateMode: "Initial"
    ...

アップデータは次の 5 つのモードをサポートしています。

  • Auto: アップデータが Pod を強制排除します。アドミッション コントローラは、新しい Pod の作成リクエストをインターセプトし、推奨事項で提供された推奨 CPU 値とメモリ値を使用するように変更します。リソースを更新するには Pod を再作成する必要があります。これにより、中断が発生する可能性があります。アップデータが尊重する Pod Disruption Budget を使用して、エビクション プロセスを管理します。このモードは Recreate と同じです。

  • Recreate: アップデータは、Pod が再作成されるときに Pod を強制排除し、推奨されるリソース リクエストと上限を割り当てます。

  • InPlaceOrRecreate(アルファ版): アップデータはベスト エフォートでインプレース アップデートを試みますが、インプレース アップデートが不可能な場合は Pod の再作成にフォールバックする可能性があります。詳細については、Pod のインプレース サイズ変更のドキュメントをご覧ください。

  • Initial: アップデータは Pod の作成時にのみリソース リクエストを割り当て、後で変更することはありません。

  • Off: アップデータは、Pod のリソース要件を自動的に変更しません。推奨値は計算され、VerticalPodAutoscaler オブジェクトで詳細を確認できます。

VerticalPodAutoscaler カスタム リソースの詳細については、kubectl を使用して、バージョン 1.33.0 以降のクラスタにインストールされている verticalpodautoscalercheckpoints.autoscaling.k8s.io カスタム リソース定義を取得します。

次のサンプルは、hamster コンテナの Status セクションにリソースの推奨事項が表示される方法を示しています。このサンプルには、Pod の削除イベントの例も示されています。このイベントは、更新プログラムが、推奨されるリソース構成を再作成された Pod に自動的に割り当てる前に Pod を削除したときに発生します。

Spec:
  Resource Policy:
    Container Policies:
      Container Name:  *
      Controlled Resources:
        cpu
        memory
      Max Allowed:
        Cpu:     1
        Memory:  500Mi
      Min Allowed:
        Cpu:     100m
        Memory:  50Mi
  Target Ref:
    API Version:  apps/v1
    Kind:         Deployment
    Name:         hamster
  Update Policy:
    Update Mode:  Auto
Status:
  Conditions:
    Last Transition Time:  2025-08-04T23:53:32Z
    Status:                True
    Type:                  RecommendationProvided
  Recommendation:
    Container Recommendations:
      Container Name:  hamster
      Lower Bound:
        Cpu:     100m
        Memory:  262144k
      Target:
        Cpu:     587m
        Memory:  262144k
      Uncapped Target:
        Cpu:     587m
        Memory:  262144k
      Upper Bound:
        Cpu:     1
        Memory:  500Mi
Events:
  Type    Reason      Age   From         Message
  ----    ------      ----  ----         -------
  Normal  EvictedPod  49s   vpa-updater  VPA Updater evicted Pod hamster-7cb59fb657-lkrk4 to apply resource recommendation.

メモリセーバー モード

メモリ節約モードでは、垂直 Pod 自動スケーリングの推奨事項コンポーネントのメモリ使用量が削減されます。enableMemorySavertrue に設定すると、Recommender は、一致する VerticalPodAutoscaler カスタム リソースを持つ Pod の集計のみを追跡して計算します。

トレードオフとして、既存のワークロード用に新しい VerticalPodAutoscaler カスタム リソースを作成すると、レコメンダーが正確な推奨事項を提供するために十分な履歴を収集するのに時間がかかります(最大 24 時間)。このモードは、ほとんどのクラスタタイプでデフォルトで false ですが、エッジクラスタではデフォルトで true になります。

垂直 Pod 自動スケーリングを無効にする

クラスタからカスタム リソースと構成を削除して、垂直 Pod 自動スケーリングを無効にします。

  1. 作成した VerticalPodAutoscaler カスタム リソースを削除します。

  2. Cluster カスタム リソースを変更し、spec から verticalPodAutoscaling セクション全体を削除します。

    Cluster カスタム リソースを直接編集するか、クラスタ構成ファイルを変更して bmctl update を使用できます。

  3. Cluster カスタム リソースから preview.baremetal.cluster.gke.io/vertical-pod-autoscaler アノテーションを削除します。

制限事項

垂直 Pod 自動スケーリングを使用する場合は、次の制限事項を考慮してください。

  • ワークロードの実際のメモリ使用量の可視性が制限されているので、JVM ベースのワークロードには垂直 Pod 自動スケーリングをまだ使用できません。
  • 更新ツールでは、Deployment が Pod を更新されたリソース値に置き換えるために、Pod レプリカが 2 つ以上必要です。
  • メモリ不足(OOM)エラーによりクラッシュ ループが発生している Pod は、アップデータによってすぐに更新されません。
  • Pod の InPlaceOrRecreate 更新ポリシーは、垂直 Pod 自動スケーリング内のアルファ版機能です。ベスト エフォートでインプレース更新を試みますが、インプレース更新ができない場合は Pod の再作成にフォールバックする可能性があります。

次のステップ