2.5. Vertical Pod Autoscaler を使用した Pod リソースレベルの自動調整
OpenShift Container Platform の Vertical Pod Autoscaler Operator (VPA) は、Pod 内のコンテナーの履歴および現在の CPU とメモリーリソースを自動的に確認し、把握する使用値に基づいてリソース制限および要求を更新できます。VPA は個別のカスタムリソース (CR) を使用して、プロジェクトの Deployment
、DeploymentConfig
、StatefulSet
、Job
、DaemonSet
、ReplicaSet
、または ReplicationController
などのワークロードオブジェクトに関連付けられたすべての Pod を更新します。
VPA は、Pod に最適な CPU およびメモリーの使用状況を理解するのに役立ち、Pod のライフサイクルを通じて Pod のリソースを自動的に維持します。
2.5.1. Vertical Pod Autoscaler Operator について
Vertical Pod Autoscaler Operator (VPA) は、API リソースおよびカスタムリソース (CR) として実装されます。CR は、プロジェクトのデーモンセット、レプリケーションコントローラーなどの特定のワークロードオブジェクトに関連付けられた Pod について、VPA Operator が取るべき動作を判別します。
VPA Operator は 3 つのコンポーネントで構成されており、それぞれのコンポーネントが VPA namespace に独自の Pod を持ちます。
- レコメンダー
- VPA レコメンダーは、現在および過去のリソース消費を監視し、そのデータに基づき、関連付けられたワークロードオブジェクト内の Pod に最適な CPU およびメモリーリソースを決定します。
- アップデーター
- VPA アップデーターは、関連付けられたワークロードオブジェクト内の Pod に正しいリソースがあるか確認します。リソースが正しい場合、アップデーターは何も行いません。リソースが正しくない場合、コントローラーが更新されたリクエストを使用して Pod を再作成できるように、アップデーターが Pod を強制終了します。
- アドミッションコントローラー
- VPA アドミッションコントローラーは、それが新しい Pod か VPA アップデーターのアクションによりコントローラーが再作成した Pod かにかかわらず、関連付けられたワークロードオブジェクト内の新しい Pod ごとに正しいリソースリクエストを設定します。
デフォルトの推奨インストーラーを使用するか、独自のアルゴリズムに基づいて自動スケーリングを実行するために独自の推奨手段を使用できます。
デフォルトのレコメンダーは、それらの Pod 内のコンテナーの履歴および現在の CPU とメモリーの使用状況を自動的に計算し、このデータを使用して、最適化されたリソース制限および要求を判別し、これらの Pod が常時効率的に動作していることを確認することができます。たとえば、デフォルトレコメンダーは使用している量よりも多くのリソースを要求する Pod のリソースを減らし、十分なリソースを要求していない Pod のリソースを増やします。
VPA は、一度に 1 つずつ、これらの推奨値で調整されていない Pod を自動的に削除するため、アプリケーションはダウンタイムなしに継続して要求を提供できます。ワークロードオブジェクトは、元のリソース制限および要求で Pod を再デプロイします。VPA は変更用の受付 Webhook を使用して、Pod がノードに許可される前に最適化されたリソース制限および要求で Pod を更新します。VPA が Pod を削除する必要がない場合は、VPA リソース制限および要求を表示し、必要に応じて Pod を手動で更新できます。
デフォルトで、ワークロードオブジェクトは、VPA が Pod を自動的に削除できるようにするためにレプリカを 2 つ以上指定する必要があります。この最小値よりも少ないレプリカを指定するワークロードオブジェクトは削除されません。これらの Pod を手動で削除すると、ワークロードオブジェクトが Pod を再デプロイします。VPA は推奨内容に基づいて新規 Pod を更新します。この最小値は、VPA の最小値の変更 に記載されているとおり、VerticalPodAutoscalerController
オブジェクトを変更して変更できます。
たとえば、CPU の 50% を使用する Pod が 10% しか要求しない場合、VPA は Pod が要求よりも多くの CPU を消費すると判別してその Pod を削除します。レプリカセットなどのワークロードオブジェクトは Pod を再起動し、VPA は推奨リソースで新しい Pod を更新します。
開発者の場合、VPA を使用して、Pod を各 Pod に適したリソースを持つノードにスケジュールし、Pod の需要の多い期間でも稼働状態を維持することができます。
管理者は、VPA を使用してクラスターリソースをより適切に活用できます。たとえば、必要以上の CPU リソースを Pod が予約できないようにします。VPA は、ワークロードが実際に使用しているリソースをモニターし、他のワークロードで容量を使用できるようにリソース要件を調整します。VPA は、初期のコンテナー設定で指定される制限と要求の割合をそのまま維持します。
VPA の実行を停止するか、クラスターの特定の VPA CR を削除する場合、VPA によってすでに変更された Pod のリソース要求は変更されません。新規 Pod は、VPA による以前の推奨事項ではなく、ワークロードオブジェクトで定義されたリソースを取得します。
2.5.2. Vertical Pod Autoscaler Operator のインストール
OpenShift Container Platform Web コンソールを使用して Vertical Pod Autoscaler Operator (VPA) をインストールすることができます。
手順
-
OpenShift Container Platform Web コンソールで、Operators
OperatorHub をクリックします。 - 利用可能な Operator のリストから VerticalPodAutoscaler を選択し、Install をクリックします。
-
Install Operator ページで、Operator recommended namespace オプションが選択されていることを確認します。これにより、Operator が必須の
openshift-vertical-pod-autoscaler
namespace にインストールされます。この namespace は存在しない場合は、自動的に作成されます。 - Install をクリックします。
検証
VPA Operator コンポーネントをリスト表示して、インストールを確認します。
-
Workloads
Pods に移動します。 -
ドロップダウンメニューから
openshift-vertical-pod-autoscaler
プロジェクトを選択し、4 つの Pod が実行されていることを確認します。 -
Workloads
Deployments に移動し、4 つのデプロイメントが実行されていることを確認します。
-
Workloads
オプション: 以下のコマンドを使用して、OpenShift Container Platform CLI でインストールを確認します。
$ oc get all -n openshift-vertical-pod-autoscaler
出力には、4 つの Pod と 4 つのデプロイメントが表示されます。
出力例
NAME READY STATUS RESTARTS AGE pod/vertical-pod-autoscaler-operator-85b4569c47-2gmhc 1/1 Running 0 3m13s pod/vpa-admission-plugin-default-67644fc87f-xq7k9 1/1 Running 0 2m56s pod/vpa-recommender-default-7c54764b59-8gckt 1/1 Running 0 2m56s pod/vpa-updater-default-7f6cc87858-47vw9 1/1 Running 0 2m56s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/vpa-webhook ClusterIP 172.30.53.206 <none> 443/TCP 2m56s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/vertical-pod-autoscaler-operator 1/1 1 1 3m13s deployment.apps/vpa-admission-plugin-default 1/1 1 1 2m56s deployment.apps/vpa-recommender-default 1/1 1 1 2m56s deployment.apps/vpa-updater-default 1/1 1 1 2m56s NAME DESIRED CURRENT READY AGE replicaset.apps/vertical-pod-autoscaler-operator-85b4569c47 1 1 1 3m13s replicaset.apps/vpa-admission-plugin-default-67644fc87f 1 1 1 2m56s replicaset.apps/vpa-recommender-default-7c54764b59 1 1 1 2m56s replicaset.apps/vpa-updater-default-7f6cc87858 1 1 1 2m56s
2.5.3. Vertical Pod Autoscaler Operator の使用について
Vertical Pod Autoscaler Operator (VPA) を使用するには、クラスター内にワークロードオブジェクトの VPA カスタムリソース (CR) を作成します。VPA は、そのワークロードオブジェクトに関連付けられた Pod に最適な CPU およびメモリーリソースを確認し、適用します。VPA は、デプロイメント、ステートフルセット、ジョブ、デーモンセット、レプリカセット、またはレプリケーションコントローラーのワークロードオブジェクトと共に使用できます。VPA CR はモニターする必要のある Pod と同じプロジェクトになければなりません。
VPA CR を使用してワークロードオブジェクトを関連付け、VPA が動作するモードを指定します。
-
Auto
およびRecreate
モードは、Pod の有効期間中は VPA CPU およびメモリーの推奨事項を自動的に適用します。VPA は、推奨値で調整されていないプロジェクトの Pod を削除します。ワークロードオブジェクトによって再デプロイされる場合、VPA はその推奨内容で新規 Pod を更新します。 -
Initial
モードは、Pod の作成時にのみ VPA の推奨事項を自動的に適用します。 -
Off
モードは、推奨されるリソース制限および要求のみを提供するので、推奨事項を手動で適用することができます。off
モードは Pod を更新しません。
CR を使用して、VPA 評価および更新から特定のコンテナーをオプトアウトすることもできます。
たとえば、Pod には以下の制限および要求があります。
resources: limits: cpu: 1 memory: 500Mi requests: cpu: 500m memory: 100Mi
auto
に設定された VPA を作成すると、VPA はリソースの使用状況を確認して Pod を削除します。再デプロイ時に、Pod は新規のリソース制限および要求を使用します。
resources: limits: cpu: 50m memory: 1250Mi requests: cpu: 25m memory: 262144k
以下のコマンドを実行して、VPA の推奨事項を表示できます。
$ oc get vpa <vpa-name> --output yaml
数分後に、出力には、以下のような CPU およびメモリー要求の推奨内容が表示されます。
出力例
... status: ... recommendation: containerRecommendations: - containerName: frontend lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 262m memory: "274357142" - containerName: backend lowerBound: cpu: 12m memory: 131072k target: cpu: 12m memory: 131072k uncappedTarget: cpu: 12m memory: 131072k upperBound: cpu: 476m memory: "498558823" ...
出力には、target
(推奨リソース)、lowerBound
(最小推奨リソース)、upperBound
(最大推奨リソース)、および uncappedTarget
(最新の推奨リソース) が表示されます。
VPA は lowerBound
および upperBound
の値を使用して、Pod の更新が必要であるかどうかを判別します。Pod のリソース要求が lowerBound
値を下回るか、upperBound
値を上回る場合は、VPA は終了し、target
値で Pod を再作成します。
2.5.3.1. VPA の最小値の変更
デフォルトで、ワークロードオブジェクトは、VPA が Pod を自動的に削除し、更新できるようにするためにレプリカを 2 つ以上指定する必要があります。そのため、2 つ未満を指定するワークロードオブジェクトの場合 VPA は自動的に機能しません。VPA は、Pod が VPA に対して外部にある一部のプロセスで再起動されると、これらのワークロードオブジェクトから新規 Pod を更新します。このクラスター全体の最小値の変更は、VerticalPodAutoscalerController
カスタムリソース (CR) の minReplicas
パラメーターを変更して実行できます。
たとえば、minReplicas
を 3
に設定する場合、VPA は 2 レプリカ以下のレプリカを指定するワークロードオブジェクトの Pod を削除せず、更新しません。
minReplicas
を 1
に設定する場合、VPA は 1 つのレプリカのみを指定するワークロードオブジェクトの Pod のみを削除できます。この設定は、VPA がリソースを調整するために Pod を削除するたびにワークロードがダウンタイムを許容できる場合のみ、単一のレプリカオブジェクトで使用する必要があります。1 つのレプリカオブジェクトで不要なダウンタイムを回避するには、podUpdatePolicy
を Initial
に設定して VPA CR を設定します。これにより、Pod は VPA の外部にある一部のプロセスで再起動される場合にのみ自動的に更新されます。または、Off
に設定される場合、アプリケーションの適切なタイミングで Pod を手動で更新できます。
VerticalPodAutoscalerController
オブジェクトの例
apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
creationTimestamp: "2021-04-21T19:29:49Z"
generation: 2
name: default
namespace: openshift-vertical-pod-autoscaler
resourceVersion: "142172"
uid: 180e17e9-03cc-427f-9955-3b4d7aeb2d59
spec:
minReplicas: 3 1
podMinCPUMillicores: 25
podMinMemoryMb: 250
recommendationOnly: false
safetyMarginFraction: 0.15
2.5.3.2. VPA の推奨事項の自動適用
VPA を使用して Pod を自動的に更新するには、updateMode
が Auto
または Recreate
に設定された特定のワークロードオブジェクトの VPA CR を作成します。
Pod がワークロードオブジェクト用に作成されると、VPA はコンテナーを継続的にモニターして、CPU およびメモリーのニーズを分析します。VPA は、CPU およびメモリーに関する VPA の推奨値を満たさない Pod を削除します。再デプロイ時に、Pod は VPA の推奨値に基づいて新規のリソース制限および要求を使用し、アプリケーションに設定された Pod の Disruption Budget (停止状態の予算) を反映します。この推奨事項は、参照用に VPA CR の status
フィールドに追加されます。
デフォルトで、ワークロードオブジェクトは、VPA が Pod を自動的に削除できるようにするためにレプリカを 2 つ以上指定する必要があります。この最小値よりも少ないレプリカを指定するワークロードオブジェクトは削除されません。これらの Pod を手動で削除すると、ワークロードオブジェクトが Pod を再デプロイします。VPA は推奨内容に基づいて新規 Pod を更新します。この最小値は、VPA の最小値の変更 に記載されているとおり、VerticalPodAutoscalerController
オブジェクトを変更して変更できます。
Auto
モードの VPA CR の例
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-recommender spec: targetRef: apiVersion: "apps/v1" kind: Deployment 1 name: frontend 2 updatePolicy: updateMode: "Auto" 3
- 1
- この VPA CR が管理するワークロードオブジェクトのタイプ。
- 2
- この VPA CR が管理するワークロードオブジェクトの名前。
- 3
- モードを
Auto
またはRecreate
に設定します。-
Auto
:VPA は、Pod の作成時にリソース要求を割り当て、要求されるリソースが新規の推奨事項と大きく異なる場合に、それらを終了して既存の Pod を更新します。 -
Recreate
:VPA は、Pod の作成時にリソース要求を割り当て、要求されるリソースが新規の推奨事項と大きく異なる場合に、それらを終了して既存の Pod を更新します。このモードはほとんど使用されることはありません。リソース要求が変更される際に Pod が再起動されていることを確認する必要がある場合にのみ使用します。
-
VPA によってリソースの推奨事項を決定し、推奨リソースを新しい Pod に適用するには、動作中の Pod がプロジェクト内に存在し、実行されている必要があります。
CPU やメモリーなどのワークロードのリソース使用量が安定している場合、VPA はリソースの推奨事項を数分で決定できます。ワークロードのリソース使用量が安定していない場合、VPA は正確な推奨を行うために、さまざまなリソース使用量の間隔でメトリクスを収集する必要があります。
2.5.3.3. Pod 作成時における VPA 推奨の自動適用
VPA を使用して、Pod が最初にデプロイされる場合にのみ推奨リソースを適用するには、updateMode
が Initial
に設定された特定のワークロードオブジェクトの VPA CR を作成します。
次に、VPA の推奨値を使用する必要のあるワークロードオブジェクトに関連付けられた Pod を手動で削除します。Initial
モードで、VPA は新しいリソースの推奨内容を確認する際に Pod を削除したり、更新したりしません。
Initial
モードの VPA CR の例
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-recommender spec: targetRef: apiVersion: "apps/v1" kind: Deployment 1 name: frontend 2 updatePolicy: updateMode: "Initial" 3
VPA によって推奨リソースを決定し、推奨事項を新しい Pod に適用するには、動作中の Pod がプロジェクト内に存在し、実行されている必要があります。
VPA から最も正確な推奨事項を取得するには、Pod が実行され、VPA が安定するまで少なくとも 8 日間待機してください。
2.5.3.4. VPA の推奨事項の手動適用
CPU およびメモリーの推奨値を判別するためだけに VPA を使用するには、updateMode
を off
に設定した特定のワークロードオブジェクトの VPA CR を作成します。
Pod がワークロードオブジェクト用に作成されると、VPA はコンテナーの CPU およびメモリーのニーズを分析し、VPA CR の status
フィールドにそれらの推奨事項を記録します。VPA は、新しい推奨リソースを判別する際に Pod を更新しません。
Off
モードの VPA CR の例
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-recommender spec: targetRef: apiVersion: "apps/v1" kind: Deployment 1 name: frontend 2 updatePolicy: updateMode: "Off" 3
以下のコマンドを使用して、推奨事項を表示できます。
$ oc get vpa <vpa-name> --output yaml
この推奨事項により、ワークロードオブジェクトを編集して CPU およびメモリー要求を追加し、推奨リソースを使用して Pod を削除および再デプロイできます。
VPA によって推奨リソースを決定し、推奨事項を新しい Pod に適用するには、動作中の Pod がプロジェクト内に存在し、実行されている必要があります。
VPA から最も正確な推奨事項を取得するには、Pod が実行され、VPA が安定するまで少なくとも 8 日間待機してください。
2.5.3.5. VPA の推奨事項をすべてのコンテナーに適用しないようにする
ワークロードオブジェクトに複数のコンテナーがあり、VPA がすべてのコンテナーを評価および実行対象としないようにするには、特定のワークロードオブジェクトの VPA CR を作成し、resourcePolicy
を追加して特定のコンテナーをオプトアウトします。
VPA が推奨リソースで Pod を更新すると、resourcePolicy
が設定されたコンテナーは更新されず、VPA は Pod 内のそれらのコンテナーの推奨事項を提示しません。
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-recommender spec: targetRef: apiVersion: "apps/v1" kind: Deployment 1 name: frontend 2 updatePolicy: updateMode: "Auto" 3 resourcePolicy: 4 containerPolicies: - containerName: my-opt-sidecar mode: "Off"
たとえば、Pod には同じリソース要求および制限の 2 つのコンテナーがあります。
# ... spec: containers: - name: frontend resources: limits: cpu: 1 memory: 500Mi requests: cpu: 500m memory: 100Mi - name: backend resources: limits: cpu: "1" memory: 500Mi requests: cpu: 500m memory: 100Mi # ...
backend
コンテナーがオプトアウトに設定された VPA CR を起動した後、VPA は Pod を終了し、frontend
コンテナーのみに適用される推奨リソースで Pod を再作成します。
... spec: containers: name: frontend resources: limits: cpu: 50m memory: 1250Mi requests: cpu: 25m memory: 262144k ... name: backend resources: limits: cpu: "1" memory: 500Mi requests: cpu: 500m memory: 100Mi ...
2.5.3.6. VPA Operator のパフォーマンスチューニング
クラスター管理者は、Vertical Pod Autoscaler Operator (VPA) のパフォーマンスを調整して、VPA が Kubernetes API サーバーにリクエストを行うレートを制限したり、VPA レコメンダー、アップデーター、アドミッションコントローラーコンポーネントの Pod の CPU とメモリーリソースを指定したりできます。
また、VPA カスタムリソース (CR) によって管理されているワークロードのみを監視するように VPA Operator を設定することもできます。デフォルトでは、VPA Operator はクラスター内のすべてのワークロードを監視します。これにより、VPA Operator は全ワークロードの 8 日間の履歴データを収集して保存できるようになり、Operator はワークロードに対して新しい VPA CR が作成された場合にこのデータを使用できます。ただし、その結果として VPA Operator は大量の CPU とメモリーを使用することになり、特に大規模なクラスターでは Operator が失敗する可能性があります。VPA Operator を、VPA CR を使用してワークロードのみを監視するように設定すると、CPU とメモリーのリソースを節約できます。この場合のトレードオフとして、実行中のワークロードがあり、そのワークロードを管理するために VPA CR を作成すると、VPA Operator にそのワークロードの履歴データはなくなります。その結果、最初の推奨事項は、ワークロードがしばらく実行された後の推奨事項ほど役に立ちません。
このようなチューニングにより、VPA がピーク効率で動作するのに十分なリソースを確保し、スロットル調整や Pod アドミッションの遅延が発生する可能性を防げます。
VerticalPodAutoscalerController
カスタムリソース (CR) を編集することで、VPA コンポーネントに対して以下のチューニングを行えます。
-
スロットル調整と Pod アドミッションの遅延を防ぐには、
kube-api-qps
パラメーターとkube-api-burst
パラメーターを使用して、Kubernetes API サーバーの VPA リクエストの 1 秒あたりのクエリー数 (QPS) とバーストレートを設定します。 -
十分な CPU とメモリーを確保するには、標準の
CPU
およびmemory
リソースリクエストを使用して、VPA コンポーネント Pod の CPU リクエストとメモリーリクエストを設定します。 -
VPA Operator を、VPA CR によって管理されているワークロードのみを監視するように設定するには、レコメンダーコンポーネントの
memory-saver
パラメーターをtrue
に設定します。
次の VPA コントローラー CR の例では、VPA API QPS とバートレートを設定し、コンポーネント Pod リソースリクエストを設定し、レコメンダーの memory-saver
を true
に設定します。
VerticalPodAutoscalerController
CR の例
apiVersion: autoscaling.openshift.io/v1 kind: VerticalPodAutoscalerController metadata: name: default namespace: openshift-vertical-pod-autoscaler spec: deploymentOverrides: admission: 1 container: args: 2 - '--kube-api-qps=30.0' - '--kube-api-burst=40.0' resources: requests: 3 cpu: 40m memory: 40Mi recommender: 4 container: args: - '--kube-api-qps=20.0' - '--kube-api-burst=60.0' - '--memory-saver=true' 5 resources: requests: cpu: 60m memory: 60Mi updater: 6 container: args: - '--kube-api-qps=20.0' - '--kube-api-burst=80.0' resources: requests: cpu: 80m memory: 80Mi minReplicas: 2 podMinCPUMillicores: 25 podMinMemoryMb: 250 recommendationOnly: false safetyMarginFraction: 0.15
- 1
- VPA アドミッションコントローラーのチューニングパラメーターを指定します。
- 2
- VPA アドミッションコントローラーの API QPS とバーストレートを指定します。
-
kube-api-qps
: Kubernetes API サーバーにリクエストを行うときの 1 秒あたりのクエリー数 (QPS) 制限を指定します。デフォルトは5.0
です。 -
kube-api-burst
: Kubernetes API サーバーにリクエストを行うときのバースト制限を指定します。デフォルトは10.0
です。
-
- 3
- VPA アドミッションコントローラー Pod の CPU リクエストとメモリーリクエストを指定します。
- 4
- VPA レコメンダーのチューニングパラメーターを指定します。
- 5
- VPA Operator が VPA CR を持つワークロードのみを監視するように指定します。デフォルトは
false
です。 - 6
- VPA アップデーターのチューニングパラメーターを指定します。
設定が各 VPA コンポーネント Pod に適用されたことを確認できます。
アップデーター Pod の例
apiVersion: v1 kind: Pod metadata: name: vpa-updater-default-d65ffb9dc-hgw44 namespace: openshift-vertical-pod-autoscaler # ... spec: containers: - args: - --logtostderr - --v=1 - --min-replicas=2 - --kube-api-qps=20.0 - --kube-api-burst=80.0 # ... resources: requests: cpu: 80m memory: 80Mi # ...
アドミッションコントローラー Pod の例
apiVersion: v1 kind: Pod metadata: name: vpa-admission-plugin-default-756999448c-l7tsd namespace: openshift-vertical-pod-autoscaler # ... spec: containers: - args: - --logtostderr - --v=1 - --tls-cert-file=/data/tls-certs/tls.crt - --tls-private-key=/data/tls-certs/tls.key - --client-ca-file=/data/tls-ca-certs/service-ca.crt - --webhook-timeout-seconds=10 - --kube-api-qps=30.0 - --kube-api-burst=40.0 # ... resources: requests: cpu: 40m memory: 40Mi # ...
レコメンダー Pod の例
apiVersion: v1 kind: Pod metadata: name: vpa-recommender-default-74c979dbbc-znrd2 namespace: openshift-vertical-pod-autoscaler # ... spec: containers: - args: - --logtostderr - --v=1 - --recommendation-margin-fraction=0.15 - --pod-recommendation-min-cpu-millicores=25 - --pod-recommendation-min-memory-mb=250 - --kube-api-qps=20.0 - --kube-api-burst=60.0 - --memory-saver=true # ... resources: requests: cpu: 60m memory: 60Mi # ...
2.5.3.7. 代替のレコメンダーを使用する
独自のレコメンダーを使用して、独自のアルゴリズムに基づいて自動スケーリングできます。代替レコメンダーを指定しない場合、OpenShift Container Platform はデフォルトのレコメンダーを使用します。これは、過去の使用状況に基づいて CPU およびメモリー要求を提案します。すべてのタイプのワークロードに適用されるユニバーサルレコメンデーションポリシーはないため、特定のワークロードに対して異なるレコメンダーを作成してデプロイメントすることを推奨します。
たとえば、デフォルトのレコメンダーは、コンテナーが特定のリソース動作を示す場合、将来のリソース使用量を正確に予測しない可能性があります。たとえば、監視アプリケーションで使用される使用量の急増とアイドリングを交互に繰り返すパターンや、ディープラーニングアプリケーションで使用される繰り返しパターンなどです。これらの使用動作でデフォルトのレコメンダーを使用すると、アプリケーションのプロビジョニングが大幅に過剰になり、Out of Memory (OOM) が強制終了される可能性があります。
レコメンダーを作成する方法の説明は、このドキュメントの範囲を超えています。
手順
Pod に代替のレコメンダーを使用するには:
代替レコメンダーのサービスアカウントを作成し、そのサービスアカウントを必要なクラスターロールにバインドします。
apiVersion: v1 1 kind: ServiceAccount metadata: name: alt-vpa-recommender-sa namespace: <namespace_name> --- apiVersion: rbac.authorization.k8s.io/v1 2 kind: ClusterRoleBinding metadata: name: system:example-metrics-reader roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:metrics-reader subjects: - kind: ServiceAccount name: alt-vpa-recommender-sa namespace: <namespace_name> --- apiVersion: rbac.authorization.k8s.io/v1 3 kind: ClusterRoleBinding metadata: name: system:example-vpa-actor roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:vpa-actor subjects: - kind: ServiceAccount name: alt-vpa-recommender-sa namespace: <namespace_name> --- apiVersion: rbac.authorization.k8s.io/v1 4 kind: ClusterRoleBinding metadata: name: system:example-vpa-target-reader-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:vpa-target-reader subjects: - kind: ServiceAccount name: alt-vpa-recommender-sa namespace: <namespace_name>
代替レコメンダーをクラスターに追加するには、次のようなデプロイメントオブジェクトを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: alt-vpa-recommender namespace: <namespace_name> spec: replicas: 1 selector: matchLabels: app: alt-vpa-recommender template: metadata: labels: app: alt-vpa-recommender spec: containers: 1 - name: recommender image: quay.io/example/alt-recommender:latest 2 imagePullPolicy: Always resources: limits: cpu: 200m memory: 1000Mi requests: cpu: 50m memory: 500Mi ports: - name: prometheus containerPort: 8942 securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL seccompProfile: type: RuntimeDefault serviceAccountName: alt-vpa-recommender-sa 3 securityContext: runAsNonRoot: true
同じ namespace 内の代替レコメンダー用に新しい Pod が作成されます。
$ oc get pods
出力例
NAME READY STATUS RESTARTS AGE frontend-845d5478d-558zf 1/1 Running 0 4m25s frontend-845d5478d-7z9gx 1/1 Running 0 4m25s frontend-845d5478d-b7l4j 1/1 Running 0 4m25s vpa-alt-recommender-55878867f9-6tp5v 1/1 Running 0 9s
代替レコメンダー
Deployment
オブジェクトの名前を含む VPA CR を設定します。代替レコメンダーを含めるための VPA CR の例
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-recommender namespace: <namespace_name> spec: recommenders: - name: alt-vpa-recommender 1 targetRef: apiVersion: "apps/v1" kind: Deployment 2 name: frontend
2.5.4. Vertical Pod Autoscaler Operator の使用
VPA カスタムリソース (CR) を作成して、Vertical Pod Autoscaler Operator (VPA) を使用できます。CR は、分析すべき Pod を示し、VPA がそれらの Pod について実行するアクションを判別します。
前提条件
- 自動スケーリングするワークロードオブジェクトが存在している必要があります。
- 別のレコメンダーを使用する場合は、そのレコメンダーを含むデプロイメントが存在する必要があります。
手順
特定のワークロードオブジェクトの VPA CR を作成するには、以下を実行します。
スケーリングするワークロードオブジェクトがあるプロジェクトに切り替えます。
VPA CR YAML ファイルを作成します。
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-recommender spec: targetRef: apiVersion: "apps/v1" kind: Deployment 1 name: frontend 2 updatePolicy: updateMode: "Auto" 3 resourcePolicy: 4 containerPolicies: - containerName: my-opt-sidecar mode: "Off" recommenders: 5 - name: my-recommender
- 1
- この VPA が管理するワークロードオブジェクトのタイプ (
Deployment
、StatefulSet
、Job
、DaemonSet
、ReplicaSet
、またはReplicationController
) を指定します。 - 2
- この VPA が管理する既存のワークロードオブジェクトの名前を指定します。
- 3
- VPA モードを指定します。
-
auto
は、コントローラーに関連付けられた Pod に推奨リソースを自動的に適用します。VPA は既存の Pod を終了し、推奨されるリソース制限および要求で新規 Pod を作成します。 -
recreate
は、ワークロードオブジェクトに関連付けられた Pod に推奨リソースを自動的に適用します。VPA は既存の Pod を終了し、推奨されるリソース制限および要求で新規 Pod を作成します。recreate
モードはほとんど使用されることはありません。リソース要求が変更される際に Pod が再起動されていることを確認する必要がある場合にのみ使用します。 -
initial
は、ワークロードオブジェクトに関連付けられた Pod が作成される際に、推奨リソースを自動的に適用します。VPA は、新しい推奨リソースを確認する際に Pod を更新しません。 -
off
は、ワークロードオブジェクトに関連付けられた Pod の推奨リソースのみを生成します。VPA は、新しい推奨リソースを確認する際に Pod を更新しません。また、新規 Pod に推奨事項を適用しません。
-
- 4
- オプション: オプトアウトするコンテナーを指定し、モードを
Off
に設定します。 - 5
- オプション: レコメンダーの推奨者を指定します。
VPA CR を作成します。
$ oc create -f <file-name>.yaml
しばらくすると、VPA はワークロードオブジェクトに関連付けられた Pod 内のコンテナーのリソース使用状況を確認します。
以下のコマンドを実行して、VPA の推奨事項を表示できます。
$ oc get vpa <vpa-name> --output yaml
出力には、以下のような CPU およびメモリー要求の推奨事項が表示されます。
出力例
... status: ... recommendation: containerRecommendations: - containerName: frontend lowerBound: 1 cpu: 25m memory: 262144k target: 2 cpu: 25m memory: 262144k uncappedTarget: 3 cpu: 25m memory: 262144k upperBound: 4 cpu: 262m memory: "274357142" - containerName: backend lowerBound: cpu: 12m memory: 131072k target: cpu: 12m memory: 131072k uncappedTarget: cpu: 12m memory: 131072k upperBound: cpu: 476m memory: "498558823" ...
2.5.5. Vertical Pod Autoscaler Operator のアンインストール
Vertical Pod Autoscaler Operator (VPA) を OpenShift Container Platform クラスターから削除できます。アンインストール後、既存の VPA CR によってすでに変更された Pod のリソース要求は変更されません。新規 Pod は、Vertical Pod Autoscaler Operator による以前の推奨事項ではなく、ワークロードオブジェクトで定義されるリソースを取得します。
oc delete vpa <vpa-name>
コマンドを使用して、特定の VPA CR を削除できます。Vertical Pod Autoscaler のアンインストール時と同じアクションがリソース要求に対して適用されます。
VPA Operator を削除した後、潜在的な問題を回避するために、Operator に関連する他のコンポーネントを削除することを推奨します。
前提条件
- Vertical Pod Autoscaler Operator がインストールされていること。
手順
-
OpenShift Container Platform Web コンソールで、Operators
Installed Operators をクリックします。 - openshift-vertical-pod-autoscaler プロジェクトに切り替えます。
- VerticalPodAutoscaler Operator の場合は、Options メニュー をクリックし、Uninstall Operator を選択します。
- オプション: 演算子に関連付けられているすべてのオペランドを削除するには、ダイアログボックスで、Delete all operand instances for this operatorチェックボックスをオンにします。
- Uninstall をクリックします。
オプション: OpenShift CLI を使用して VPA コンポーネントを削除します。
VPA namespace を削除します。
$ oc delete namespace openshift-vertical-pod-autoscaler
VPA カスタムリソース定義 (CRD) オブジェクトを削除します。
$ oc delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io
$ oc delete crd verticalpodautoscalercontrollers.autoscaling.openshift.io
$ oc delete crd verticalpodautoscalers.autoscaling.k8s.io
CRD を削除すると、関連付けられたロール、クラスターロール、およびロールバインディングが削除されます。
注記この操作により、ユーザーが作成したすべての VPA CR がクラスターから削除されます。VPA を再インストールする場合は、これらのオブジェクトを再度作成する必要があります。
次のコマンドを実行して
MutatingWebhookConfiguration
オブジェクトを削除します。$ oc delete MutatingWebhookConfiguration vpa-webhook-config
VPA Operator を削除します。
$ oc delete operator/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler