【入門編】Prometheusのホリゾンタル・オートスケーリング連携:KEDAを用いた動的なスクレイピングターゲット拡張と負荷分散 – 運用監視・オブザーバビリティ活用バイブル

こんにちは。オブザーバビリティの世界へようこそ。

現場で「なぜかメトリクスが取れない」「バッチが動くたびに監視設定を書き換えるのが辛い」と絶望したことはありませんか? 今日は、そんな苦行からあなたを解放する、PrometheusとKEDAを組み合わせた「動的監視アーキテクチャ」の真髄を伝授します。

これは単なるツール紹介ではありません。「システムが自律的に自身の状態を観測し、最適化する」という、モダンなエンジニアリングの核心に迫る話です。

—

1. なぜ「動的」である必要があるのか?

大規模なバッチ処理やイベント駆動型のアーキテクチャにおいて、ワーカー(処理を行うPod)は負荷に応じて増減します。もし、監視対象を静的なリストで管理していたら?

  • 課題: スケールアウトした瞬間に監視対象から漏れ、エラーの予兆を見逃す。
  • 悲劇: スケールインした瞬間に「死んだはずのPod」が監視対象に残り、アラートが鳴り止まない(ゾンビ・メトリクスの恐怖)。

Prometheusのデフォルト設定(static_config)は、この動的な世界にはあまりに無力です。ここで登場するのが、Kubernetesの「イベント駆動の魔術師」であるKEDAです。

—

2. アーキテクチャの神髄:KEDA × Prometheusの連携

KEDAの本来の役割はオートスケーリングですが、今回は「Prometheusに動的な対象を教えるハブ」として使います。

  • Prometheus: `ServiceDiscovery` を使い、Kubernetes API経由でPodの存在を常に監視。
  • KEDA: 負荷に応じてPodを増減させる司令塔。
  • Kubernetes Service: Podの羅列を一つのエンドポイントに抽象化するクッション。

この構成なら、Prometheus側は「このラベルを持つPodを全部スクレイプせよ」と一度設定するだけで、あとはKEDAがPodを増やそうが減らそうが、自動的に追従してくれます。

—

3. 実践:KEDAでバッチを制御し、Prometheusで捉える

まずは、最も重要な設定から見ていきましょう。

ステップ1:Podを識別するためのService定義

Podを個別に追うのではなく、ラベルでグルーピングします。

apiVersion: v1
kind: Service
metadata:
name: worker-service
labels:
app: batch-worker # Prometheusはこのラベルを目印にする
spec:
selector:
app: batch-worker
ports:

  • port: 8080

ステップ2:KEDAで負荷に応じてオートスケール

キューの深さやCPU負荷をトリガーに、ワーカーを動的に増減させます。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: worker-scaler
spec:
scaleTargetRef:
name: batch-worker-deployment # 対象のデプロイメント
minReplicaCount: 1
maxReplicaCount: 10
triggers:

  • type: prometheus # Prometheusのメトリクスをトリガーにする

metadata:
serverAddress: http://prometheus-server.monitoring.svc.cluster.local
metricName: worker_queue_depth # キューの長さ
threshold: ’50’ # 50を超えたらスケールアウト

ステップ3:Prometheusの自動発見(ServiceMonitor)

Prometheus Operatorを使っているなら、これが最もスマートです。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: worker-monitor
labels:
release: prometheus # Prometheusインスタンスと紐付けるラベル
spec:
selector:
matchLabels:
app: batch-worker # ここで先ほどのServiceを自動発見する
endpoints:

  • port: metrics # メトリクス公開用ポート

interval: 15s # 15秒おきにスクレイプ

—

4. 運用上の「震えるほど役立つ」注意点

この仕組みを導入する際、現場で必ずハマるポイントがあります。これを押さえておくだけで、あなたの信頼度は跳ね上がります。

1. メトリクスのカーディナリティ(高次元化)に注意:
Podが動的に増減すると、メトリクスに `pod_name` などのラベルが大量に付与されます。PrometheusのTSDBがパンクしないよう、不要なラベルは `relabel_configs` で削ぎ落とすのがプロの技です。
2. スクレイプ間隔の調整:
オートスケールする速度よりも、スクレイプ間隔が長すぎると、急激な負荷変動時に「Podが死んでいるのにメトリクスが残る」現象が起きます。`15s` 程度が妥当ですが、システムの重要度に応じて最適化してください。
3. Pod Readiness Probeの徹底:
Prometheusは `Ready` 状態のPodしかスクレイプしません。ワーカーが起動して準備が整う前にスクレイプしようとするとエラーログで埋め尽くされます。必ず `readinessProbe` を正しく設定しましょう。

—

最後に:あなたへのアドバイス

「監視」とは、単にグラフを見ることではありません。「システムが今、どういう状態で生きているのか」を正確に把握するための対話です。

KEDAでスケーリングを自動化し、Prometheusでその変動を完璧にキャプチャする。この構成を組めれば、あなたは深夜の呼び出しから解放され、より創造的な開発に時間を割けるようになります。

まずは、小さなワーカーを1つ動かして、`ServiceMonitor` がそれを掴む様子を観察してみてください。そのグラフに線が描かれた瞬間、きっとエンジニアとしての新しい視界が開けるはずです。

何か詰まったら、いつでも聞いてくださいね。応援しています!

タイトルとURLをコピーしました