Kubernetes Autoscaler

Kubernetes には複数の Autoscaler があり、それぞれ異なるレイヤーでスケーリングを担当する ここでは代表的な3つをメモ

┌─────────────────────────────────────────────────────────────────────────┐
│                    Kubernetes Autoscaler の全体像                        │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │                         Cluster                                  │   │
│  │                                                                  │   │
│  │   ┌────────────────────────────────────────────────────────┐    │   │
│  │   │  Node                                                   │    │   │
│  │   │   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐    │    │   │
│  │   │   │    Pod      │  │    Pod      │  │    Pod      │    │    │   │
│  │   │   │ CPU:500m    │  │ CPU:500m    │  │ CPU:500m    │    │    │   │
│  │   │   │ Mem:256Mi   │  │ Mem:256Mi   │  │ Mem:256Mi   │    │    │   │
│  │   │   └─────────────┘  └─────────────┘  └─────────────┘    │    │   │
│  │   │         ↑                 ↑               ↑            │    │   │
│  │   │         └─────────────────┼───────────────┘            │    │   │
│  │   │                           │                            │    │   │
│  │   │                    VPA が調整                          │    │   │
│  │   │              (各Podのリソース量)                        │    │   │
│  │   └────────────────────────────────────────────────────────┘    │   │
│  │         ↑                                                        │   │
│  │         │ Cluster Autoscaler が調整 (Node数)                     │   │
│  │         ↓                                                        │   │
│  │   ┌────────────────────────────────────────────────────────┐    │   │
│  │   │  Node                                                   │    │   │
│  │   │   ┌─────────────┐  ┌─────────────┐                     │    │   │
│  │   │   │    Pod      │  │    Pod      │ ←── HPA が調整      │    │   │
│  │   │   └─────────────┘  └─────────────┘     (Pod数)         │    │   │
│  │   └────────────────────────────────────────────────────────┘    │   │
│  └─────────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────────┘

3つの Autoscaler 比較表

項目HPAVPACluster Autoscaler
正式名称Horizontal Pod AutoscalerVertical Pod AutoscalerCluster Autoscaler
スケール対象Pod の数Pod の CPU/メモリNode の数
スケール方向水平垂直水平
トリガーメトリクス閾値超過実使用量との乖離Pending Pod / 低使用率 Node
管理レイヤーアプリケーション層アプリケーション層インフラ層
Kubernetes 標準× (別途インストール)× (別途インストール)

1. Horizontal Pod Autoscaler (HPA)

Pod の数を自動で増減させる

出典: Horizontal Pod Autoscaling - Kubernetes

動作

  • 15秒ごとにメトリクスを確認
  • CPU/メモリ使用率が閾値を超えたら Pod を増やす
  • 使用率が下がったら Pod を減らす

計算式

desiredReplicas = ceil(currentReplicas × (currentMetricValue / desiredMetricValue))

設定例

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 60

ユースケース

  • Web アプリのトラフィック増減への対応
  • バッチ処理の負荷分散

2. Vertical Pod Autoscaler (VPA)

Pod 単体の CPU/メモリを自動で調整する

出典: Vertical Pod Autoscaling - Kubernetes

動作

  • Recommender: 使用量を分析し推奨値を計算
  • Updater: 推奨値と現在値を比較し、必要なら Pod を更新
  • Admission Controller: 新規 Pod に推奨値を適用

Update Mode

モード動作
Off推奨値の計算のみ
InitialPod 作成時のみ適用
RecreatePod を再作成して適用
InPlaceOrRecreate可能なら再起動なしで更新

設定例

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Recreate"
  resourcePolicy:
    containerPolicies:
    - containerName: "app"
      minAllowed:
        cpu: 100m
        memory: 128Mi
      maxAllowed:
        cpu: 2
        memory: 2Gi

ユースケース

  • 新規アプリの適切なリソース設定
  • 過剰リソースの削減によるコスト最適化
  • OOM Kill 防止

3. Cluster Autoscaler

Node の数を自動で増減させる

出典: kubernetes/autoscaler - GitHub

動作

スケールアップ:

  1. HPA が Pod を増やそうとする
  2. Node のリソース不足で Pod が Pending になる
  3. Cluster Autoscaler が新しい Node を追加

スケールダウン:

  1. Node の使用率が低い状態が続く
  2. Pod を他の Node に移動可能か確認
  3. 移動後、不要な Node を削除

ユースケース

  • 大規模バッチジョブ実行時の一時的なノード追加
  • 夜間・週末のノード削減によるコスト最適化

連携パターン

負荷増加
   │
   ▼
┌─────┐
│ HPA │ → Pod数を増やす
└──┬──┘
   │ Node のリソース不足
   ▼
┌──────────────────┐
│ Cluster Autoscaler│ → Node を追加
└──────────────────┘
   │
   ▼
Pending Pod がスケジュールされる

HPA と Cluster Autoscaler を組み合わせることで、アプリケーション層からインフラ層まで自動スケーリングが実現できる

注意点

  • HPA と VPA を同じ Pod の CPU/メモリに対して同時に使うと競合する可能性がある
  • VPA と Cluster Autoscaler は別途インストールが必要

関連用語

Pod

Kubernetes における最小のデプロイ単位で、1つ以上のコンテナをまとめたもの

出典: Pods - Kubernetes

Node

Pod を実行する物理または仮想マシン。クラスター内のワーカーマシンのこと

出典: Nodes - Kubernetes

requests / limits

  • requests: Pod が必要とする最小リソース量。スケジューリングの基準になる
  • limits: Pod が使用できる最大リソース量。これを超えると throttle や OOM Kill が発生する

出典: Resource Management for Pods and Containers - Kubernetes