Kubernetesオートスケール完全攻略:HPA/VPA/Cluster Autoscalerの組み合わせ
Kubernetes のオートスケーリングには HPA(Horizontal Pod Autoscaler)・VPA(Vertical Pod Autoscaler)・ Cluster Autoscaler という役割の異なる3つの仕組みがあり、どれか1つだけでは「Podは増えたがノードが足りない」 「リソース要求が過大でコストだけ膨らむ」といった問題が起きる。結論から言えば、Pod数はHPA、Podサイズの初期値調整はVPA、 ノード数はCluster Autoscalerという役割分担が基本形であり、この3つを正しく組み合わせることでコストとパフォーマンスを両立できる。
3つのオートスケーラーの役割分担
| 仕組み | スケールする対象 | 判断基準 | 反映速度の目安 |
|---|---|---|---|
| HPA(Horizontal Pod Autoscaler) | Podのレプリカ数 | CPU/メモリ使用率、カスタムメトリクス | 15秒間隔でメトリクス評価、数十秒〜数分で反映 |
| VPA(Vertical Pod Autoscaler) | Pod単体のCPU/メモリ requests・limits | 過去の実績使用量 | Recreateモードは再起動を伴うため数分単位 |
| Cluster Autoscaler | ノード(ワーカー)の台数 | Pending状態のPodの有無 | クラウドのインスタンス起動時間に依存、数分程度 |
HPAとCluster Autoscalerの組み合わせ
最も一般的な構成は、HPAでPod数を需要に応じて増減させ、Podが配置しきれなくなったらCluster Autoscalerがノードを追加する形である。 典型的な設定例:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 3
maxReplicas: 30
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
CPU使用率70%を閾値にすると、突発的なトラフィック増にも数十秒〜数分で追随できる一方、 ノードのプロビジョニング(多くのクラウドで2〜5分程度)が追いつかない間はPodがPending状態になる点に注意する。 これを避けるため、平常時から一定のバッファ(例: 常時20%程度の余剰キャパシティ)を残しておく運用が現実的である。
VPAとの併用における注意点
VPAとHPAを同じメトリクス(CPU使用率)で併用すると、互いに競合して不安定になることがある。 VPAは「Podあたりのリソース量」を、HPAは「Podの数」を変えるため、両方が同じシグナルに反応すると スケールの意図が二重になってしまう。実務では、VPAは推奨モード(Off/Recommendationのみ)で使い、 実際のrequests/limits調整は人間がレビューして反映する運用か、HPAとVPAで参照するメトリクスを分離する (例: HPAはリクエスト数、VPAはメモリ使用量)運用のいずれかが安全である。
実装上の落とし穴と対策
- スケールの振動(フラッピング):閾値ギリギリでPodの増減を繰り返すと、リソースを浪費しつつサービスも不安定になる。HPAの
behaviorフィールドでスケールダウンの安定化ウィンドウ(例: 300秒)を設定し、急激な縮小を抑える。 - ノード追加の遅延によるリクエスト超過:Cluster Autoscalerのノード起動を待つ間にリクエストが溢れる場合は、Pod Disruption Budgetとあわせて、常時起動する最小レプリカ数(
minReplicas)を余裕を持って設定する。 - コストの見えにくい増加:VPAの推奨値をそのまま反映し続けると、リソース要求が徐々に肥大化しコストが積み上がることがある。月次でrequests/limitsの実績使用率をレビューする運用を組み込む。
まとめ
HPA・VPA・Cluster Autoscalerはそれぞれ異なるレイヤーを担当するため、「どれか1つを入れれば解決」という発想ではなく、 Pod数・Podサイズ・ノード数という3つの軸で役割を分担させることが重要である。まずはHPA + Cluster Autoscalerの 基本構成から始め、リソース要求の最適化が課題になった段階でVPAを慎重に組み込む、という順序が実務では扱いやすい。
公式ドキュメント: Kubernetes公式 - オートスケーリングの概要