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アプリケーションをデプロイする




