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 比較表
| 項目 | HPA | VPA | Cluster Autoscaler |
|---|---|---|---|
| 正式名称 | Horizontal Pod Autoscaler | Vertical Pod Autoscaler | Cluster 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 | 推奨値の計算のみ |
| Initial | Pod 作成時のみ適用 |
| Recreate | Pod を再作成して適用 |
| 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
動作
スケールアップ:
- HPA が Pod を増やそうとする
- Node のリソース不足で Pod が Pending になる
- Cluster Autoscaler が新しい Node を追加
スケールダウン:
- Node の使用率が低い状態が続く
- Pod を他の Node に移動可能か確認
- 移動後、不要な Node を削除
ユースケース
- 大規模バッチジョブ実行時の一時的なノード追加
- 夜間・週末のノード削減によるコスト最適化
連携パターン
負荷増加
│
▼
┌─────┐
│ HPA │ → Pod数を増やす
└──┬──┘
│ Node のリソース不足
▼
┌──────────────────┐
│ Cluster Autoscaler│ → Node を追加
└──────────────────┘
│
▼
Pending Pod がスケジュールされる
HPA と Cluster Autoscaler を組み合わせることで、アプリケーション層からインフラ層まで自動スケーリングが実現できる
注意点
- HPA と VPA を同じ Pod の CPU/メモリに対して同時に使うと競合する可能性がある
- VPA と Cluster Autoscaler は別途インストールが必要
関連用語
Pod
Kubernetes における最小のデプロイ単位で、1つ以上のコンテナをまとめたもの
Node
Pod を実行する物理または仮想マシン。クラスター内のワーカーマシンのこと
requests / limits
- requests: Pod が必要とする最小リソース量。スケジューリングの基準になる
- limits: Pod が使用できる最大リソース量。これを超えると throttle や OOM Kill が発生する
出典: Resource Management for Pods and Containers - Kubernetes