Kubernetes のスケーリング徹底解説：種類・設定方法・実用例


Kubernetes（K8s）は、コンテナ化されたアプリケーションの**自動スケーリング機能**を提供し、トラフィックやリソース負荷に応じて柔軟にPodを増減できます。本記事では、Kubernetesのスケーリング方法について詳細に解説します。

---

## **1. Kubernetes のスケーリングとは？**
Kubernetes のスケーリング（Scaling）とは、**負荷やリソースの使用状況に応じて、Pod やノードの数を自動または手動で調整する機能**です。

### **Kubernetes のスケーリングの種類**
| **スケーリングの種類** | **適用対象** | **概要** |
|-----------------|------------------|----------------------|
| **手動スケーリング** | Deployment / ReplicaSet | 手動でPod数を変更する（kubectl scale） |
| **Horizontal Pod Autoscaler（HPA）** | Pod | CPU/メモリ使用率に応じてPod数を増減 |
| **Vertical Pod Autoscaler（VPA）** | Pod | Podのリソース（CPU/メモリ）を動的に調整 |
| **Cluster Autoscaler（CA）** | ノード | クラスタ全体のノード数を自動調整 |

---

## **2. 手動スケーリング（kubectl scale）**

### **✅ 適用シーン**
- テストやデバッグ時に手動でPodの数を増減したい場合。
- トラフィックの急増が予測される場合に、事前にPodを増やす。

### **🚀 設定手順**
```bash
kubectl scale deployment my-app --replicas=5
```
上記のコマンドで、`my-app` Deployment の Pod 数を **5つに増やす** ことができます。

✅ **確認コマンド**
```bash
kubectl get pods
```

---

## **3. Horizontal Pod Autoscaler（HPA）**

### **✅ 適用シーン**
- 負荷が一定の閾値を超えたら **Pod を増やす**
- 負荷が下がったら **Pod を削減** し、リソースコストを抑える

### **🚀 設定手順**
1. **メトリクスサーバーをセットアップ**
   ```bash
   kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
   ```
2. **HPA を適用する YAML を作成**（例: `hpa.yaml`）
   ```yaml
   apiVersion: autoscaling/v2beta2
   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: 50
   ```
3. **適用コマンド**
   ```bash
   kubectl apply -f hpa.yaml
   ```

✅ **HPA の動作確認**
```bash
kubectl get hpa
```
HPAがCPU使用率に応じてPodをスケールするようになります。

---

## **4. Vertical Pod Autoscaler（VPA）**

### **✅ 適用シーン**
- **Pod の CPU やメモリを自動で最適化** したい場合
- **リソース不足による OOM（Out of Memory）を防ぐ**

### **🚀 設定手順**
1. **VPAを有効化**
   ```bash
   kubectl apply -f https://github.com/kubernetes/autoscaler/releases/latest/download/vertical-pod-autoscaler.yaml
   ```
2. **VPA の適用 YAML を作成**（例: `vpa.yaml`）
   ```yaml
   apiVersion: autoscaling.k8s.io/v1
   kind: VerticalPodAutoscaler
   metadata:
     name: my-app-vpa
   spec:
     targetRef:
       apiVersion: apps/v1
       kind: Deployment
       name: my-app
     updatePolicy:
       updateMode: "Auto"
   ```
3. **適用コマンド**
   ```bash
   kubectl apply -f vpa.yaml
   ```
✅ **VPA の動作確認**
```bash
kubectl get vpa
```
VPAがPodのリソース要求を自動的に調整します。

---

## **5. Cluster Autoscaler（CA）**

### **✅ 適用シーン**
- クラウド環境（AWS, GCP, Azure）で **ノードの数を動的に変更** したい
- Pod がスケールしても、**ノードのリソースが足りなくなる問題を解決**

### **🚀 設定手順（GKEの場合）**
1. **Cluster Autoscaler を有効化**
   ```bash
   gcloud container clusters update my-cluster --enable-autoscaling \
       --min-nodes=1 --max-nodes=10 --node-pool my-node-pool
   ```
2. **設定確認**
   ```bash
   kubectl get nodes
   ```
Cluster Autoscaler がノードの負荷を監視し、Podが増えた際にノードを自動追加します。

---

## **6. Kubernetes スケーリングの実践例（リアルワールド）**

✅ **ユースケース 1: 機械学習推論API のスケール**
- 機械学習の推論APIは、**リクエスト数が急増すると負荷が高くなる**
- **HPA + CA を組み合わせて、Pod とノードのスケールを最適化**

✅ **ユースケース 2: ECサイトのブラックフライデー対応**
- ECサイトは通常時の 10 倍のトラフィックを処理する必要あり。
- **事前に手動スケールで Pod を増加 → HPA で動的対応**

✅ **ユースケース 3: SaaSアプリのマルチテナント環境**
- クラスタのリソースを効率的に利用するために **VPA でメモリ最適化**
- 低負荷時にはリソース消費を抑え、コスト削減

---

## **7. まとめ**
| **スケーリング方法** | **用途** |
|----------------|----------------------------------|
| **手動スケール** | テストや特定の負荷対策 |
| **HPA** | CPU/メモリに応じた Pod の自動増減 |
| **VPA** | Pod のリソース最適化（CPU/メモリ） |
| **Cluster Autoscaler** | クラウド上でノード数を動的調整 |

Kubernetes のスケーリング機能を活用することで、システムの **パフォーマンス向上、コスト最適化、運用負荷軽減** を実現できます。用途に応じた適切なスケーリング手法を選択しましょう！