Kubernetes Vertical Pod Autoscalerの使用
Kubernetes Vertical Pod Autoscalerを使用して、Kubernetes Engine (OKE)を使用して作成したクラスタ上のポッドで実行されているコンテナのリソース・リクエストおよび制限を自動的に調整する方法をご紹介します。
Kubernetes Vertical Pod Autoscalerを仮想ノード・プールとともに使用することはできません。
- 使用状況に基づいてリクエストを自動的に設定し、各ポッドに適切なリソース量が使用可能であるようにします。
- コンテナの初期構成で指定された制限とリクエストの間の比率を維持します。
- 一定期間の使用状況に基づいて、リソースを過度にリクエストしているポッドをスケール・ダウンします。
- 一定期間の使用状況に基づいて、リソースを十分にリクエストしていないポッドをスケール・アップします。
Vertical Pod Autoscalerには、次の3つのコンポーネントがあります:
- レコメンダ: 現在および過去のリソース消費をモニターし、コンテナに推奨されるCPUおよびメモリー・リクエスト値を提供します。
- アップデータ: リソースが正しくないポッドをチェックして削除し、更新されたリクエスト値でポッドを再作成できるようにします。
- アドミッション・プラグイン: 新しいポッド(つまり、作成されたばかりのポッドまたはアップデータによる変更のためにコントローラによって再作成されたポッド)に正しいリソース・リクエストを設定します。
詳細は、KubernetesドキュメントのVertical Pod AutoscalerおよびManaging Resources for Containersを参照してください。
Vertical Pod Autoscalerは、VerticalPodAutoscaler
カスタム・リソース定義オブジェクトを使用して構成します。VerticalPodAutoscaler
オブジェクトを使用すると、垂直方向に自動スケーリングするポッド、および適用するリソース推奨(存在する場合)を指定できます。詳細は、KubernetesドキュメントのVerticalPodAutoscalerおよびCustom Resource Definition objectを参照してください。
Vertical Pod Autoscalerでは、Kubernetesメトリック・サーバーなどのメトリック・ソースをクラスタにインストールする必要があります。詳細は、クラスタへのKubernetesメトリック・サーバーのデプロイを参照してください。
制限範囲のオーバーライド
Vertical Pod Autoscalerは、制限範囲(定義されている場合)で指定された最小値と最大値の範囲内で推奨を作成しようとします。ただし、適用可能な制限範囲がVerticalPodAutoscaler
マニフェストのresourcePolicy
セクションで指定された値と競合する場合、Vertical Pod Autoscalerはリソース・ポリシーを優先し(値が制限範囲外の場合でも)、それに応じて推奨を生成します。詳細は、KubernetesドキュメントのLimit RangesおよびResource Policy Overriding Limit Rangeを参照してください。
推奨の作成(適用なし)
Vertical Pod Autoscalerを使用すると、推奨を作成して適用したり、単に(ポッドを更新せずに)推奨を作成することができます。推奨を適用せずに単に作成するには、VerticalPodAutoscaler
マニフェストのupdatePolicy
セクションでupdateMode: "Off"
を設定します。
ポッドの作成時、Vertical Pod AutoscalerはコンテナのCPUおよびメモリーのニーズを分析し、それらの推奨をStatus
フィールドに記録します。Vertical Pod Autoscalerは、実行中のコンテナのリソース・リクエストを更新するアクションを実行しません。
特定のコンテナの除外
Vertical Pod Autoscalerを使用して、推奨を作成してポッド内のすべてのコンテナに適用したり、特定のコンテナを選択的に除外することができます。特定のコンテナの推奨をオフにするには、VerticalPodAutoscaler
マニフェストのresourcePolicy
セクションでcontainerName
を指定し、containerPolicies
セクションでmode: "Off"
を設定します。
Vertical Pod Autoscalerに関するノート
次の点に注意してください:
- 現在、CPUまたはメモリー使用率メトリックでは、Vertical Pod AutoscalerをHorizontal Pod Autoscalerとともに使用しないことをお薦めします。ただし、Vertical Pod Autoscalerは、カスタムおよび外部メトリックでHorizontal Pod Autoscalerとともに使用できます。KubernetesドキュメントのSupport for custom metricsを参照してください。
- Vertical Pod Autoscalerの推奨は、使用可能なリソース(ノード・サイズ、使用可能なサイズ、使用可能な割当て制限など)を超える場合があります。推奨を適用すると、ポッドが保留ステータスになる可能性があることに注意してください。
- Vertical Pod Autoscalerがポッド・リソースを更新するたびにポッドが再作成され、実行中のすべてのコンテナが再起動されます。ポッドは別のノードで再作成される場合があります。
- Kubernetes Vertical Pod Autoscalerは、管理対象ノード・プールで使用できますが、仮想ノード・プールでは使用できません。
Vertical Pod Autoscalerの操作
次の手順では、クラスタへのVertical Pod Autoscalerのデプロイについて説明します。次の方法について説明します:
- Kubernetesメトリック・サーバーがクラスタにインストールされていることを確認します。
- Vertical Pod Autoscalerをダウンロードしてデプロイします。
- サンプル・アプリケーションをデプロイします。
- 実行中のスケーリング操作を表示します。
- 推奨を表示します。
- サンプル・アプリケーションとVertical Pod Autoscalerを削除してクリーンアップします。
ステップ1: Kubernetesメトリック・サーバーのインストールの検証
-
まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
-
次のように入力して、Kubernetesメトリック・サーバーがクラスタに正常にデプロイされ、使用可能であることを確認します:
kubectl -n kube-system get deployment/metrics-server
コマンドで見つからないというエラーが返される場合は、続行する前にKubernetesメトリック・サーバーをクラスタにデプロイする必要があります。クラスタへのKubernetesメトリック・サーバーのデプロイを参照してください。
ステップ2: Vertical Pod Autoscalerのダウンロードおよびデプロイ
- GitHubからVertical Pod Autoscalerソース・コードをダウンロードします。たとえば、次のように入力します:
git clone -b vpa-release-0.8 https://github.com/kubernetes/autoscaler.git
-
vertical-pod-autoscaler
ディレクトリに移動します:cd autoscaler/vertical-pod-autoscaler
-
以前にVertical Pod Autoscalerをデプロイしたことがある場合は、次のように入力して削除します:
./hack/vpa-down.sh
-
次のように入力して、Vertical Pod Autoscalerをデプロイします:
./hack/vpa-up.sh
-
次のように入力して、Vertical Pod Autoscalerポッドが正常に作成されたことを確認します:
kubectl get pods -n kube-system
前述のコマンドの出力に、ポッドが表示されます:
vpa-admission-controller-59d9965cfb-bzs8l 1/1 Running 0 6m34s vpa-recommender-5bcb58569-mqdds 1/1 Running 0 6m43s vpa-updater-5979cbf757-scw2d 1/1 Running 0 6m46s
名前と番号が異なる可能性があることに注意してください。
ステップ3: サンプル・アプリケーションのデプロイ
- 次のように入力して、サンプルのhamsterアプリケーションをデプロイし、デプロイメントおよび対応するVertical Pod Autoscalerを作成します:
kubectl apply -f examples/hamster.yaml
前述のコマンドの出力により、デプロイメントと作成が確認されます:
verticalpodautoscaler.autoscaling.k8s.io/hamster-vpa created deployment.apps/hamster created
hamsterアプリケーションをデプロイすると、2つのポッドとVertical Pod Autoscalerがデプロイメントを指すデプロイメントが作成されます。
- 次のように入力して、hamsterポッドが正常に作成されたことを確認します:
kubectl get pods -l app=hamster
前述のコマンドの出力により、作成が確認されます:
NAME READY STATUS RESTARTS AGE hamster-7cbfd64f57-mqqnk 1/1 Running 0 54s hamster-7cbfd64f57-rq6wv 1/1 Running 0 55s
hamsterポッドには、おそらく別の名前が表示されます。
kubectl describe pod
コマンドと前のステップで返されたhamsterポッド名のいずれかを使用して、CPUおよびメモリーの予約を表示します。例:kubectl describe pod hamster-7cbfd64f57-rq6wv
前述のコマンドは単なる例です。前のステップで
kubectl get pods -l app=hamster
コマンドを実行したときに返されたhamsterポッド名のいずれかを使用する必要があります。出力のrequestsセクションで、ポッドの現在のCPUおよびメモリーの予約を確認できます。例:
Requests: cpu: 100m memory: 50Mi
Vertical Pod Autoscaler(具体的にはレコメンダ)はポッドを分析し、その動作を監視して、これらのCPUおよびメモリーの予約が適切かどうかを判断します。異なるCPU予約とメモリー予約が表示される可能性があることに注意してください。
サンプルのhamsterアプリケーションは意図的にリソース不足であるため、予約は十分ではありません。各ポッドは、次のような単一のコンテナを実行します:
- 100ミリコアをリクエストしますが、500ミリコアを超える使用を試みます
- 実行に必要なメモリよりもはるかに少ないメモリを確保します
ステップ4: スケーリング操作の表示
サンプルのhamsterアプリケーションで元のポッドを分析し、CPUおよびメモリーの予約が不十分であると判断した後、Vertical Pod Autoscaler(具体的にはアップデータ)は、レコメンダによって提案された異なる値でポッドを再起動します。Vertical Pod Autoscalerは、デプロイメント内のテンプレートを変更するのではなく、ポッドの実際のリクエストを更新します。
-
次のように入力して、サンプルのhamsterアプリケーションのポッドをモニターし、アップデータが新しい名前で新しいhamsterポッドを開始するのを待ちます:
kubectl get --watch pods -l app=hamster
-
新しいhamsterポッドが開始されたことを確認したら、
kubectl describe pod
コマンドおよびポッドの名前を使用して、そのCPUおよびメモリーの予約を表示します。例:kubectl describe pod hamster-7cbfd64f57-wmg4
出力のrequestsセクションで、新しいポッドのCPUおよびメモリーの予約を確認できます:
Requests: cpu: 587m memory: 262144k
前述の例では、CPU予約が587ミリコアに増加し、メモリー予約が262,144KBに増加しています。元のポッドはリソース不足で、Vertical Pod Autoscalerは元の予約をより適切な値で修正しました。異なるCPU予約とメモリー予約が表示される可能性があることに注意してください。
ステップ5: 推奨の表示
次のように入力して、Vertical Pod Autoscaler(具体的にはレコメンダ)によって作成された推奨を表示します:
kubectl describe vpa/hamster-vpa
前述のコマンドの出力に、推奨が表示されます:
Name: hamster-vpa
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling.k8s.io/v1beta2","kind":"VerticalPodAutoscaler","metadata":{"annotations":{},"name":"hamster-vpa","namespace":"d...
API Version: autoscaling.k8s.io/v1
Kind: VerticalPodAutoscaler
Metadata:
Creation Timestamp: 2020-09-22T18:08:09Z
Generation: 27
Resource Version: 19466955
Self Link: /apis/autoscaling.k8s.io/v1/namespaces/default/verticalpodautoscalers/hamster-vpa
UID: 689cee90-6fed-404d-adf9-b6fa8c1da660
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: 2020-09-22T18:10:10Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 519m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
Events: <none>
異なる推奨が表示される場合があります。
ステップ6: クリーンアップ
- 次のように入力してサンプル・アプリケーションを削除します:
kubectl delete -f examples/hamster.yaml
-
vertical-pod-autoscaler
ディレクトリで、次のように入力して、Vertical Pod Autoscalerデプロイメントを削除します:./hack/vpa-down.sh