prometheusによるkubernetesのクラスタ監視

# prometheusでkubernetesのクラスタを監視したい！

初投稿です。

kubernetesのクラスタ監視といえば、prometheus、EFK、SaaSではDatadogなどがありますが、今回はprometheusで監視を行います。

## kubernetes用のprometheus環境構築
https://github.com/giantswarm/kubernetes-prometheus
より、prometheus環境を構築します。最終更新が9月で、Deploymentもbetaだったりしますが、今回は気にせずに利用します。

Quickstartにあるコマンドを実行すると、monitoringというnamespaceにprometheus/grafana/node-exporterなどが自動的に構築されます。

```
kubectl apply \
  --filename https://raw.githubusercontent.com/giantswarm/kubernetes-prometheus/master/manifests-all.yaml
```

構築後はmonitoringのnamespaceでpodが色々と立ち上がっているのが確認できます。

```
# kubectl get pods --namespace=monitoring
NAME                                  READY     STATUS    RESTARTS   AGE
alertmanager-56f6fdd9f6-z4vl8         1/1       Running   0          2h
grafana-core-867b94888d-td7b4         1/1       Running   0          5h
kube-state-metrics-694fdcf55f-797th   1/1       Running   0          5h
kube-state-metrics-694fdcf55f-tsvh5   1/1       Running   0          5h
node-directory-size-metrics-8rjvx     2/2       Running   0          5h
node-directory-size-metrics-z86cs     2/2       Running   0          5h
prometheus-core-5cf65c7b68-2dg5r      1/1       Running   0          2h
prometheus-node-exporter-8dccv        1/1       Running   0          5h
prometheus-node-exporter-rmlwk        1/1       Running   0          5h
```

alertmanagerやkube-state-metricsなども立ち上げてくれます。

NodePortも構築してくれるため、URLから確認してみましょう。

```
# kubectl get svc --namespace=monitoring
NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
alertmanager               NodePort    100.64.36.59     <none>        9093:32651/TCP   5h
grafana                    NodePort    100.70.155.49    <none>        3000:31676/TCP   5h
kube-state-metrics         ClusterIP   100.66.157.125   <none>        8080/TCP         5h
prometheus                 NodePort    100.71.101.61    <none>        9090:32296/TCP   5h
prometheus-node-exporter   ClusterIP   None             <none>        9100/TCP         5h
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/5ead631b-8c3c-2903-2111-fc037d121c94.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/e3077b6b-b815-d02c-3de6-d1d3d0949412.png)

prometheus、grafanaともに立ち上がっています。

ただ、kubernetes-pod-resourcesなどを確認すると、N/Aと出ており、正しく確認ができません。
これはprometheusの設定で、cAdvisorを取得していないためです。

## prometheusの設定変更

prometheusのConfigMapを修正し、cAdvisorを取得しましょう。

```
kubectl edit configmap prometheus-core --namespace=monitoring
```

scrape_configs 以下に、job_nameを追加しましょう。
（公式のコピペです：https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml）

```
- job_name: 'kubernetes-cadvisor'

  # Default to scraping over https. If required, just disable this or change to
  # `http`.
  scheme: https

  # This TLS & bearer token file config is used to connect to the actual scrape
  # endpoints for cluster components. This is separate to discovery auth
  # configuration because discovery & scraping are two separate concerns in
  # Prometheus. The discovery auth config is automatic if Prometheus runs inside
  # the cluster. Otherwise, more config options have to be provided within the
  # <kubernetes_sd_config>.
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token

  kubernetes_sd_configs:
  - role: node

  relabel_configs:
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
  - target_label: __address__
    replacement: kubernetes.default.svc:443
  - source_labels: [__meta_kubernetes_node_name]
    regex: (.+)
    target_label: __metrics_path__
    replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
```

設定を反映後、configMapを反映させるため、一度Podを削除します。

```
kubectl delete pods prometheus-core-XXX --namespace=monitoring
```

再起動して、RunningになっていればOKです。
起動に失敗した場合は、yamlの編集ミスなどが考えられます（自分がやったので）。

再起動後、grafanaを確認すると、ノード全体のCPUやMemory、Podのリソースなどが確認できています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/9b06dae6-daca-c913-0ff0-7a88a6c50971.png)

これでNodeの状態をグラフィカルに監視できました！

## おわりに
Alertmanagerを利用することで、Nodeの状態によってSlackにアラートを飛ばすなども可能です。

datadogだとdd-agentのdaemonsetを起動するだけでメトリクスが取れる&アラートも設定できるので、小規模orお金があるならdatadogでいい気がします。

以下は、datadogのkubernetesのクラスタ監視画面。わかりやすい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/237745/bc34245d-bc80-88e0-47e7-46d4b3c5f3dd.png)