Skip to main content

Kubernetes オートスケーリング完全ガイド:HPA/VPA/KEDA の使い分けと実践

Kubernetes のオートスケーリングは、パフォーマンスの維持とコスト最適化を両立する鍵です。しかし、HPA・VPA・KEDA・Cluster Autoscaler など複数のツールがあり、「いつ・何を・どう組み合わせるか」は多くのチームにとって悩みの種です。

CNCF 2025 ベンチマークによれば、これらのツールを適切に組み合わせることで、静的プロビジョニングと比較して 30〜50% のコスト削減 が可能です。本記事では、各ツールの特徴を深掘りし、実践的な組み合わせパターンを解説します。

Kubo は月額48,000円〜のマネージド Kubernetes で、オートスケーリングの設定・運用を容易にします。

HPA(Horizontal Pod Autoscaler):水平スケーリングの基本

HPA の仕組み

Kubernetes 公式ドキュメントによれば、HPA はメトリクスに基づいて Pod のレプリカ数を自動調整します。CloudPilot AI の比較分析では、HPA は「CPU またはメモリがボトルネックとなるステートレスワークロードに最適」と評価されています。

基本設定例

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
  namespace: production
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300  # 5分間の安定化期間
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60             # 1分あたり最大10%削減
    scaleUp:
      stabilizationWindowSeconds: 0    # 即座にスケールアップ
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15             # 15秒で最大100%増加

カスタムメトリクスによるスケーリング

CPU/メモリだけでなく、Prometheus のカスタムメトリクスでスケーリングできます:

yaml
metrics:
- type: Pods
  pods:
    metric:
      name: http_requests_per_second
    target:
      type: AverageValue
      averageValue: "1000"

HPA のベストプラクティス

  • minReplicas は可用性要件に基づき最低2以上に設定
  • behavior でスケールダウンの安定化期間を設定し、フラッピングを防止
  • CPU 使用率の閾値は 70〜80% が一般的(Sedai のガイド参照)

VPA(Vertical Pod Autoscaler):リソースの適正化

VPA の仕組み

Kubeify の分析によれば、VPA は Pod の CPU/メモリの requests と limits を実際の使用状況に基づいて自動調整します。ステートフルワークロード、モノリス、バッチジョブなど、安定した予測可能な使用パターンを持つワークロードに最適です。

VPA の3つの動作モード

モード動作推奨用途
Off推奨値を生成するが適用しない分析・計画フェーズ
InitialPod 作成時のみ推奨値を適用段階的な導入
Auto推奨値を自動適用(Pod 再起動あり)安定したワークロード

Goldilocks による可視化

yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: api-server-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-server
  updatePolicy:
    updateMode: "Off"     # 推奨値の確認のみ
  resourcePolicy:
    containerPolicies:
    - containerName: api
      minAllowed:
        cpu: "100m"
        memory: "128Mi"
      maxAllowed:
        cpu: "2"
        memory: "4Gi"

Goldilocks を併用することで、namespace 全体のリソース推奨値をダッシュボードで確認できます。

VPA の重要な注意点

HPA と VPA の競合に注意: VPA の Auto モードと HPA の CPU/メモリベーススケーリングを同時に使用してはいけません。両コントローラーが競合します。正しい組み合わせは「VPA(Off/Initial モード)+ HPA(カスタムメトリクス)」、または「KEDA で HPA を置き換える」です。

Captain.AI では、AI ワーカーのリソース要件が動的に変動するため、VPA の推奨値を活用した継続的なライトサイジングが重要です。

KEDA:イベント駆動型オートスケーリング

KEDA の革新性

KEDA は Kubernetes ベースのイベント駆動型オートスケーラーで、HPA だけではカバーできない外部イベントソースに基づくスケーリングを実現します。バージョン 2.19 の時点で 70以上のビルトインスケーラー を提供しています。

KEDA の最大の強み:Scale to Zero

Spectro Cloud の解説によれば、イベントがない場合は Pod を0にスケールダウンでき、開発環境やバッチ処理で大幅なコスト削減を実現します。

メッセージキューベースのスケーリング例

RabbitMQ のキュー深度に基づくスケーリング:

yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: worker-scaler
  namespace: production
spec:
  scaleTargetRef:
    name: queue-worker
  pollingInterval: 10           # 10秒ごとにチェック
  cooldownPeriod: 60            # 60秒のクールダウン
  minReplicaCount: 0            # Scale to Zero!
  maxReplicaCount: 20
  triggers:
  - type: rabbitmq
    metadata:
      host: "amqp://rabbitmq.production.svc.cluster.local:5672"
      queueName: tasks
      queueLength: "5"          # キュー内5メッセージごとに1 Pod

Prometheus メトリクスによるスケーリング

yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: api-scaler
spec:
  scaleTargetRef:
    name: api-server
  minReplicaCount: 1
  maxReplicaCount: 50
  triggers:
  - type: prometheus
    metadata:
      serverAddress: http://prometheus.monitoring.svc.cluster.local:9090
      metricName: http_request_duration_seconds_p99
      threshold: "0.5"           # P99 レイテンシが 500ms を超えたらスケールアップ
      query: |
        histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{service="api"}[5m])) by (le))

Cron ベースのスケーリング

予測可能なトラフィックパターンに対応:

yaml
triggers:
- type: cron
  metadata:
    timezone: Asia/Tokyo
    start: "0 8 * * 1-5"        # 平日8時にスケールアップ
    end: "0 20 * * 1-5"         # 平日20時にスケールダウン
    desiredReplicas: "10"

組み合わせパターンとベストプラクティス

推奨構成パターン

DEV Community の比較記事Tasrie IT のベンチマークに基づく推奨パターン:

ワークロードタイプ推奨構成
Web API(ステートレス)HPA(CPU/カスタムメトリクス)+ Cluster Autoscaler
バッチ処理KEDA(キュー深度)+ Scale to Zero
データベース(ステートフル)VPA(Auto)+ 手動ノード管理
AI 推論KEDA(Prometheus メトリクス)+ Karpenter
開発環境KEDA(Cron)+ Scale to Zero

Karpenter との統合

Karpenter は CNCF 2025 ベンチマークで、Cluster Autoscaler より 40% 高速なノードプロビジョニングを実証しています。Pod レベルのスケーリング(HPA/KEDA)とノードレベルのスケーリング(Karpenter)を組み合わせることで、最大の効率を実現します。

コスト影響の定量化

最適化手法期待削減率
HPA のみ10〜20%
HPA + VPA(Off モード分析)20〜30%
KEDA(Scale to Zero)30〜50%(非本番)
全ツール統合 + Karpenter30〜50%(本番含む)

Kubo なら、月額48,000円〜の明瞭な料金体系でこれらのオートスケーリング機能をフル活用できます。

まとめ:適切なツール選択でコストとパフォーマンスを両立

Kubernetes のオートスケーリングは、単一のツールではなく複数のツールの適切な組み合わせで最大の効果を発揮します:

  • hpa: cpu-メモリベースの水平スケーリングの標準。ステートレスワークロードに
  • VPA: リソースの適正化。まずは Off モードで分析から開始
  • KEDA: 70以上のイベントソースによるスケーリングと Scale to Zero
  • Karpenter / Cluster Autoscaler: ノードレベルの自動プロビジョニング

Kubo は、これらのオートスケーリングツールがすぐに使えるマネージド Kubernetes 環境を月額48,000円〜で提供しています。 Captain.AI との統合で AI ワークロードの自動スケーリングも実現できます。

オートスケーリングの設計・導入のご相談は お問い合わせ まで。

← Back to all posts