(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes/Prometheus】Nginxが動作するPodへのリクエスト数を監視する

スポンサーリンク

はじめに

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ブラウザ上からは以下のような項目が選択できるようになっており

f:id:mtiit:20210603201422p:plain
nginxに関する項目が選択できる
「nginx_connections_accepted」を選ぶと以下のようにリクエスト数が可視化されます。
f:id:mtiit:20210603202601p:plain

終わりに

PrometheusではExporterを自前で実装することもできますが、既存のExporterが存在する場合は今回のようにサクッとアプリケーションを監視対象に含めることが可能になります。

以上、Prometheusによる監視のご参考になれば幸いです。