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


前回の記事 でKubernetesやコンテナのログ・メトリクスをSplunkにインデックスする方法を投稿しましたが、今回はそのデータの可視化について書きたいと思います。

はじめに

こちらの記事は Splunk Add-on for KubernetesSplunk Connect for Kubernetes を使ってSplunkにデータを取り込んでいることを前提としています。

取り込み方法は前回の記事をご参照ください。
SplunkでKubernetesのログとメトリクスを監視してみよう

ソースタイプ

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

ソースタイプ 概要(データの中身からの推測となります)
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`

マクロ

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

ダッシュボード

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

Kubernetes Overview (概要)

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

Kubernetes Operation Monitoring (Kubernetes運用監視)

Pod作成時のkube-controller-managerログやKubernetes各コンポーネントのエラーログ、レプリカの状態や各種メトリクスを入れてます。
Podが作成されると、リアルタイムに成功/失敗のログが吐き出されるので、モニタリングには良いでしょう。

Pod Detail (Pod詳細)

Podのリソースメトリクスや、Logging Driverから取得されたコンテナのログを入れました。

Kubernetes Overview ダッシュボード内のPod詳細からもリンクを貼って遷移できるようにしてあります。

App

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

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

デモ

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

最後に

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

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

サーチ文は以下

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