＃19 Rook、PostgreSQLのexporterを追加してみる

本記事は[PostgreSQL on Kubernetes Advent Calendar 2018](https://qiita.com/advent-calendar/2018/postgresonk8s)の19日目です。
昨日は「[モニタリング(Prometheus、Grafana)を追加してみる](https://qiita.com/tzkoba/items/fb8bbab99c52cb20bc25)」ということで、PostgreSQL on Kubernetesの環境にPrometheusとGrafanaの追加をしてみました。

正直、今回はかなり苦戦しています。
PrometheusのNamespaceまたがりでの監視は色々事例があるのですが、やってみると中々上手くいかないものですね。

# TL;DR

+ 今日は失敗事例。
+ PrometheusのNamespaceではまってます

# Rook/Cephのモニタリングを追加する
RookではCephのモニタリングも意識しており、githubにも[monitoring](https://github.com/rook/rook/tree/master/cluster/examples/kubernetes/ceph/monitoring)のディレクトリが用意されています。

基本的にはこのmonitoringディレクトリからPrometheusオペレータを作って、Prometheus自身を立ち上げればよいのですが、そこまでは[#18](https://qiita.com/tzkoba/items/fb8bbab99c52cb20bc25)で完了しています。ですので、今回は既存のPrometheusオペレータを使って、

+ Rook/CephのServiceMonitorを追加する。
+ PostgreSQLのexporterとそれを取り込むServiceMonitorを追加する。

をやってみようと思います。

## ServiceMonitorを追加する
rookのgituhubにあるServiceMonitorは[こちら](https://github.com/rook/rook/blob/master/cluster/examples/kubernetes/ceph/monitoring/service-monitor.yaml)になりますが、これを前回構築したPrometheus用に書き換えます。

```yaml:rook-service-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: pg-rook-ceph-mgr
  namespace: monitoring
  labels:
    prometheus: pg
    app: rook-ceph-mgr
spec:
  namespaceSelector:
    matchNames:
      - rook-ceph
  selector:
    matchLabels:
      app: rook-ceph-mgr
      rook_cluster: rook-ceph
  endpoints:
  - port: http-metrics
    path: /metrics
    interval: 5s
```

意図としては以下となります。

+ ServiceMonitorのpg-rook-ceph-mgrはPrometheusと同じNamespace:monitoringとする。
+ spec以下はrook-ceph-mgrのポッド配置とあわせて、Namespace:rook-cephとする。

## Prometheusに上手く連携されない
しかし、この状態でPrometheusのUIから確認すると、以下のようになっていました。

+ Service Discoveryでpg-rook-ceph-mgrは1つ見つかっている状態。
+ Targetsで見るとrook-ceph-mgrはstate:**DOWN**になっている。

Endpointは *http://<ポッドIP>:9283/metrics* となっており、問題がないように見えますし、curlコマンドでもmetricsは取れました。

いろいろと調べると、PrometheusのgithubにNamespaceに関するIssueは沢山あり、[このようなドキュメント](https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus#adding-additional-namespaces-to-monitor)もあります。しかし、現状でNamespace追加の具体的方法が分かっていません。

## 仕方なくPrometheus側のNamespaceを変更する
[こちらの記事](https://tech.uzabase.com/entry/2018/03/14/200512)にあるように、ClusterRoleで解決できそうな気がしていましたし色々試しましたが、、、中々上手くいきませんでした。

問題解決のためにNamespaceを変更してみました。
まず、昨日インストールした環境をhelm delete --purgeで削除します。

そして、Namespaceを変更して再度インストールします。

```terminal:Namespaceを変更して再度helm&nbsp;install
$ helm install coreos/prometheus-operator --name pg-op --namespace rook-ceph -f prometheus-operator-value.yaml

$ helm install coreos/kube-prometheus --name pg --namespace rook-ceph -f kube-prometheus-value.yaml

# 結果はこうなる
$ helm ls
NAME            REVISION        UPDATED                         STATUS          CHART                                   APP VERSION     NAMESPACE
pg              1               Fri Dec 21 14:36:23 2018        DEPLOYED        kube-prometheus-0.0.105                                 rook-ceph
pg-op           1               Fri Dec 21 14:33:39 2018        DEPLOYED        prometheus-operator-0.0.29              0.20.0          rook-ceph
```

この状態でPrometheusのTargetsもState:**UP**となりました。Namespaceの問題であるのは確定のようです。

## Rook/CephのGrafanaダッシュボードをインポート
ここまで来るとGrafana側の設定は簡単です。
昨日作成したGrafanaにCephのダッシュボードを追加していきます。[こちら](https://github.com/rook/rook/blob/master/Documentation/ceph-monitoring.md#grafana-dashboards)を参考にして下さい。

現在はCephのCluster・Pool・OSDと3つのダッシュボードがあります。例えば、Clusterのダッシュボードは以下のようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/208972d0-1e0a-cfc1-d08f-f75cbf680e85.png)

# PostgreSQLのモニタリングを追加する
PostgreSQLにもPrometheus用のexporterがあります。[こちら](https://github.com/helm/charts/tree/master/stable/prometheus-postgres-exporter)にhelmのチャートがありますので、これを使ってみましょう。

## prometheus-postgres-exporterのインストール
こちらもHelmを使ってインストールします。
同様にNamespaceの問題があるのですが、一旦PostgreSQLを構築してあるDefault向けにインストールします。

```terminal:prometheus-postgres-exporterのインストール
$helm install --name pg-postgres --set serviceAccount.name=postgres  stable/prometheus-postgres-exporter -f pg-rook-sf-exporter-value.yaml

$ kubectl apply -f pg-rook-sf-exporter-monitor.yaml
```

しかし、こちらもRook/Cephと同じ問題にあたりました。

+ Service Discoveryでpg-postgres-exporterは1つ見つかっている状態。
+ Targetsで見るとpg-postgres-prometheus-postgres-exporterはstate:**DOWN**になっている。

[先ほどのPrometheusのドキュメント](https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus#adding-additional-namespaces-to-monitor)では、

> By default the Prometheus server is limited to the three namespaces it requires: default, kube-system and the namespace you configure the stack to run in via $._config.namespace

と書いてあったので、defaultは大丈夫だと思っていたのですがダメでした。ここを突破できればGrafanaは簡単だと思うのですが、今日は断念します。

# まとめ
残念ながら、想定していた形ではPrometheusのモニタリングが出来ていません。実はKubernetesと良く一緒に利用されるツールということでPrometheus+Grafanaだけでなく、ElasticSearch+Kibanaの組み合わせも試してみようと思っていましたが、そんなに簡単ではありませんね。

もう少し勉強して再戦したいと思います。
よろしくお願いします。