HPAだけでは足りないケース
HPA(Horizontal Pod Autoscaler)はCPU/メモリベースのスケーリングには十分ですが、以下のケースには不向きです:
- キュー消費ワーカー:メッセージ数に応じてPodを増減させたい
- バッチ処理:深夜だけPodを立てて昼間はゼロにしたい
- 外部メトリクス:Prometheus の custom metric やDBのコネクション数に反応させたい
KEDAはこれらをシンプルな ScaledObject 定義で解決します。
KEDAのアーキテクチャ
External Source (Service Bus / Prometheus / etc.)
↓
KEDA Scaler (trigger評価)
↓
ScaledObject → HPA (replicaCount調整)
↓
Deployment (Pod増減)
KEDAはHPAを置き換えるのではなく、HPAのメトリクスソースを拡張するツールです。ScaledObjectを作るとKEDAが裏でHPAを自動生成します。
AKSへのインストール
# Helmでインストール
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda \
--namespace keda \
--create-namespace \
--set podIdentity.azureWorkload.enabled=true
Workload Identity連携を有効にしておくと、Azure Service BusへのアクセスにシークレットなしでManaged Identityが使えます。
スケーラーパターン3選
1. Azure Service Busスケーラー
メッセージ数に応じてワーカーPodをスケールアウト。Workload Identityで認証。
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: servicebus-worker-scaler
spec:
scaleTargetRef:
name: message-processor
minReplicaCount: 0 # ゼロスケール許可
maxReplicaCount: 20
pollingInterval: 15
cooldownPeriod: 60
triggers:
- type: azure-servicebus
authenticationRef:
name: keda-workload-identity
metadata:
queueName: order-processing
namespace: myservicebus.servicebus.windows.net
messageCount: "5" # 5メッセージにつき1 Pod
2. Prometheusスケーラー
カスタムメトリクスに基づくスケーリング。リクエストレイテンシやエラーレートをトリガーにできます。
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring.svc:9090
metricName: http_requests_total
query: sum(rate(http_requests_total{service="api"}[2m]))
threshold: "100" # 100 req/s につき1 Pod
3. CRONスケーラー(スケジュールスケーリング)
業務時間帯だけPodを立てる。ゼロスケールと組み合わせてコスト削減に。
triggers:
- type: cron
metadata:
timezone: Asia/Tokyo
start: "0 8 * * 1-5" # 月〜金 8:00
end: "0 20 * * 1-5" # 月〜金 20:00
desiredReplicas: "3"
ゼロスケール運用での注意点
minReplicaCount: 0にすると最大のコスト削減ができますが、コールドスタートが発生します。初回リクエストが遅い場合の対策:
- Readiness Probe を短くする:アプリ起動を高速化
- ScaledJob を使う:バッチ処理は ScaledObject より ScaledJob が適切
- minReplicaCount: 1 に変える:常時1台待機でコールドスタート回避
HPAとの使い分けまとめ
| 条件 | 推奨 |
|---|---|
| CPU/メモリだけでスケールできる | HPA のみ |
| キューのメッセージ数に反応したい | KEDA |
| 夜間ゼロスケールしたい | KEDA (CRON) |
| 外部カスタムメトリクス | KEDA |
| Prometheusメトリクス | KEDA |
まとめ
KEDAはHPAの上位互換ではなく、イベントソースの豊富さが強みです。Service Bus / SQS / Kafka / Prometheusなど50以上のスケーラーが揃っているため、「何かのイベントに反応してPodを増やしたい」という要件はほぼ全部カバーできます。AKSであればWorkload Identityとの相性も良く、導入コストは低めです。