Oracle Cloud Hangout Cafe Season 4 #5「Kubernetesのオートスケーリング」(2021年8月4日開催)
Podの垂直スケール
ここからは、Podの垂直スケール(Vertical Pod Autoscaler、以下VPA)について見ていきます。
Podの垂直スケールの概要
Podの垂直スケール(VPA)は、コンテナアプリケーション環境(Pod)を垂直スケール(スケールアップ/ダウン)させる仕組みです。具体的には、Podに要求されるCPU/メモリ(Resource Requests)を上書きして、Pod(≠Deployment)のスペックを調整することでスケールさせます。スケール定義はVPA(VerticalPodAutoscaler)リソースとして定義します。
VPAは複数のControllerの組み合わせで実現されており、単一のControllerで実現されるHPAとは少し仕組みが異なります。主にUpdater、Admission Controller/Admission Plugin(以下、Admission Controller)、Recommenderという3つのコンポーネントが連携して動作し、原則としてスケール時にはPodの再起動が発生(Resource Requests/Limitsを適用させるため)します。in-place update(再起動なしのスケール)は現時点で未実装です。
VPA時の具体的な動きとしては、VPAが.spec.containers[].resources.requests
(起動時に割り当てるCPU/メモリ)の推奨値を算出し、以下のイメージのように.spec.containers[].resources.requests/limits
を上書きすることで実現します。このとき、Resource Limitsの値はResource RequestsとLimitsの初期値の比率によって決定され、同様に上書きされます。
例えば、Resource Requestsに定義したCPUが0.1 core、Resource Limitsに定義したCPUが0.5 coreの時、VPAが算出したResource Requestsの推奨値が0.2 coreだった場合、Resource Requestsは0.2 core、Resource Limitsは1 coreに上書きされます(Resource Requests:Resource Limits
= 1:5
)。
VPAを実現するコンポーネントには、Recommender
、Updater
、Admission Controller
の3つがあります。この3つのコンポーネントは、それぞれ以下の役割で動きます。
コンポーネント | 役割 |
---|---|
Recommender | (1)VPAリソースを読み込み (2)Podのメトリクス取得 (3)Resource Requestsの推奨値算出 (4)Resource Requestsの推奨値を登録 |
Updater | (5)RecommenderがVPAリソースに書き込んだ推奨値と動作中のPodのResource Requestsの値を比較 (6)Podのevict(再起動) |
Admission Controller | (7)Resource Requestsの推奨値取得 ⑧Podのspecを上書き |
これらを図にすると、下図のようなイメージです。
VPAリソースの定義
VPAリソースの定義方法を説明します。VPAリソースに定義する内容は主に以下の3つです。
項目 | フィールド | 定義 |
---|---|---|
スケール対象 | .spec.targetRef | スケール対象リソースのapiVersion、kind、nameを指定。基本はapiVersion: apps/v1、kind: Deploymentを指定 |
リソースポリシー | .spec.resourcePolicy | 対象Deployment(Pod)内のコンテナ名、スケール範囲、スケール対象のリソース(CPU/メモリ)を指定 |
アップデートポリシー | .spec.updatePolicy | Auto、Recreate、Initial、Offのいずれかを指定。それぞれの詳細は後述 |
上記のアップデートポリシーには、以下の4種類がありします。アップデートポリシーはスケールする際の挙動を示します。
項目 | 意味 |
---|---|
Auto | 現状はRecreateと同様 |
Recreate | 再起動によってPodをスケールアップ |
Initial | 作成時のみにPodのリソースを割り当て(再起動はしない) |
Off | スケール値の算出のみで、実際にはスケールしない |
実際のVPAリソース例は以下です。
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: php-apache spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: php-apache resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] updatePolicy: updateMode: Auto
Podリソースのin-place Resize
Kubernetes v1.27からPodリソースのin-place Resize(再起動なしでのスケールアップ)がα機能として実装されています。この機能をVPAと連携させることで、evict(再起動)なしでのPodのスケールアップを実現できます。ただし、VPAではまだPodリソースのin-place Resizeを利用したin-place updateは実装されていません。詳細はAEP-4016で管理されています。
Podリソースのin-place Resizeを利用するにはInPlacePodVerticalScaling
のFeatureGatesを有効化する必要があるため、クラウドベンダーなどが提供するマネージドなKubernetesサービスでは利用できない可能性があります。
以下に一例を示します。
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx resizePolicy: - resourceName: cpu restartPolicy: NotRequired - resourceName: memory restartPolicy: RestartContainer resources: limits: memory: "100Mi" cpu: "100m" requests: memory: "100Mi" cpu: "100m"
.spec.containers[].resizePolicy
にCPUとメモリに対するスケールアップ時の挙動を定義します。上記のケースではCPUのスケール時は再起動なし(restartPolicy: NotRequired
)でのスケールアップが実施され、メモリのスケール時には再起動が実施されます(restartPolicy: RestartContainer
)。
また、再起動なしでのスケールアップの場合には、現状時間を要することも確認されており、今後修正予定です(Pod Resize - long delay in updating)。
HPAとVPAの併用
HPAとVPAの併用について説明します。HPAとVPAの併用は、それぞれがCPUとメモリを利用する場合は禁止されています(参考)。
CPUとメモリを利用したHPA/VPAでは、スケール対象がそれぞれDeploymentとPodで異なるため、VPAによりスケールされたPodにHPAでのスケールを適用するとPod毎のResource Requestsが煩雑になり、想定通りのスケール挙動にならない可能性があります。例えば、HPAが実施された結果Pod毎のスペックが異なり、オーバースケールだったり、スケール不足になることがあります。
HPAとVPAを併用する場合は、HPAとVPAのスケールメトリクスを分離する(HPAはCPUを利用する、VPAはメモリを利用するなど)か、PodsのCPU/メモリ以外のメトリクスを利用しましょう。
VPAのデモ
当日のセッションでは、VPAのデモを実施しています。詳細はセッション動画をご確認ください。
HPAとVPAのまとめ
ここまでで、HPAとVPAについて整理します。
- HPA(Podの数が増減するスケール方式)
- Podが使用しているリソースとResource Requestsをもとに水平スケール、スケール対象はDeployment
- スケールの範囲や振る舞いをユーザ側で定義する必要性
- アプリケーション(Pod)にかかる負荷の傾向を把握
- コスト(経済/リソース)を考慮しながらスケール範囲の見極め
- アプリケーションの特性や運用、サービス指標(SLA/SLOも含む)などを考慮し、スケールの振る舞いを定義
- Podが使用しているリソースとResource Requestsをもとに水平スケール、スケール対象はDeployment
- VPA(Podのスペック(
.spec.containers[].resources.requests/limits
)を拡張するスケール方式)- Podが使用しているリソース(CPU/メモリ)をもとに垂直スケール
- 実際のリソース使用量を把握できていなくても、よしなにスケール(実績値との乖離を防止)
- 実際にスケールさせなくても、算出された推奨値を確認するだけという利用方法もある
- クラスタ全体のリソースを有効活用できる
- 現時点では、原則としてはPodの再起動が必要(in-place updateは未実装)
- Podが使用しているリソース(CPU/メモリ)をもとに垂直スケール
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kubernetesにおけるオートスケーリングの概要
- Podのリソース割り当ての推奨値を提案するKRR(Kubernetes Resource Recommender)
- ドメインを考慮した柔軟なPodの配置を実現する「Balancer」
- Kubernetesアプリケーションのモニタリングことはじめ
- OpenShift:アプリケーションの構成と運用
- kustomizeで復数環境のマニフェストファイルを簡単整理
- Kubernetesの基礎
- 「K8sGPT」の未来と生成AIを用いたKubernetes運用の最前線
- 「kwok」でKubernetesクラスターをシュミレーションする
- kustomizeやSecretを利用してJavaアプリケーションをデプロイする