Kubernetes監視の深淵:kube-prometheus-stackを「ただ動かす」から「真の武器にする」ための極限設計
こんにちは。オブザーバビリティの戦場に立つ皆さん。
KubernetesにおけるPrometheus運用において、`kube-prometheus-stack`をHelmで叩いて「メトリクスが見れました。完了です」で満足していないだろうか? それは、フェラーリを近所のコンビニへの買い物だけに使うようなものだ。
Prometheus Operatorは単なる監視エージェントではない。Kubernetesの宣言的インフラそのものを監視の対象として統合するための、極めて強力な「制御装置」だ。今日は、現場の生産性を10倍に引き上げ、障害の予兆を逃さないための「プロの運用作法」を伝授する。
—
1. なぜ「kube-prometheus-stack」なのか:抽象化の真価
単体のPrometheusをマニュアルで構築するのは、2024年の今となってはアンチパターンだ。理由は単純。Prometheusの管理自体がKubernetesの運用コストを肥大化させるからだ。
`kube-prometheus-stack`は、Prometheus、Grafana、Alertmanager、そして各メトリクス収集のルールを「CRD(Custom Resource Definition)」として管理する。つまり、監視設定もすべてGitOpsのフローに乗せることができる。これが、開発スピードを落とさずに信頼性を担保する唯一の道だ。
2. ServiceMonitorとPodMonitorの「正しい使い分け」
多くのエンジニアが混同しているが、この二つは明確に役割が異なる。
- ServiceMonitor: Serviceを起点にエンドポイントを自動検知する。「アプリケーションがServiceとして公開されているなら、これを使え」。ラベルセレクタに基づき、Service配下のPodを動的に追跡してくれる。
- PodMonitor: Serviceを介さず、Podに直接紐づくメトリクスを叩く。「サイドカーパターンや、Serviceを定義したくない特殊なケース」で使う。
【現場の極意】: 常にServiceMonitorを優先せよ。ServiceはKubernetesのサービスディスカバリの基本単位であり、ここをハブにすることで、Podの入れ替わりを一切意識せずに監視を継続できる。
—
3. リソース枯渇を防ぐ:現場で死なないためのチューニング
Prometheusの運用で最も多い悲劇は「OutOfMemory (OOM)」によるコンテナのクラッシュだ。これを防ぐには、TSDBの保持期間とサンプルレートの最適化が必須である。
values.yamlのベストプラクティス
prometheus:
prometheusSpec:
# 保持期間を短くし、長期保存はThanosやCortexにオフロードする前提で設計する
retention: 15d
# メモリ不足を防ぐためのチャンクサイズ制限
storageSpec:
volumeClaimTemplate:
spec:
resources:
requests:
storage: 50Gi
# 物理メモリを監視し、OOMを起こす前にクエリを制限する
queryMaxConcurrency: 20
queryMaxSamples: 50000000 # 5000万サンプルを超えたクエリは強制終了
—
4. チーム開発を加速させる「設定の共有化ルール」
監視設定が属人化すると、誰もアラートを読まなくなる。以下のルールをチームの憲法にしてほしい。
1. アラートはコードで管理し、CIでlintを通す: `promtool check rules` をCIパイプラインに組み込み、構文エラーや重複したルールをマージ前に弾く。
2. アラートには必ず「Runbook」へのリンクを載せる:
annotations:
summary: “High Latency in {{ $labels.namespace }}”
# 障害発生時に「何をすべきか」を即座に開けるURLを付与する
runbook_url: “https://wiki.internal/docs/incidents/high-latency-manual”
3. Recording Rulesの徹底活用: Grafanaでクエリを直接書くな。複雑な計算はRecording Ruleで行い、Grafanaは単純なPromQLで読み出すだけにする。これでダッシュボードの表示が爆速になる。
—
5. 生産性を底上げする「神プラグインとショートカット」
日々の運用で、Grafanaのダッシュボードを何度も行き来するのは時間の無駄だ。
- Grafanaの神プラグイン:
- “Infinity”: Prometheus以外の外部API(CloudWatchや独自のDB統計)を可視化する。
- “State Timeline”: 障害の相関関係(Podの再起動とエラー率の急上昇など)を時系列で重ねて見るのに最適。
- キーボードショートカット (Grafana):
- `d + t`: ダッシュボードの時間をグローバルに変更。
- `d + r`: ダッシュボードの強制リフレッシュ。
- `Ctrl + S`: 即時保存(地味だが必須)。
—
最後に:オブザーバビリティは「文化」である
Prometheusの設定をどれだけ完璧にしても、肝心のアプリケーションがメトリクスを出力していなければ意味がない。`instrumentation`(計測)の重要性を開発チームに説き、「メトリクスが出ないコードは、本番環境にリリースする資格がない」という文化を根付かせてほしい。
監視は単なる監視ではなく、システムと対話するためのインターフェースだ。今日の知識が、皆さんの運用における「静かな夜」をもたらすことを祈っている。
何か具体的な実装で行き詰まったら、またいつでも尋ねてくれ。コードを叩きながら一緒に解決しよう。