Skip to main content

Prometheus で Kubernetes を監視する完全ガイド

Kubernetes クラスタを安定運用するうえで、監視基盤の構築は避けて通れません。CNCF Graduated プロジェクトである Prometheus は、クラウドネイティブ環境における監視のデファクトスタンダードとして広く採用されています。Kubo のような K3s ベースの軽量 Kubernetes プラットフォームでも、Prometheus は最小限のリソースで強力な監視機能を提供します。本記事では、Prometheus による Kubernetes 監視の導入から本番運用までを体系的に解説します。

Prometheus のアーキテクチャと基本概念

Prometheus は、SoundCloud で 2012 年に開発され、2016 年に Kubernetes に次いで CNCF に加入したオープンソースの監視・アラートシステムです。その最大の特徴は プルベース のメトリクス収集モデルにあります。Prometheus サーバーが定期的に監視対象の HTTP エンドポイントをスクレイプし、時系列データとして保存します。

Prometheus のデータモデルは多次元的で、メトリクス名とキー/バリューペア(ラベル)で識別されます。例えば、http_requests_total{method="GET", status="200"} のように、単一のメトリクスに複数の次元でフィルタリングやアグリゲーションが可能です。

主要コンポーネントは以下のとおりです:

  • Prometheus Server: メトリクスのスクレイプと時系列データの保存を担当
  • Alertmanager: アラートのルーティング、重複排除、通知(Slack、PagerDuty、Email 等)を管理
  • Pushgateway: 短命なバッチジョブからのメトリクス受信用中継サーバー
  • 各種 Exporter: Node Exporter(ハードウェア/OS メトリクス)、kube-state-metrics(Kubernetes オブジェクト状態)など
  • クライアントライブラリ: Go、Java、Python、Ruby 等でアプリケーションを計装

Sysdig の包括ガイドによると、Prometheus の Go 製バイナリは単一ノードで自律的に動作し、分散ストレージに依存しないため、デプロイと運用が非常にシンプルです。

AI を活用した運用自動化にも興味がある方は、Captain.AI が Kubernetes 環境の運用効率化をどのように実現するかもぜひご覧ください。

Kubernetes 環境での導入方法

Prometheus Operator による宣言的管理

本番環境では、Prometheus Operator を使った導入が推奨されます。Prometheus Operator は Kubernetes のカスタムリソース(CRD)を使って、Prometheus の設定をマニフェストとして宣言的に管理します。

yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: k8s-prometheus
  namespace: monitoring
spec:
  replicas: 2
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      team: platform
  retention: 30d
  resources:
    requests:
      memory: 400Mi

最も手軽な導入方法は kube-prometheus-stack Helm チャートを使う方法です:

bash
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace

この Helm チャートには Prometheus Server、Alertmanager、Grafana、Node Exporter、kube-state-metrics が含まれており、すぐに使える監視スタックが構築できます。

Kubernetes サービスディスカバリ

Prometheus は Kubernetes API と連携し、Pod、Service、Endpoint、Node を自動的に検出します。ServiceMonitor リソースを使えば、アノテーションベースで監視対象を柔軟に追加できます:

yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app-monitor
spec:
  selector:
    matchLabels:
      app: my-app
  endpoints:
  - port: metrics
    interval: 15s

Kubo は K3s ベースで CNCF エコシステムとの高い親和性を持つため、Prometheus の導入もスムーズに行えます。

PromQL を使いこなす:実践的なクエリ例

PromQL(Prometheus Query Language)は、Prometheus の多次元データモデルを最大限に活用するための強力なクエリ言語です。Logz.io のガイドでも強調されているように、適切な PromQL クエリの設計がプロアクティブな監視の鍵となります。

CPU・メモリ使用率の監視

promql
# ノードの CPU 使用率(%)
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# Pod のメモリ使用率
container_memory_working_set_bytes{container!="POD",container!=""}
  / on(namespace, pod) kube_pod_container_resource_limits{resource="memory"} * 100

リクエストレートとエラー率(RED メソッド)

promql
# リクエストレート(1分あたり)
sum(rate(http_requests_total[5m])) by (service)

# エラー率(%)
sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
  / sum(rate(http_requests_total[5m])) by (service) * 100

# レイテンシ P99
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))

Kubernetes 固有のクエリ

promql
# Pending 状態の Pod 数
kube_pod_status_phase{phase="Pending"}

# CrashLoopBackOff の検出
increase(kube_pod_container_status_restarts_total[1h]) > 5

# PVC の使用率
kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes * 100

Alertmanager によるアラート設計

安定した運用のためには、適切なアラート設計が不可欠です。Prometheus のアラーティングルールと Alertmanager を組み合わせることで、障害の早期検知と通知が実現できます。

アラートルールの定義

yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: kubernetes-alerts
  namespace: monitoring
spec:
  groups:
  - name: kubernetes.rules
    rules:
    - alert: PodCrashLooping
      expr: increase(kube_pod_container_status_restarts_total[1h]) > 5
      for: 10m
      labels:
        severity: warning
      annotations:
        summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} が頻繁に再起動しています"
    - alert: HighMemoryUsage
      expr: |
        container_memory_working_set_bytes{container!="POD",container!=""}
        / on(namespace,pod) kube_pod_container_resource_limits{resource="memory"} > 0.9
      for: 5m
      labels:
        severity: critical
      annotations:
        summary: "メモリ使用率が 90% を超えています"

Alertmanager の通知設定

yaml
route:
  receiver: 'slack-notifications'
  group_by: ['alertname', 'namespace']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
  - match:
      severity: critical
    receiver: 'pagerduty-critical'

receivers:
- name: 'slack-notifications'
  slack_configs:
  - channel: '#alerts'
    send_resolved: true
- name: 'pagerduty-critical'
  pagerduty_configs:
  - service_key: '<service-key>'

Apptio のガイドが指摘するように、Alertmanager を Prometheus とは別プロセスで運用することで、Prometheus に問題が発生してもアラーティング機能が独立して動作し続けます。

Captain.AI と組み合わせれば、アラート発生時に AI が自動的に原因を分析し、対処の提案を行うワークフローの構築も可能です。

本番環境でのベストプラクティス

Trilio のベストプラクティスガイドPlural のガイドをもとに、本番環境で推奨される設定をまとめます。

高可用性の確保

yaml
spec:
  replicas: 2
  shards: 1
  replicaExternalLabelName: __replica__

複数のレプリカを運用し、Thanos や Cortex で長期保存とグローバルビューを実現します。

メトリクスの選定と最適化

Tasrie IT のガイドが警告するように、すべてのメトリクスを無差別に収集するとストレージコストが膨れ上がります。以下の戦略を採用しましょう:

  • ラベルカーディナリティの制御: 高カーディナリティなラベル(ユーザー ID やリクエスト ID)は避ける
  • Recording Rules の活用: 頻繁に使うクエリは事前に計算し、クエリ負荷を削減
  • リテンション期間の適切な設定: ローカルは 15-30 日、長期保存はリモートストレージへ

セキュリティ対策

  • NetworkPolicy で Prometheus のアクセスを制限
  • RBAC で最小権限の原則を適用
  • /metrics エンドポイントの認証・暗号化

リモートストレージ連携

yaml
remoteWrite:
- url: "http://thanos-receive:19291/api/v1/receive"
  queueConfig:
    maxSamplesPerSend: 1000
    batchSendDeadline: 5s

まとめ

Prometheus は Kubernetes 監視の中核として、メトリクス収集から可視化、アラーティングまでを一貫して提供します。本記事で解説したポイントをまとめると:

  1. Prometheus Operator を使った宣言的な導入・管理
  2. サービスディスカバリ による動的なターゲット検出
  3. PromQL による柔軟なクエリと分析
  4. Alertmanager による体系的なアラート設計
  5. HA 構成とリモートストレージ による本番レベルの信頼性

Kubo は K3s ベースで CNCF エコシステムとの高い親和性を持ち、Prometheus をはじめとする監視ツールをすぐに活用できる環境を提供しています。Kubernetes 環境の構築・運用でお困りの方は、ぜひ Kubo をご検討ください。

また、AI を活用した Kubernetes 運用の自動化に興味がある方は、Captain.AI がインテリジェントな運用支援をどのように実現するかもご確認ください。導入のご相談はお問い合わせからお気軽にどうぞ。

← Back to all posts