#18 モニタリング(Prometheus、Grafana)を追加してみる

本記事は[PostgreSQL on Kubernetes Advent Calendar 2018](https://qiita.com/advent-calendar/2018/postgresonk8s)の18日目です。
昨日は「[PostgreSQL on k8s - Deploymentではどうなる？](https://qiita.com/tzkoba/items/acd2b4914d8ff773255e)」ということで、StatefulSetではなくDeploymentでPostgreSQLを動かしてみました。

今日はPostgreSQL on Kubernetesの監視のために、**Prometheus**と**Grafana**をセットアップをしていきます。

#TL;DR

+ Helmを使ったみたけど予想以上に苦戦したよ。
+ PrometheusとGrafanaは動いたけど、Kubeletのモニタリングでエラーが出たよ。

#PrometheusとGrafanaのインストール

## 前提条件
これまでのPostgreSQL on Kubernetesの構成に、PrometheusやGrafanaを動かすためにノードを追加しています。今回使うYAML等では以下を前提にしています。

+ ラベルとしてtype=node.mon.proが付けられたノード、HDDは60Gを準備

##参考にしたブログ
[こちら](https://qiita.com/nmatsui/items/6d8319f3216bd8786eb9)の記事を参考にさせて頂きました。色々とPrometheusの導入事例はあったのですが、今回はHelmでやってみました。

## Helmの準備
今回の環境構築にはRancher2.0を利用しています。そのため、GUIでもHelmからのデプロイは出来るのですが、コマンドラインの環境準備から始めています。

```terminal:helm取得からinitまで
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7236  100  7236    0     0  33044      0 --:--:-- --:--:-- --:--:-- 33192

$ chmod +x get_helm.sh
$ ./get_helm.sh
Downloading https://kubernetes-helm.storage.googleapis.com/helm-v2.12.0-linux-amd64.tar.gz
Preparing to install helm and tiller into /usr/local/bin
helm installed into /usr/local/bin/helm
tiller installed into /usr/local/bin/tiller

$ helm init
```

次にServiceAccountを作成し、helmのupgradeを行います。必要なファイルはgitから取得しています。※ここは順序の入替え可能です。

```terminal:ServiceAccountの作成とhelm&nbsp;init&nbsp;--upgrade
$ git clone https://github.com/tzkoba/postgres-on-k8s.git
$ cd ./postgres-on-k8s/monitoring/rbac/

$ kubectl apply -f tiller-rbac.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

$ helm init  --upgrade --service-account tiller
$HELM_HOME has been configured at /home/ec2-user/.helm.

Tiller (the Helm server-side component) has been upgraded to the current version.
Happy Helming!
```

さらに必要なリポジトリを追加しておきます。

```terminal:リポジトリの更新と追加
$ helm repo update
$ helm repo add coreos https://s3-eu-west-1.amazonaws.com/coreos-charts/stable/
```
## Prometheus Operatorのインストール
ここまで準備したHelmを使って、Prometheus Operatorをインストールしていきます。以下では記していませんが、事前にNamespaceとして**monitoring**を準備しておきましょう。

今回、オペレータの配置先を指定するために[prometheus-operator-value.yaml](https://github.com/tzkoba/postgres-on-k8s/blob/master/monitoring/prometheus/prometheus-operator-value.yaml)を作っていますので、そちらを-fオプションで渡して、helm installを実行します。

```terminal:helm&nbsp;install（operator）
$ cd ../prometheus/
$ helm install coreos/prometheus-operator --name pg-op --namespace monitoring -f prometheus-operator-value.yaml

# operatorが起動している
$ kubectl get pods --namespace monitoring
NAME                                        READY     STATUS    RESTARTS   AGE
pg-op-prometheus-operator-d8dfc7974-298q9   1/1       Running   0          1m

```

## Prometheus、Grafanaのインストール
まず、Prometheus・Grafanaで利用する永続化ボリュームの準備をします。参考にしたブログではAzureのDiskを使っていましたが、今回はRookのブロックデバイスを流用します。
※[こちら](https://qiita.com/ysakashita/items/67a452e76260b1211920)の記事を参考にLocal Volumeも試したのですが上手くいかず。。。

```terminal:StorageClassの作成
$ kubectl apply -f sc-rook-prometheus.yaml
cephblockpool.ceph.rook.io/replicapool2 created
storageclass.storage.k8s.io/rook-ceph-prometheus created
```

このStorageClassを使って、PrometheusとGrafanaをインストールします。kube-prometheus-value.yamlの詳細は[こちら](https://github.com/tzkoba/postgres-on-k8s/blob/master/monitoring/prometheus/kube-prometheus-value.yaml)をご覧下さい。

```terminal:PrometheusとGrafanaのインストール
$ helm install coreos/kube-prometheus --name pg --namespace monitoring -f kube-prometheus-value.yaml
```

外部からのアクセス用にサービスを追加し、ポートを確認しておきます。

```
$ kubectl apply -f svc-prometheus.yaml
service/prometheus-svc created
$ kubectl apply -f svc-grafana.yaml
service/grafana-svc created

$ kubectl get svc -n monitoring
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
alertmanager-operated    ClusterIP   None            <none>        9093/TCP,6783/TCP   1h
grafana-svc              NodePort    10.43.114.173   <none>        3000:30760/TCP      11m
pg-alertmanager          ClusterIP   10.43.163.126   <none>        9093/TCP            13m
pg-exporter-kube-state   ClusterIP   10.43.246.137   <none>        80/TCP              13m
pg-exporter-node         ClusterIP   10.43.98.242    <none>        9100/TCP            13m
pg-grafana               ClusterIP   10.43.254.234   <none>        80/TCP              13m
pg-prometheus            ClusterIP   10.43.245.185   <none>        9090/TCP            13m
prometheus-operated      ClusterIP   None            <none>        9090/TCP            1h
prometheus-svc           NodePort    10.43.113.233   <none>        9090:32229/TCP      11m
```

上記のポートをもとにグローバルIPでPrometheusとGrafanaにアクセス可能です。

## 問題点
上記で追加したPrometheusではターゲットのうち、Kubeletでエラーが出てしまっています。[こちら](https://qiita.com/nmatsui/items/6d8319f3216bd8786eb9#kubelet-exporter%E3%81%8C%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8Bport%E3%82%92https%E3%81%8B%E3%82%89http%E3%81%AB%E5%A4%89%E6%9B%B4)を参考に、kubelet exporterが利用するportをhttpsからhttpに変更してみたのですが、以下のようなエラーになってしまっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54853/f54e3cb5-1742-2584-0fbe-a4cfeb9bf930.png)

ここはもう少し調査をしたいと思います。

## 追加したいもの
明日以降の記事で試していきますが、PostgreSQLもRookもPrometheusでモニタリングを行うことが出来ます。本日構築したものにエクスポータの追加をしていく予定です。

#まとめ
本日はKubernetesではモニタリングのデファクトであるPrometheusとGrafanaを構築してみました。が、Helmを使ったこともあってか、かなり苦戦してしまいました。ただ、そのおかげでHelmで利用するvalue.yamlのカスタマイズの仕方が少しづつ分かってきました。

明日以降もエクスポータの追加が上手くいくかは神のみぞ知るところですが、もう少し続けていきたいと思います。

よろしくお願いします。