SplunkでKubernetesクラスター環境のログとメトリクスを可視化してモニタリング

[前回の記事](https://qiita.com/kikeyama/items/447c7126a5c454a558f0) でKubernetesやコンテナのログ・メトリクスをSplunkにインデックスする方法を投稿しましたが、今回はそのデータの可視化について書きたいと思います。

# はじめに
こちらの記事は **[Splunk Add-on for Kubernetes](https://splunkbase.splunk.com/app/3991/)** と **[Splunk Connect for Kubernetes](https://github.com/splunk/splunk-connect-for-kubernetes)** を使ってSplunkにデータを取り込んでいることを前提としています。

取り込み方法は前回の記事をご参照ください。
**[SplunkでKubernetesのログとメトリクスを監視してみよう](https://qiita.com/kikeyama/items/447c7126a5c454a558f0)**

# ソースタイプ
ソースタイプごとのデータの種類です。
ざっくり以下のようなデータがインデックスされます。

|  ソースタイプ                      |  概要（データの中身からの推測となります）  |
|---------------------------------|-------------------------------------------------|
| `kube` `kube:kubelet`           | Pod管理のログ                                     |
| `kube:kube-controller-manager`  | コントローラー管理ログ  |
| `kube:kube-apiserver`           | APIサーバーログ  |
| `kube:docker`                   | Dockerサービスログ  |
| `kube:container:*`              | 各コンテナのログ（Logging Driverから取得）  |
| `kube:objects:*`                | NodeやPod、Service、Namespace等のオブジェクト情報      |
| `fluentd:monitor-agent`         | fluentdでSplunk HECにPOSTする際のログ  |

Kubernetesの各コンポーネントはこちら↓の記事がとても参考になります。
Kubernetes: 構成コンポーネント一覧
https://qiita.com/tkusumi/items/c2a92cd52bfdb9edd613

メトリクスのソースタイプは `httpevent` となるようです。
実際サーチ書くときに意識することは無いので、知らなくても良いです。

```
| mcatalog values(sourcetype) where `k8s-metrics-index`
```

<img width="1274" alt="Screen Shot 2018-07-07 11.20.09 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/4a179a43-b75a-dcff-d38a-e584b063dc7f.png">


# マクロ
**Splunk Add-on for Kubernetes** にはデフォルトで `k8s-event-index` と `k8s-metrics-index` の2種類のマクロが入っています。
それぞれを編集して作成したk8s用インデックス名を書きましょう。

<img width="937" alt="Screen Shot 2018-07-07 11.24.54 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/19130de1-1858-9dfe-fba9-f8df65831438.png">

<img width="948" alt="Screen Shot 2018-07-07 11.25.05 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/21b5abc7-6d48-3508-c3bf-039fb12b472b.png">

# ダッシュボード
自分で作ったダッシュボードです。

## Kubernetes Overview （概要）
NodeやNamespace、Pod、Serviceといったリソースを見ることができます。
`kubectl get ...` や `kubectl describe ...` で取れるような情報を意識しています。
主にソースタイプ `kube:objects:*` から作ってあります。

<img width="1282" alt="Screen Shot 2018-07-07 11.26.46 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/cf8fc82a-30c7-9956-3932-f2fcaea8e94c.png">

## Kubernetes Operation Monitoring （Kubernetes運用監視）
Pod作成時のkube-controller-managerログやKubernetes各コンポーネントのエラーログ、レプリカの状態や各種メトリクスを入れてます。
Podが作成されると、リアルタイムに成功/失敗のログが吐き出されるので、モニタリングには良いでしょう。
<img width="1268" alt="Screen Shot 2018-07-07 11.34.27 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/975d13f1-6664-38ed-8ff7-19ade66e1129.png">

## Pod Detail （Pod詳細）
Podのリソースメトリクスや、Logging Driverから取得されたコンテナのログを入れました。
<img width="1276" alt="Screen Shot 2018-07-07 11.40.00 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/8a142673-4daa-60f0-4c1c-f598883b375f.png">

**Kubernetes Overview** ダッシュボード内のPod詳細からもリンクを貼って遷移できるようにしてあります。
<img width="1273" alt="Screen Shot 2018-07-07 11.41.55 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/8e53c553-39ce-d630-aa8a-16ec8cea4ddf.png">


# App
Splunk AppとしてGitHubの公開リポジトリに置きました。
https://github.com/kikeyama/splunk_kubernetes_demo

各種サーチ文や設定はこちらをご参照ください。

# デモ
動画に撮ってみました。
実際にPodを作成したらどのようにSplunkでモニタリングできるのか、ということを実演しました。

[![KubernetesをSplunk各ダッシュボードのデモ](https://qiita-image-store.s3.amazonaws.com/0/174837/789503f0-2184-4315-6336-181ba52421e3.png "Splunk Demo App for Kubernetes")](https://youtu.be/2A_SOZ4Q3wA)

https://youtu.be/2A_SOZ4Q3wA

# 最後に
ダッシュボード作ってみての感想ですが、一番苦労したのは `kube:objects:*` のJSONを表形式にまとめることでした。
いろいろサーチコマンドを駆使してやってみたのですが、自分にはこれが限界...
正直あまりきれいなサーチ文になっていないので、今後改善していきたいです。

あと、自分のお気に入りは **Kubernetes Operation Monitoring** にある、Error Messagesパネル内でエラーログをクラスターにまとめるところです。

<img width="1258" alt="Screen Shot 2018-07-07 11.46.50 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/77fcb243-abd7-d553-1a42-9ef7420dc4b4.png">


サーチ文は以下

```
`k8s-event-index` (severity="ERROR" OR severity="WARN") 
| rex "[^:]+:\w+\]\s+(?P<message>[^$$]+)$$" 
| cluster field=message t=0.9 labelonly=$labelonly$ showcount=true 
| eval labelonly = "$labelonly$", message = if(labelonly="false", message . " (count: " . cluster_count . ")", message) 
| table _time sourcetype severity message
```

`$labelonly$` トークンをラジオボタンで作りつつ、Onを選択することでクラスターにまとめることができます。
似通ったエラーメッセージがずっと吐き出され続けて重要なものが埋もれる可能性があるので、似たものはまとめてしまった方が見やすいです。

k8s運用者の観点から、もしくはアプリ開発者の観点から、「こういうのが見られると便利だな」といったご意見いただけるとありがたいです。