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 の設定をマニフェストとして宣言的に管理します。
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 チャートを使う方法です:
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 リソースを使えば、アノテーションベースで監視対象を柔軟に追加できます:
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・メモリ使用率の監視
# ノードの 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 メソッド)
# リクエストレート(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 固有のクエリ
# 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 を組み合わせることで、障害の早期検知と通知が実現できます。
アラートルールの定義
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 の通知設定
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 のガイドをもとに、本番環境で推奨される設定をまとめます。
高可用性の確保
spec:
replicas: 2
shards: 1
replicaExternalLabelName: __replica__
複数のレプリカを運用し、Thanos や Cortex で長期保存とグローバルビューを実現します。
メトリクスの選定と最適化
Tasrie IT のガイドが警告するように、すべてのメトリクスを無差別に収集するとストレージコストが膨れ上がります。以下の戦略を採用しましょう:
- ラベルカーディナリティの制御: 高カーディナリティなラベル(ユーザー ID やリクエスト ID)は避ける
- Recording Rules の活用: 頻繁に使うクエリは事前に計算し、クエリ負荷を削減
- リテンション期間の適切な設定: ローカルは 15-30 日、長期保存はリモートストレージへ
セキュリティ対策
- NetworkPolicy で Prometheus のアクセスを制限
- RBAC で最小権限の原則を適用
/metricsエンドポイントの認証・暗号化
リモートストレージ連携
remoteWrite:
- url: "http://thanos-receive:19291/api/v1/receive"
queueConfig:
maxSamplesPerSend: 1000
batchSendDeadline: 5s
まとめ
Prometheus は Kubernetes 監視の中核として、メトリクス収集から可視化、アラーティングまでを一貫して提供します。本記事で解説したポイントをまとめると:
- Prometheus Operator を使った宣言的な導入・管理
- サービスディスカバリ による動的なターゲット検出
- PromQL による柔軟なクエリと分析
- Alertmanager による体系的なアラート設計
- HA 構成とリモートストレージ による本番レベルの信頼性
Kubo は K3s ベースで CNCF エコシステムとの高い親和性を持ち、Prometheus をはじめとする監視ツールをすぐに活用できる環境を提供しています。Kubernetes 環境の構築・運用でお困りの方は、ぜひ Kubo をご検討ください。
また、AI を活用した Kubernetes 運用の自動化に興味がある方は、Captain.AI がインテリジェントな運用支援をどのように実現するかもご確認ください。導入のご相談はお問い合わせからお気軽にどうぞ。