垂直 Pod 自動スケーリング

このページでは、垂直 Pod 自動スケーリングについて概説します。また、VerticalPodAutoscaler カスタム リソースとそれに関連するタイプの参考資料も記載しています。

垂直 Pod 自動スケーリングの構成方法も併せてご覧ください。

概要

垂直 Pod 自動スケーリングを使用すると、コンテナの CPU のリクエストと上限、およびメモリのリクエストと上限に対してどの値を指定するか、自分で考える必要がなくなります。オートスケーラーは、CPU リクエストの値とメモリのリクエストと制限の値を推奨したり、それらの値を自動的に更新したりできます。

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

  • Pod が必要な分のリソースのみを使用するため、クラスタノードを効率的に利用できます。

  • Pod は、適切な量のリソースが利用可能なノードにスケジュールされます。

  • CPU リクエストやメモリ リクエストの適切な値を求めるために、時間のかかるベンチマーク タスクを実施する必要がありません。

  • オートスケーラーによって時間の経過とともに CPU リクエストとメモリ リクエストが自動的に調整されるので、人手によるメンテナンス時間を節約できます。

Google Kubernetes Engine(GKE)の垂直 Pod 自動スケーリングは、Kubernetes オープンソース オートスケーラーに比べて次のようなメリットをもたらします。

  • 推奨サイズを決定する際は、ノードサイズとリソースの割り当ての最大量を考慮する必要があります。

  • クラスタの容量を調整するようにクラスタ オートスケーラーに通知します。

  • 過去のデータを使用して、垂直 Pod 自動スケーリングを有効化する前に収集された指標を提供します。

  • ワーカーノードにデプロイする代わりに、垂直 Pod 自動スケーリング Pod をコントロール プレーン プロセスとして実行します。

垂直 Pod 自動スケーリングの制限事項

  • 垂直 Pod 自動スケーリングがサポートする VerticalPodAutoscaler オブジェクトの数は、1 クラスタあたり最大 500 です。

  • 垂直 Pod 自動スケーリングは、バージョン 1.12.6 以降、リージョン クラスタでサポートされます。

  • 水平 Pod 自動スケーリングと垂直 Pod 自動スケーリングを併用する場合、多次元 Pod 自動スケーリングを使用します。また、カスタム指標外部指標でも、水平 Pod 自動スケーリングと垂直 Pod 自動スケーリングを併用できます。

  • ワークロードの実際のメモリ使用量の可視性が制限されているので、JVM ベースのワークロードには垂直 Pod 自動スケーリングをまだ使用できません。

  • 垂直 Pod 自動スケーリングは、挿入されたサイドカーに対して自動的に推奨を適用できません。"Off" 以外の updateMode で挿入されたサイドカーを含む Pod の VerticalPodAutoscaler オブジェクトを作成する場合は、コンテナ リソース ポリシーを使用してサイドカーをオプトアウトする必要があります。リファレンス セクションの ContainerResourcePolicy特定のコンテナをオプトアウトする方法をご覧ください。

    既知の問題の 1 つは、Istio とともに垂直 Pod 自動スケーリングを使用することです。この制限は Istio サイドカーに影響します。この問題を解決するには、VerticalPodAutoscaler 仕様定義を次のように拡張して Istio サイドカーをオプトアウトします。

    resourcePolicy:
      containerPolicies:
      - containerName: istio-proxy
        mode: "Off"
    

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

Kubernetes の制限により、実行中の Pod のリソース リクエストを変更するには、その Pod を再作成しなければなりません。updateMode"Auto" である VerticalPodAutoscaler を作成した場合、Pod のリソース リクエストを変更する必要が生じると VerticalPodAutoscaler は Pod を強制排除します。

再起動する Pod の数を制限するには、Pod 停止予算を使用します。

クラスタが新しいサイズのワークロードを確実に処理できるようにするには、クラスタ オートスケーラーノード自動プロビジョニングを使用します。垂直 Pod 自動スケーリングは更新の前にクラスタ オートスケーラーに通知し、サイズ変更されたワークロードに必要なリソースは、再作成の前に提供され、中断時間を最小限に抑えます。

参照

VerticalPodAutoscaler v1 autoscaling.k8s.io

項目

TypeMeta

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

metadata

ObjectMeta

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

spec

VerticalPodAutoscalerSpec

VerticalPodAutoscaler の動作。

status

VerticalPodAutoscalerStatus

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

VerticalPodAutoscalerSpec v1 autoscaling.k8s.io

項目
targetRef

CrossVersionObjectReference

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

updatePolicy

PodUpdatePolicy

ポッドの起動時に推奨アップデートを適用するかどうか、またポッドのライフサイクル期間中に推奨アップデートを適用するかどうかを指定します。

resourcePolicy

PodResourcePolicy

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

VerticalPodAutoscalerList v1 autoscaling.k8s.io

項目

TypeMeta

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

metadata

ObjectMeta

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

items

VerticalPodAutoscaler array

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

PodUpdatePolicy v1 autoscaling.k8s.io

項目
updateMode

string

ポッドの起動時に推奨アップデートを適用するかどうか、またポッドのライフサイクル期間中に推奨アップデートを適用するかどうかを指定します。有効な値は、「Off」、「Initial」、「Recreate」、「Auto」です。

PodResourcePolicy v1 autoscaling.k8s.io

項目
containerPolicies

ContainerResourcePolicy array

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

ContainerResourcePolicy v1 autoscaling.k8s.io

項目
containerName

string

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

mode

ContainerScalingMode

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

minAllowed

ResourceList

そのコンテナで許容される CPU リクエストとメモリ リクエストの最小値を指定します。

maxAllowed

ResourceList

そのコンテナで許容される CPU リクエストとメモリ リクエストの最大値を指定します。

ControlledResources

[]ResourceName

VPA によって計算される(および適用される可能性のある)最適化案の種類を指定します。空の場合、デフォルトの [ResourceCPU, ResourceMemory] が使用されます。

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

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

次のステップ