本記事はPostgreSQL on Kubernetes Advent Calendar 2018の19日目です。
昨日は「モニタリング(Prometheus、Grafana)を追加してみる」ということで、PostgreSQL on Kubernetesの環境にPrometheusとGrafanaの追加をしてみました。
正直、今回はかなり苦戦しています。
PrometheusのNamespaceまたがりでの監視は色々事例があるのですが、やってみると中々上手くいかないものですね。
TL;DR
- 今日は失敗事例。
- PrometheusのNamespaceではまってます
Rook/Cephのモニタリングを追加する
RookではCephのモニタリングも意識しており、githubにもmonitoringのディレクトリが用意されています。
基本的にはこのmonitoringディレクトリからPrometheusオペレータを作って、Prometheus自身を立ち上げればよいのですが、そこまでは#18で完了しています。ですので、今回は既存のPrometheusオペレータを使って、
- Rook/CephのServiceMonitorを追加する。
- PostgreSQLのexporterとそれを取り込むServiceMonitorを追加する。
をやってみようと思います。
ServiceMonitorを追加する
rookのgituhubにあるServiceMonitorはこちらになりますが、これを前回構築したPrometheus用に書き換えます。
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は沢山あり、このようなドキュメントもあります。しかし、現状でNamespace追加の具体的方法が分かっていません。
仕方なくPrometheus側のNamespaceを変更する
こちらの記事にあるように、ClusterRoleで解決できそうな気がしていましたし色々試しましたが、、、中々上手くいきませんでした。
問題解決のためにNamespaceを変更してみました。
まず、昨日インストールした環境をhelm delete --purgeで削除します。
そして、Namespaceを変更して再度インストールします。
$ 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のダッシュボードを追加していきます。こちらを参考にして下さい。
現在はCephのCluster・Pool・OSDと3つのダッシュボードがあります。例えば、Clusterのダッシュボードは以下のようになります。
PostgreSQLのモニタリングを追加する
PostgreSQLにもPrometheus用のexporterがあります。こちらにhelmのチャートがありますので、これを使ってみましょう。
prometheus-postgres-exporterのインストール
こちらもHelmを使ってインストールします。
同様にNamespaceの問題があるのですが、一旦PostgreSQLを構築してあるDefault向けにインストールします。
$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になっている。
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の組み合わせも試してみようと思っていましたが、そんなに簡単ではありませんね。
もう少し勉強して再戦したいと思います。
よろしくお願いします。