垂直 Pod 自動スケーリング

このページでは、垂直 Pod 自動スケーリングを使用して、リソース割り当ての分析と最適化を行い、Google Kubernetes Engine(GKE)でワークロードの効率を改善する方法について説明します。ワークロードのリソース使用状況の経時的な変化を分析することで、最適化の推奨事項を取得し、Pod 内のコンテナの CPU リクエスト、メモリ リクエスト、上限を自動的に調整できます。

このページでは、垂直 Pod 自動スケーリングの仕組み、そのメリットと制限事項、使用に関するベスト プラクティスについて説明します。また、VerticalPodAutoscaler カスタム リソースとそれに関連するタイプの API リファレンスを提供します。

このページは、クラウド リソースのプロビジョニングと構成、ワークロードのデプロイ、アプリケーションのスケーリング管理を行うオペレーターとデベロッパーを対象としています。一般的なロールの詳細については、一般的な GKE ユーザーロールとタスクをご覧ください。

このページを読む前に、Kubernetes のリソース リクエストと上限について理解しておいてください。

リソース使用量の急増に対応して迅速なスケーリングが必要な場合は、HorizontalPodAutoscaler を使用します。

自動スケーリングのベスト プラクティスについては、コストが最適化された Kubernetes アプリケーションを GKE で実行するためのベスト プラクティスをご覧ください。

垂直 Pod 自動スケーリングの仕組み

垂直 Pod 自動スケーリングを使用すると、Pod に必要な CPU リソースとメモリリソースを分析して設定できます。Pod 内のコンテナに最新の CPU のリクエストと制限メモリのリクエストと制限を設定する代わりに、垂直 Pod 自動スケーリングを構成して CPU とメモリのリクエストおよび制限の推奨値を指定します。これらの推奨値は、Pod を手動で更新するときに使用できます。または、値を自動的に更新するように垂直 Pod 自動スケーリングを構成することもできます。

垂直 Pod 自動スケーリングは、Autopilot クラスタではデフォルトで有効になっています。

垂直 Pod 自動スケーリングのモード

異なる更新モードを適用することで、垂直 Pod 自動スケーリングがリソースの変更をどのように適用するかを構成できます。

AutoRecreate)モード

Recreate モードでは、Pod のリソース リクエストを変更する必要が生じると、その Pod が強制排除されます。1.33 より前のバージョンの Kubernetes の制限により、実行中の Pod のリソース リクエストを変更する唯一の方法は Pod を再作成することであるため、Pod の強制排除が必要になります。

再作成する Pod の数を制限するには、Pod Disruption Budget を使用します。クラスタが新しいサイズのワークロードを確実に処理できるようにするには、クラスタ オートスケーラーノード自動プロビジョニングを使用します。

中断時間を最小限に抑えるため、更新の前に垂直 Pod 自動スケーリングからクラスタ オートスケーラーに通知がなされ、ワークロードを再作成する前に、サイズ変更されたワークロードに必要なリソースが提供されます。

Initial モード

Initial が有効になっている場合は、Pod の作成時にのみリソース リクエストが割り当てられます。Pod の作成後にリソース リクエストが変更されることはありません。

InPlaceOrRecreate モード

InPlaceOrRecreate モードは、サービスの中断を短縮することを狙いとしており、Pod を再作成せずに Pod リソースの更新を試みます。中断がゼロになることは保証されませんが、垂直 Pod 自動スケーリングのメリットを享受しながら中断を短縮できます。

InPlaceOrRecreate モードを使用するには、VerticalPodAutoscaler オブジェクトで spec.updatePolicy.updateMode フィールドを "InPlaceOrRecreate" に設定します。

インプレース更新が不可能と判断された場合は、Auto モードの動作に戻ります。つまり、変更を適用するために Pod が強制排除されてから再作成されます。

InPlaceOrRecreate モードは、Kubernetes バージョン 1.34.0-gke.1709000 以降で使用できます。

InPlaceOrRecreate モードの動作と既存の制限事項の詳細については、インプレース更新に関する Kubernetes のお知らせをご覧ください。

利点

垂直 Pod 自動スケーリングには次のような利点があります。

  • ワークロードに適切なリソースのリクエストと制限を設定することで、安定性とコスト効率が向上します。Pod のリソースサイズがワークロードに必要なサイズよりも小さい場合、アプリケーションが抑制されたり、メモリ不足エラーのために失敗したりする可能性があります。リソースはサイズが大きすぎると無駄に消費され、結果として請求額も大きくなります。
  • Pod が必要な分のリソースのみを使用するため、クラスタノードを効率的に利用できます。
  • Pod は、適切な量のリソースが利用可能なノードにスケジュールされます。
  • CPU リクエストやメモリ リクエストの適切な値を求めるために、時間のかかるベンチマーク タスクを実施する必要がありません。
  • オートスケーラーによって時間の経過とともに CPU リクエストとメモリ リクエストが自動的に調整されるため、人手によるメンテナンス時間が短縮されます

GKE の垂直 Pod 自動スケーリングには、Kubernetes オープンソース オートスケーラーに比べて次のような利点があります。

  • 推奨サイズを決定する際は、ノードサイズとリソースの割り当ての最大量を考慮する必要があります。
  • クラスタの容量を調整するようにクラスタ オートスケーラーに通知します。
  • 過去のデータを使用して、垂直 Pod オートスケーラーを有効にする前に収集された指標を提供します。
  • ワーカーノードにデプロイする代わりに、垂直 Pod オートスケーラー Pod をコントロール プレーン プロセスとして実行します。

制限事項

  • 水平 Pod 自動スケーリングと垂直 Pod 自動スケーリングを併用する場合、多次元 Pod 自動スケーリングを使用します。また、カスタム指標外部指標でも、水平 Pod 自動スケーリングと垂直 Pod 自動スケーリングを併用できます。
  • ワークロードの実際のメモリ使用量の可視性が制限されているので、JVM ベースのワークロードには垂直 Pod 自動スケーリングをまだ使用できません。
  • 垂直 Pod 自動スケーリングのデフォルト設定では、Deployment が Pod を更新されたリソース値に置き換えるために、最小レプリカ数は 2 に設定されています。GKE バージョン 1.22 以降では、PodUpdatePolicy フィールドに minReplicas の値を指定することで、この設定をオーバーライドできます。
  • 垂直 Pod 自動スケーリングの InPlaceOrRecreate 更新モードを使用している場合に、インプレース更新が不可能なときには(たとえば、ノード容量を超えて Pod をアップスケールしようとしたとき)、推奨事項を適用するために Pod が強制排除されてから再作成されます。再作成を回避するために仕様で resizePolicy が設定されている Pod でも、強制排除と再作成が行われます。

ベスト プラクティス

  • クラスタの更新の中断を回避するには、クラスタあたりの VerticalPodAutoscaler オブジェクト数を 1,000 未満に保持することをおすすめします。
  • 垂直 Pod 自動スケーリングは、長時間実行される同種ワークロードで最適に機能します。

API リファレンス

これは v1 API リファレンスです。このバージョンの API を使用することを強くおすすめします。

VerticalPodAutoscaler v1 autoscaling.k8s.io

フィールド

TypeMeta

API グループ、バージョン、種類。

metadata

ObjectMeta

標準のオブジェクト メタデータ

spec

VerticalPodAutoscalerSpec

VerticalPodAutoscaler の目的の動作。

status

VerticalPodAutoscalerStatus

直近に観測された VerticalPodAutoscaler のステータス。

VerticalPodAutoscalerSpec v1 autoscaling.k8s.io

フィールド
targetRef

CrossVersionObjectReference

Deployment や StatefulSet など、オートスケーラーで制御する Pod のセットを管理するコントローラへのリファレンス。スケール サブリソースを含む任意のコントローラで VerticalPodAutoscaler を指定できます。通常、VerticalPodAutoscaler はコントローラの ScaleStatus から Pod セットを取得します。DaemonSet など、よく知られているコントローラの場合、VerticalPodAutoscaler はそのコントローラの仕様から Pod セットを取得します。

updatePolicy

PodUpdatePolicy

Pod の起動時に推奨更新を適用するかどうか、また Pod のライフサイクル期間中に推奨更新を適用するかどうかを指定します。

resourcePolicy

PodResourcePolicy

個々のコンテナに対する CPU リクエストおよびメモリ リクエストの調整方法に関するポリシーを指定します。リソース ポリシーを使用して、個々のコンテナの推奨事項に制約を設定できます。指定されていない場合、オートスケーラーは、追加の制約なしに、Pod 内のすべてのコンテナの推奨リソースを計算します。

recommenders

VerticalPodAutoscalerRecommenderSelector array

この VPA オブジェクトに関する推奨事項を生成する Recommender。GKE によって指定されるデフォルトの Recommender を使用するには、空のままにします。それ以外の場合、リストには、ユーザーが指定する代替 Recommender のエントリを 1 つのみ配置できます。GKE 1.22 以降でサポートされます。

VerticalPodAutoscalerList v1 autoscaling.k8s.io

フィールド

TypeMeta

API グループ、バージョン、種類。

metadata

ObjectMeta

標準のオブジェクト メタデータ

items

VerticalPodAutoscaler array

VerticalPodAutoscaler オブジェクトのリスト。

PodUpdatePolicy v1 autoscaling.k8s.io

フィールド
updateMode

string

Pod の起動時に推奨更新を適用するかどうか、また Pod のライフサイクル期間中に推奨更新を適用するかどうかを指定します。使用できる値は次のとおりです。

  • "Off": 推奨更新は生成されますが、Pod に自動的に適用されません。
  • "Initial": 推奨更新は、Pod の初回起動時にのみ適用されます。Pod の実行中に発生した更新は自動的に適用されません。
  • "Recreate": 推奨更新は、Pod を再作成することによって適用されます。既存の Pod が終了し、更新された構成を使用して新しい Pod が作成されます。
  • "Auto": "Recreate" モードを実質的に強制するデフォルト値。
  • "InPlaceOrRecreate": 可能であれば、Pod を再作成せずに推奨更新を適用します。
minReplicas

int32

Pod の強制排除を試みる際に存続している必要があるレプリカの最小数(Pod Disruption Budget などの他のチェックは保留になります)。正の値のみを使用できます。デフォルトは 2 です。 GKE 1.22 以降でサポートされます。

PodResourcePolicy v1 autoscaling.k8s.io

フィールド
containerPolicies

ContainerResourcePolicy array

個々のコンテナに対するリソース ポリシーの配列。名前付きのコンテナごとに最大で 1 つのエントリを作成できます。また、必要に応じて、個別のポリシーを持たないすべてのコンテナを処理する「containerName = '*'」のワイルドカード エントリを 1 つ指定できます。

ContainerResourcePolicy v1 autoscaling.k8s.io

フィールド
containerName

string

ポリシーが適用されるコンテナの名前。指定しない場合、そのポリシーはデフォルト ポリシーとして機能します。

mode

ContainerScalingMode

コンテナの起動時に推奨アップデートを適用するかどうか、またコンテナのライフサイクル期間中に推奨アップデートを適用するかどうかを指定します。有効な値は「Off」と「Auto」です。値を指定しない場合のデフォルトは「Auto」です。

minAllowed

ResourceList

そのコンテナで許容される CPU リクエストとメモリ リクエストの最小値を指定します。デフォルトでは、適用される最小値はありません。

maxAllowed

ResourceList

そのコンテナで許容される CPU リクエストとメモリ リクエストの最大値を指定します。デフォルトでは、適用される最大値はありません。

ControlledResources

[]ResourceName

VerticalPodAutoscaler によって計算される(適用される可能性のある)推奨事項の種類を指定します。空の場合、デフォルトの [ResourceCPU, ResourceMemory] が使用されます。

VerticalPodAutoscalerRecommenderSelector v1 autoscaling.k8s.io

フィールド
name

string

このオブジェクトに関する推奨事項の生成を担当する Recommender の名前。

VerticalPodAutoscalerStatus v1 autoscaling.k8s.io

フィールド
recommendation

RecommendedPodResources

CPU リクエストおよびメモリ リクエストの最新の推奨値。

conditions

VerticalPodAutoscalerCondition array

VerticalPodAutoscaler の現在のステータスを示します。

RecommendedPodResources v1 autoscaling.k8s.io

フィールド
containerRecommendation

RecommendedContainerResources array

個々のコンテナに関するリソース推奨値からなる配列。

RecommendedContainerResources v1 autoscaling.k8s.io

フィールド
containerName

string

推奨値が適用されるコンテナの名前。

target

ResourceList

そのコンテナに対する CPU リクエストとメモリ リクエストの推奨値。

lowerBound

ResourceList

そのコンテナに対する CPU リクエストとメモリ リクエストの推奨値の下限。この値は、アプリケーションが安定して動作するのに十分であるとは限りません。CPU リクエストとメモリ リクエストがこの値に満たない場合、パフォーマンスや可用性に重大な影響を及ぼす可能性があります。

upperBound

ResourceList

そのコンテナに対する CPU リクエストとメモリ リクエストの推奨値の上限。CPU リクエストとメモリ リクエストをこの値より大きくしても、無駄になる可能性があります。

uncappedTarget

ResourceList

オートスケーラーによって計算された最新のリソース推奨値。これは実際のリソース使用量に基づいており、ContainerResourcePolicy は考慮されません。実際のリソース使用量に基づく値が ContainerResourcePolicy に違反する場合は、推奨範囲から外れる可能性があります。このフィールドは、実際のリソース割り当てには影響しません。ステータスの表示にのみ使用されます。

VerticalPodAutoscalerCondition v1 autoscaling.k8s.io

フィールド
type

VerticalPodAutoscalerConditionType

記述する状態のタイプ。有効な値は、「RecommendationProvided」、「LowConfidence」、「NoPodsMatched」、「FetchingHistory」です。

status

ConditionStatus

状態のステータス。有効な値は、「True」、「False」、「Unknown」です。

lastTransitionTime

Time

状態のステータスが最後に遷移した時刻。

reason

string

最後のステータス遷移の理由。

message

string

人間が読める文字列で記述された、最後のステータス遷移についての詳細情報。

次のステップ