Kubernetes Vertical Pod Autoscalerの使用

Kubernetes Vertical Pod Autoscalerを使用して、Kubernetes Engine (OKE)を使用して作成したクラスタ上のポッドで実行されているコンテナのリソース・リクエストおよび制限を自動的に調整する方法をご紹介します。

ノート

Kubernetes Vertical Pod Autoscalerを仮想ノード・プールとともに使用することはできません。
Kubernetes Vertical Pod Autoscalerを使用して、デプロイメントのポッドで実行されているコンテナのリソース・リクエストおよび制限を自動的に調整できます。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メトリック・サーバーのインストールの検証

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. 次のように入力して、Kubernetesメトリック・サーバーがクラスタに正常にデプロイされ、使用可能であることを確認します:

    kubectl -n kube-system get deployment/metrics-server

    コマンドで見つからないというエラーが返される場合は、続行する前にKubernetesメトリック・サーバーをクラスタにデプロイする必要があります。クラスタへのKubernetesメトリック・サーバーのデプロイを参照してください。

ステップ2: Vertical Pod Autoscalerのダウンロードおよびデプロイ

  1. GitHubからVertical Pod Autoscalerソース・コードをダウンロードします。たとえば、次のように入力します:
    git clone -b vpa-release-0.8 https://github.com/kubernetes/autoscaler.git
  2. vertical-pod-autoscalerディレクトリに移動します:

    cd autoscaler/vertical-pod-autoscaler
  3. 以前にVertical Pod Autoscalerをデプロイしたことがある場合は、次のように入力して削除します:
    ./hack/vpa-down.sh
  4. 次のように入力して、Vertical Pod Autoscalerをデプロイします:

    ./hack/vpa-up.sh
  5. 次のように入力して、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: サンプル・アプリケーションのデプロイ

  1. 次のように入力して、サンプルの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がデプロイメントを指すデプロイメントが作成されます。

  2. 次のように入力して、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ポッドには、おそらく別の名前が表示されます。

  3. 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は、デプロイメント内のテンプレートを変更するのではなく、ポッドの実際のリクエストを更新します。

  1. 次のように入力して、サンプルのhamsterアプリケーションのポッドをモニターし、アップデータが新しい名前で新しいhamsterポッドを開始するのを待ちます:
    kubectl get --watch pods -l app=hamster
  2. 新しい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: クリーンアップ

  1. 次のように入力してサンプル・アプリケーションを削除します:
    kubectl delete -f examples/hamster.yaml
  2. vertical-pod-autoscalerディレクトリで、次のように入力して、Vertical Pod Autoscalerデプロイメントを削除します:

    ./hack/vpa-down.sh