【入門編】Kubernetes環境でのPrometheus運用:Prometheus Operatorとkube-prometheus-stack徹底解説 – 運用監視・オブザーバビリティ活用バイブル

ようこそ、オブザーバビリティの世界へ。

Kubernetes(K8s)という広大な宇宙を航行する際、羅針盤(モニタリング)なしで進むのは、霧の中を全速力で走るようなものです。かつて私たちは、サーバー一台一台にログインしては `top` コマンドを叩いていましたが、現代のマイクロサービス環境ではそれは不可能です。

今日は、K8s監視のデファクトスタンダードであり、もはや「これ一択」と言っても過言ではない Prometheus Operator、およびその集合体である kube-prometheus-stack についてお話しします。

この記事を読み終える頃には、あなたは「動的なインフラをどうやって静的な設定なしで監視し続けるか」という難問に対する、エレガントな解法を手にしているはずです。

—

1. K8s監視におけるPrometheusの「正解」:Operatorパターン

まず、なぜ普通の Prometheus をそのまま K8s に入れるだけでは不十分なのか、その本質を理解しましょう。

K8s の最大の特徴は「動的(Dynamic)」であることです。Pod は生まれ、消え、IPアドレスは常に変わります。従来の `prometheus.yml` にターゲットのIPを書き込む手法では、10分も経てば設定はゴミと化します。

そこで登場したのが Prometheus Operator です。
これは、「Prometheus の設定を K8s のカスタムリソース(CRD)として定義し、その変更をプログラムが監視して、Prometheus の設定を自動で書き換える」という仕組みです。

  • 手動管理: 職人が `prometheus.yml` を書き、リロードする(ミスが起きやすい)。
  • Operator管理: 「このラベルがついたサービスを監視せよ」という宣言を K8s に投げるだけ。あとは Operator がすべてやってくれる。

この「宣言的(Declarative)」なアプローチこそが、K8s 運用を劇的に楽にする鍵なのです。

—

2. Helmを使った kube-prometheus-stack のデプロイ

それでは、実際に動かしてみましょう。
現在、最も推奨されるインストール方法は、Prometheus、Grafana、Alertmanager、そして各種エクスポーターがセットになった `kube-prometheus-stack` を Helm で導入することです。

インストール手順

まず、Helm リポジトリを追加します。

リポジトリの追加
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

監視専用のNamespaceを作成
kubectl create namespace monitoring

次に、インストールを実行します。初期学習用であれば、デフォルト設定で十分ですが、本番では `values.yaml` をカスタマイズするのが定石です。

kube-prometheus-stack のインストール
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
–namespace monitoring

これだけで、K8s クラスターの CPU、メモリ、ネットワーク、さらには各ノードの健康状態を監視する最強の布陣が整います。

—

3. ServiceMonitor:監視対象を「自動発見」させる魔術

ここがこの記事で最も重要なポイントです。
インストールが終わった後、自分の作ったアプリケーションをどうやって Prometheus に認識させるのでしょうか?

その答えが ServiceMonitor です。

仕組み

Prometheus Operator は、クラスター内の `ServiceMonitor` というリソースを常に監視しています。新しい `ServiceMonitor` が作成されると、Operator は即座に Prometheus の設定を更新し、ターゲットへのスクレイピング(メトリクス収集)を開始します。

具体的な設定例

例えば、`/metrics` エンドポイントを持つ Go アプリケーションがあるとしましょう。

1. アプリケーションの Service 定義
apiVersion: v1
kind: Service
metadata:
name: my-app-service
labels:
app: my-app # このラベルが重要!
spec:
ports:

  • name: web

port: 8080
selector:
app: my-app
—
2. ServiceMonitor の定義(これが Prometheus への指示書)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app-monitor
namespace: monitoring
labels:
release: prometheus-stack # Helmチャートが認識するためのラベル(重要)
spec:
selector:
matchLabels:
app: my-app # 監視対象の Service のラベルと一致させる
endpoints:

  • port: web # Service で定義したポート名

path: /metrics # メトリクスが露出されているパス
interval: 30s # 収集間隔

ここがポイント:
`ServiceMonitor` を作成するだけで、Prometheus 本体の再起動も設定ファイルの書き換えも不要です。開発者は自分のアプリと一緒にこの YAML をデプロイするだけで、監視が自動的にスタートします。これが「K8s ネイティブ」な運用の美しさです。

—

4. リソース枯渇を防ぐための「現場の知見」

Prometheus は非常に強力ですが、何も考えずに運用すると、ある日突然メモリ不足(OOM Killer)で死にます。これは、収集するメトリクスの量(カーディナリティ)が爆発するためです。

現場で震えるような障害を起こさないための、3つの鉄則をお伝えします。

① リソース制限(Limits)の明示

Prometheus のメモリ使用量は、収集する「時系列データ数」に比例します。必ず `values.yaml` で制限をかけましょう。

prometheus:
prometheusSpec:
resources:
requests:
memory: 2Gi
limits:
memory: 4Gi

② 保存期間とサイズの制御

デフォルトでは「15日間」データを保持しますが、ディスク容量も有限です。時間(retention)だけでなく、サイズ(retentionSize)でも制限をかけるのがプロの技です。

retention: 10d
retentionSize: “20GB”

③ 「高カーディナリティ」なラベルを避ける

例えば、ラベルに「ユーザーID」や「セッションID」を入れてはいけません。ユーザーが100万人いれば、100万通りの時系列データが生成され、Prometheus のメモリを一瞬で食い尽くします。ラベルは「種類を特定できる程度の粒度」に留めるのが鉄則です。

—

最後に:あなたに贈るアドバイス

Prometheus 運用において、一番大切なのは「完璧なダッシュボードを作ること」ではありません。「異常が起きたときに、自信を持ってその原因を探れる状態を作っておくこと」です。

今回紹介した `kube-prometheus-stack` と `ServiceMonitor` をマスターすれば、インフラの変更に怯える日々は終わります。システムが生き物のように変化しても、監視がそれに自動で追随してくれるからです。

まずは自分のアプリをデプロイし、`ServiceMonitor` でメトリクスが Grafana に流れてくる瞬間を目撃してください。その時、あなたは一歩先のエンジニアへと進化しているはずです。

もし設定で迷ったら、いつでも聞いてください。オブザーバビリティの道は深く、そして楽しいものです。

健闘を祈ります!

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