Horizontal Pod Autoscaler（HPA）とVertical Pod Autoscaler（VPA）とは？



Kubernetes には、ワークロードの負荷に応じてリソースを自動で調整する **オートスケーリング機能** があります。その代表的な手法が **Horizontal Pod Autoscaler（HPA）** と **Vertical Pod Autoscaler（VPA）** です。

これらは **目的が異なるスケーリング手法** なので、それぞれの特長を理解し、適切に使い分けることが重要です。

---

## **1. Horizontal Pod Autoscaler（HPA）とは？**

### **概要**
HPA は **Pod の数を動的に増減する** ことで負荷に対応する仕組みです。

- CPU 使用率、メモリ使用量、カスタムメトリクス（例: リクエスト数）を基にスケール
- トラフィック増加時に **Pod を増やし（スケールアウト）**、負荷が減ると **Pod を削減（スケールイン）**
- アプリケーションの可用性を向上させ、リソースの無駄を削減

### **HPA の仕組み**
1. Kubernetes の **メトリクスサーバー** からリソース使用状況を取得
2. 事前設定したしきい値を超えた場合、Pod を増加
3. 負荷が減少すると、Pod の数を減らす

### **HPA の設定例**
以下は、CPU 使用率が 50% を超えたら **Pod 数を増やす** 設定です。

```yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: example-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: 50
```

この設定では、
- **最低 2 Pod、最大 10 Pod までスケール**
- **CPU 使用率が 50% を超えたら新しい Pod を追加**

### **HPA のメリット**
✅ **動的スケーリングでトラフィック変動に対応**
✅ **高可用性を確保しつつ、リソースを最適化**
✅ **スケールイン・スケールアウトが自動化され、運用コスト削減**

### **HPA のデメリット**
⚠️ **Pod の起動に時間がかかる**（急激な負荷増に弱い）
⚠️ **メモリ使用量の増減には対応しづらい**

---

## **2. Vertical Pod Autoscaler（VPA）とは？**

### **概要**
VPA は **Pod の CPU・メモリリソースを動的に調整する** ことで最適なリソース配分を実現します。

- 個々の Pod に **最適なリソース割り当て** を行う
- **スケールアウトせずに、既存の Pod のリソースを増やす**
- CPU やメモリの不足・過剰配分を防ぎ、リソース効率を向上

### **VPA の仕組み**
1. Kubernetes の **リソースメトリクス** を監視
2. **CPU・メモリの使用率に応じて、Pod のリソースを変更**
3. Pod を一時停止し、新しいリソース割り当てで再起動

### **VPA の設定例**
以下は、Pod の CPU・メモリを自動調整する VPA の設定です。

```yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: example-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: Auto
  resourcePolicy:
    containerPolicies:
      - containerName: '*'
        minAllowed:
          cpu: "100m"
          memory: "256Mi"
        maxAllowed:
          cpu: "2"
          memory: "4Gi"
```

この設定では、
- **CPU 100m ~ 2コア、メモリ 256Mi ~ 4Gi の範囲で自動調整**
- **リソースの変更が必要な場合、Pod を再起動して適用**

### **VPA のメリット**
✅ **リソースの最適化により、過剰プロビジョニングを防げる**
✅ **HPA と組み合わせると、より効率的なスケーリングが可能**
✅ **Pod の数を増やさずに、処理能力を向上できる**

### **VPA のデメリット**
⚠️ **Pod の再起動が必要（ダウンタイムが発生する可能性あり）**
⚠️ **トラフィック急増には対応できない（HPA と併用推奨）**

---

## **3. HPA と VPA の使い分け**

| | **HPA（水平スケーリング）** | **VPA（垂直スケーリング）** |
|---|---|---|
| **動作方式** | Pod の数を増減する | Pod のリソース（CPU・メモリ）を調整する |
| **適用対象** | トラフィック増減に対応 | リソースの最適化（過剰 or 不足の防止） |
| **スケール方式** | **スケールアウト/スケールイン** | **リソース増減（Pod 再起動）** |
| **メリット** | 即時対応が可能、可用性向上 | リソース効率が良くコスト削減できる |
| **デメリット** | CPU 以外のリソース調整が難しい | Pod の再起動が必要（ダウンタイムあり） |
| **適用例** | Web アプリ・API サーバー | バッチ処理・機械学習モデル |

---

## **4. HPA & VPA のベストプラクティス**

### **✅ HPA と VPA を組み合わせる（Hybrid Scaling）**
- **VPA を「オフライン最適化」用に設定し、リソースを適正化**
- **HPA を「リアルタイムスケーリング」用に設定し、即応性を確保**

### **✅ 事前にメトリクスを分析して閾値を設定**
- Prometheus や Datadog で負荷パターンを分析
- 最適な CPU 使用率の閾値を決める

---

## **5. まとめ**
- **HPA は「スケールアウト」** に向いており、トラフィック急増時に有効
- **VPA は「リソース最適化」** に向いており、過剰プロビジョニングを防ぐ
- **HPA と VPA を併用することで、最適なスケーリングが可能**

適切なスケーリング戦略を選び、Kubernetes の運用を効率化しましょう！