Horizontal Pod Autoscaler
Kubernetes で Pod のレプリカ数を CPU 使用率やカスタムメトリクスに基づいて自動調整する仕組み
Kubernetesスケーリング
Horizontal Pod Autoscaler とは
Horizontal Pod Autoscaler (HPA) は、Kubernetes で Pod のレプリカ数を CPU 使用率、メモリ使用率、カスタムメトリクスに基づいて自動的にスケールイン/スケールアウトする仕組みである。トラフィックの増減に応じて Pod 数を動的に調整し、リソース効率とパフォーマンスを両立する。
基本的な設定
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU 使用率 70% を目標
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
CPU 使用率が 70% を超えると Pod を追加し、下回ると削減する。
スケーリングの仕組み
desiredReplicas = ceil(currentReplicas × (currentMetric / targetMetric))
例: 現在 3 Pod、CPU 使用率 90%、目標 70%
desiredReplicas = ceil(3 × (90 / 70)) = ceil(3.86) = 4
HPA コントローラーは 15 秒ごとにメトリクスを確認し、必要に応じてレプリカ数を調整する。
カスタムメトリクスによるスケーリング
CPU/メモリだけでなく、アプリケーション固有のメトリクス (リクエスト数、キューの深さ) でスケーリングできる。
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 100 # Pod あたり 100 req/s を目標
Prometheus Adapter や KEDA (Kubernetes Event-Driven Autoscaling) を使って、外部メトリクスソースと連携する。
スケーリングの安定化
急激なスケールイン/スケールアウトを防ぐため、HPA にはクールダウン期間がある。
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # 5分間の安定化期間
policies:
- type: Percent
value: 10 # 1回で最大10%削減
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0 # スケールアップは即座に
policies:
- type: Percent
value: 100 # 1回で最大100%追加
periodSeconds: 60
スケールダウンは慎重に (5 分の安定化期間)、スケールアップは即座に行うのが一般的だ。
VPA (Vertical Pod Autoscaler) との違い
| 種類 | スケール方向 | 調整対象 |
|---|---|---|
| HPA | 水平 (Pod 数を増減) | レプリカ数 |
| VPA | 垂直 (リソースを増減) | CPU/メモリの requests/limits |
HPA と VPA は同じメトリクス (CPU) で同時に使うと競合する。HPA で Pod 数を調整し、VPA で個々の Pod のリソースを最適化する場合は、VPA を CPU 以外のメトリクスで使う。
HPA vs VPA vs KEDA
| ツール | スケール対象 | メトリクス |
|---|---|---|
| HPA | Pod 数 (水平) | CPU, メモリ |
| VPA | Pod のリソース (垂直) | CPU, メモリ |
| KEDA | Pod 数 (水平) | SQS, カスタム |
理論と実装の両面から学ぶなら関連書籍が参考になる。