はじめに
PrometheusではExporterと呼ばれるオブジェクトが監視対象からリソースを取得することでデータを一元的に管理することができます。
本記事ではNginxを例にExporterを準備し、PrometheusからNginxのリソースを確認する流れについて記載しました。
尚Prometheusのインストールは以下記事を参考ください。
環境情報
$ kubectl get prometheus --all-namespaces NAMESPACE NAME VERSION REPLICAS AGE prometheus prometheus-prometheus-oper-prometheus v2.18.2 1 xx
$ kubectl get node NAME STATUS ROLES AGE VERSION xx Ready <none> xx v1.20.7+IKS
nginx-prometheus-exporterをデプロイする
「NGINX Prometheus Exporter」公式ドキュメントには以下が要件とあるので
Expose the built-in metrics in NGINX:
For NGINX, expose the stub_status page at /stub_status on port 8080.
以下コマンドで「--with-http_stub_status_module」が存在することを確認して
# nginx -V
nginx.confに以下を追記します。
server { listen 8080; location /metrics { stub_status; } }
そしてnginxにサイドカーとしてnginx-prometheus-exporterを展開します。
spec: containers: - name: nginx image: nginx ports: - containerPort: 80 - name: nginx-exporter image: nginx/nginx-prometheus-exporter ports: - containerPort: 9113 args: - -nginx.scrape-uri=http://localhost:8080/metrics
ServiceMonitorの作成
Prometheusではサービスモニターというリソースがあり、そのリソースを動かすことでWebから値を確認できます。
デフォルトでは以下のような状態。
$ kubectl get servicemonitor -n prometheus NAME AGE prometheus-prometheus-oper-alertmanager X prometheus-prometheus-oper-apiserver X prometheus-prometheus-oper-coredns X prometheus-prometheus-oper-grafana X prometheus-prometheus-oper-kube-controller-manager X prometheus-prometheus-oper-kube-etcd X prometheus-prometheus-oper-kube-proxy X prometheus-prometheus-oper-kube-scheduler X prometheus-prometheus-oper-kube-state-metrics X prometheus-prometheus-oper-kubelet X prometheus-prometheus-oper-node-exporter X prometheus-prometheus-oper-operator X prometheus-prometheus-oper-prometheus X
ここにNginx用のサービスモニターを準備しますが、構文は以下。
$ kubectl explain servicemonitor.spec KIND: ServiceMonitor VERSION: monitoring.coreos.com/v1.. FIELDS: endpoints <[]Object> -required- A list of endpoints allowed as part of this ServiceMonitor. jobLabel <string> The label to use to retrieve the job name from. namespaceSelector <Object> Selector to select which namespaces the Endpoints objects are discovered from. podTargetLabels <[]string> PodTargetLabels transfers labels on the Kubernetes Pod onto the target. sampleLimit <integer> SampleLimit defines per-scrape limit on number of scraped samples that will be accepted. selector <Object> -required- Selector to select Endpoints objects. targetLabels <[]string> TargetLabels transfers labels on the Kubernetes Service onto the target.
それに沿って以下のサービスモニターを展開すると
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: nginx-servicemonitor namespace: prometheus labels: app: nginx release: prometheus spec: endpoints: - port: nginx-exporter namespaceSelector: matchNames: - default selector: matchLabels: app: nginx
起動に1分程度かかりますが、成功するとNginxのPodのログに以下のメッセージが出力されます。
127.0.0.1 - - [XX] "GET /metrics HTTP/1.1" 200 101 "-" "NGINX-Prometheus-Exporter/v" "-"
Prometheusで確認する
Webブラウザ上からは以下のような項目が選択できるようになっており「nginx_connections_accepted」を選ぶと以下のようにリクエスト数が可視化されます。
終わりに
PrometheusではExporterを自前で実装することもできますが、既存のExporterが存在する場合は今回のようにサクッとアプリケーションを監視対象に含めることが可能になります。
以上、Prometheusによる監視のご参考になれば幸いです。