Edited at

SplunkでKubernetesのログとメトリクスを監視してみよう

More than 1 year has passed since last update.

Kubernetesで稼働するコンテナ環境をSplunkで可視化してみました。

まずはデータの取り込み方と記事書いてみます。

シリーズ化して可視化やモニタリングについても記事書きたいなあ

-- 2018/07/09 追記 --

可視化とモニタリングについて記事書きました

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


はじめに

Splunkにインデックスされるデータはざっくり言うと下記4種類です。


  1. CPUやメモリ等のリソース使用状況メトリクス

  2. NodeやPod、Service、Namespace等のオブジェクト情報

  3. Kubeletやプロキシ、APIサーバーのログ

  4. コンテナのログ


環境準備

続いて環境準備デス。


Splunk環境

OS: Amazon Linux on EC2

Splunk Enterprise 7.1.1

使うAppは以下

Splunk Add-on for Kubernetes v1.0.0

https://splunkbase.splunk.com/app/3976/

k8s関連のソースタイプとか、最小限の設定だけが入ってるみたい。

ダッシュボードは含まれていないから自分で作ることにします。

Splunk Analysis Workspace v0.18.4 beta

https://splunkbase.splunk.com/app/3976/

まだβ版ですがメトリクスのグラフをGUI簡単操作で手早く作れます。

あと、これも

Splunk Connect for Kubernetes

https://github.com/splunk/splunk-connect-for-kubernetes

KubeletやKube-Proxyのログ、コンテナのログ、PodやNode等のメトリクスを自動的に取得してSplunkにインデックスしてくれる代物です。

YAMLで設定作って kubectl 使ってKubernetesクラスター環境にデプロイします。

Connectorはデータ取得用のPodを使ってfluentd経由でSplunkのHTTP Event CollectorエンドポイントにPOSTします。


Kubernetes環境

今回は検証環境ということで、AWSに HeptioのCloudFormationテンプレート を使って構築しました。

OS: Ubuntu 16.04.4 LTS

Kubelet v1.10.3

Master x 1 / Node x 2 という構成で作りました。


Splunk設定

Splunkの設定自体はカンタン


  1. Appをインストールする

  2. インデックスを作成

  3. HECを有効にする

これだけです。


SpkunkにAppをインストール

Splunk Add-on for KubernetesSplunk Analysis Workspace をインストールしましょう。


インデックス作成

ログ系のインデックスとメトリクスのインデックスを作ります。

メトリクスは従来のログ用インデックスとは別に保存する必要があるため、別々に作ります。

ちなみに、インデックスはクラスター単位で作成するのが良いでしょう。

Splunk画面から 設定 > インデックス に移動

新規インデックスを作成します。

ログ用は k8s_events という名前で新規作成

データタイプは イベント を選択

Screen Shot 2018-06-22 4.04.42 PM.png

メトリクス用は k8s_metrics という名前で新規作成

データタイプは メトリック を選択

Screen Shot 2018-06-22 4.05.48 PM.png


HEC有効化

続いてHTTP Event Collectorを有効化します。

設定 > データ入力から > HTTPイベントコレクタ に移動して新規トークン作成

Screen Shot 2018-06-22 4.09.02 PM.png

一つのHECトークンでログ、メトリクス両方を受け取ります。

なので、作るトークンは一つだけ。

名前は適当に、何でもいいです。

Screen Shot 2018-06-22 4.12.25 PM.png

次へ行って、ソースタイプやインデックスの指定

ソースタイプは自動のままでおk

※ 後で設定する Connector の方で適切にソースタイプ振り分けてくれます。

Screen Shot 2018-06-22 4.12.44 PM.png

インデックスは先ほど作った k8s_eventsk8s_metrics を指定

Screen Shot 2018-06-22 4.14.49 PM.png

これでSplunk側の設定は完了


Kubernetes設定


Kubernetesクラスター作成

AWSにHeptio使って入れたので、テンプレートにしたがってCloudFormationでクラスター作成(詳細は割愛)


ローカル準備

手元のローカル端末(Mac)に kubectlhelm をインストールします。

ローカルからsshで入ることなくKubernetes操作ができるようになります。


kubectl インストール

まずは brew で kubectl インストール(参考:Kubernetesドキュメント

brew install kubectl

続いて、先のステップで作成したHeptioのKuberntesから kubeconfig をダウンロード

任意のパスにKubernetes用フォルダ作って、そこに入れよう

SSH_KEY="<path/to/varMyKey.pem>"; scp -i $SSH_KEY -o ProxyCommand="ssh -i \"${SSH_KEY}\" ubuntu@<BastionHostPublicIP> nc %h %p" ubuntu@<MasterPrivateIP>:~/kubeconfig ./kubeconfig

DLした kubeconfig を環境変数に設定

export KUBECONFIG=$(pwd)/kubeconfig

試しにNode取得

コマンド実行はkubeconfig置いてあるディレクトリで実行すべし

kubectl get nodes


helm インストール

helm はKubernetes上でのパッケージ管理で、yumのように使えるものです。

brew で helm インストール(参考:Helmドキュメント

brew install kubernetes-helm

Helmバージョン確認

$ helm version

Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

バージョンは後で使うのでメモしておきましょう。


Splunk Connect for Kubernetes設定

いよいよ本題です。


Tillerセットアップ

KubernetesはRBACによるアクセス制御のため、Helmを使えるようにTillerを作成します。

Splunk Connect for Kubernetes を入れるためのNamespaceを作成

kubectl create ns splunk-connect-k8s

続いてTillerのYAMLはコチラ


tiller.yaml

# https://docs.helm.sh/using_helm/#example-service-account-with-cluster-admin-role

apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: splunk-connect-k8s
#namespace: kube-system
#namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
#namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: splunk-connect-k8s
#namespace: kube-system
#namespace: default


Tiller作ってみましょう

kubectl create -f tiller.yaml


Helm初期化

helm init で初期設定

$ helm init --service-account tiller --tiller-namespace splunk-connect-k8s --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

$HELM_HOME has been configured at /Users/splunk/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

2.9.1 の部分はお使いのHelmバージョンに置き換えてください。

tiller Service Accountが作成されたことを確認

$ kubectl get sa -n splunk-connect-k8s

NAME SECRETS AGE
default 1 1d
tiller 1 1d


Connect for Kubernetes設定&インストール

Splunkの公開GitHubにChartのテンプレートと変数設定のサンプルが入ってます。

https://github.com/splunk/splunk-connect-for-kubernetes/tree/master/helm-chart

splunk-kubernetes-logging はコンテナやk8s関連のログ

splunk-kubernetes-metrics はNodeやPodのメトリクス

splunk-kubernetes-objects はk8s関連オブジェクトの詳細情報

こちらのYAMLを使って Splunk Connect for Kubernetes をインストールします。


my_values.yaml

#global settings

global:
logLevel: info
splunk:
hec:
protocol: https
insecureSSL: false
host: splunk_hec_endpoint_hostname
token: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

#local config for logging chart
splunk-kubernetes-logging:
journalLogPath: /run/log/journal
splunk:
hec:
indexName: k8s_events

#local config for objects chart
splunk-kubernetes-objects:
rbac:
create: true
serviceAccount:
create: true
name: splunk-kubernetes-objects
kubernetes:
insecureSSL: true
objects:
core:
v1:
- name: pods
#interval: 30
- name: namespaces
#interval: 30
- name: nodes
#interval: 60
- name: services
#interval: 30
- name: config_maps
#interval: 30
- name: secrets
#interval: 30
#- name: volumes
#interval: 30
- name: persistent_volumes
#interval: 30
- name: service_accounts
#interval: 30
- name: persistent_volume_claims
#interval: 30
- name: resource_quotas
#interval: 30
- name: component_statuses
#interval: 30
- name: events
mode: watch
apps:
v1:
- name: deployments
#interval: 30
- name: daemon_sets
#interval: 30
- name: replica_sets
#interval: 30
- name: stateful_sets
#interval: 30
splunk:
hec:
indexName: k8s_events

#local config for metrics chart
splunk-kubernetes-metrics:
rbac:
create: true
serviceAccount:
create: true
name: splunk-kubernetes-metrics
splunk:
hec:
indexName: k8s_metrics


splunk_hec_endpoint_hostname はSplunkでHECを受けるホスト名(もしくはFQDNやIPアドレス)

XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX は先のステップで作成したHECトークンを指定

indexName には作成したインデックス名を指定

splunk-kubernetes-loggingsplunk-kubernetes-objects はログ用のインデックス (ここでは k8s_events

-splunk-kubernetes-metrics はメトリクス用のインデックス (ここでは k8s_metrics

helm install で変数設定したYAMLを使って Splunk Connect for Kubernetes をインストール

$ helm install --name kikeyama -f my_values.yaml --namespace splunk-connect-k8s --tiller-namespace splunk-connect-k8s https://github.com/splunk/splunk-connect-for-kubernetes/releases/download/v1.0.0/splunk-connect-for-kubernetes-1.0.0.tgz

NAME: kikeyama
LAST DEPLOYED: Tue Jun 19 23:08:56 2018
NAMESPACE: splunk-connect-k8s
STATUS: DEPLOYED

RESOURCES:
==> v1/ServiceAccount
NAME SECRETS AGE
splunk-kubernetes-metrics 1 4s
splunk-kubernetes-objects 1 4s

==> v1/ClusterRole
NAME AGE
kikeyama-splunk-kubernetes-objects 4s

==> v1/ClusterRoleBinding
NAME AGE
kikeyama-splunk-kubernetes-metrics 4s
kikeyama-splunk-kubernetes-objects 4s

==> v1beta1/DaemonSet
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kikeyama-splunk-kubernetes-logging 3 3 0 3 0 <none> 4s

==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kikeyama-splunk-kubernetes-metrics 1 1 1 0 4s
kikeyama-splunk-kubernetes-objects 1 1 1 0 4s

==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
kikeyama-splunk-kubernetes-logging-bl8q5 0/1 ContainerCreating 0 4s
kikeyama-splunk-kubernetes-logging-vqls4 0/1 ContainerCreating 0 4s
kikeyama-splunk-kubernetes-logging-xt7b4 0/1 ContainerCreating 0 4s
kikeyama-splunk-kubernetes-metrics-8695547795-kj62z 0/2 ContainerCreating 0 4s
kikeyama-splunk-kubernetes-objects-7b89c55dc8-7pnht 0/1 ContainerCreating 0 4s

==> v1/Secret
NAME TYPE DATA AGE
kikeyama-splunk-kubernetes-logging Opaque 1 4s
kikeyama-splunk-kubernetes-metrics Opaque 1 4s
kikeyama-splunk-kubernetes-objects Opaque 1 4s

==> v1/ConfigMap
NAME DATA AGE
kikeyama-splunk-kubernetes-logging 7 4s
kikeyama-splunk-kubernetes-metrics 1 4s
kikeyama-splunk-kubernetes-objects 1 4s

NOTES:

███████╗██████╗ ██╗ ██╗ ██╗███╗ ██╗██╗ ██╗██╗
██╔════╝██╔══██╗██║ ██║ ██║████╗ ██║██║ ██╔╝╚██╗
███████╗██████╔╝██║ ██║ ██║██╔██╗ ██║█████╔╝ ╚██╗
╚════██║██╔═══╝ ██║ ██║ ██║██║╚██╗██║██╔═██╗ ██╔╝
███████║██║ ███████╗╚██████╔╝██║ ╚████║██║ ██╗██╔╝
╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝

Listen to your data.

Splunk Connect for Kubernetes is spinning up in your cluster.
After a few minutes, you should see data being indexed in your Splunk.

If you get stuck, we're here to help.
Look for answers here: http://docs.splunk.com

kikeyama の部分はご自身の好きな名前に置き換えてください。

これがPodの名前のPrefixになります。


確認

以下の通り、Splunk Connect for KubernetesのPodが作成されています。

$ kubectl get pods -n splunk-connect-k8s

NAME READY STATUS RESTARTS AGE
kikeyama-splunk-kubernetes-logging-bl8q5 1/1 Running 0 2d
kikeyama-splunk-kubernetes-logging-vqls4 1/1 Running 0 2d
kikeyama-splunk-kubernetes-logging-xt7b4 1/1 Running 0 2d
kikeyama-splunk-kubernetes-metrics-8695547795-kj62z 2/2 Running 0 2d
kikeyama-splunk-kubernetes-objects-7b89c55dc8-7pnht 1/1 Running 0 2d
tiller-deploy-7f9d844969-wns69 1/1 Running 0 2d


Splunk確認

Splunkにログインして確認してみましょう。


ログ確認

以下のSPLでログが入っているか見てみましょう。

| tstats count latest(_time) as latest_time where index=k8s_events by index sourcetype 

| eval latest_time = strftime(latest_time, "%F %T")

Screen Shot 2018-06-22 5.50.37 PM.png

OKですね。


メトリクス確認

Splunk Analysis Workspace を入れると、サーチの画面上部に メトリック というメニューが出てきます。

Screen Shot 2018-06-22 5.54.03 PM.png

左側のナビゲーションから各種メトリックを選択できるので、ポチポチやってグラフ作成

kubernetes_metrics_by_pod.png


最後に

これでデータは入ってきますが、ダッシュボード等の可視化はAdd-onに用意されていないので、自作する必要があります。

また、 Splunk Add-on for Kubernetes はSplunk製なのでサポートされるっぽいですが、 Splunk Connect for Kubernetes はGitHubに公開されているのみでコミュニティサポートになるようです。

ちなみに、自分でセットアップしてたときは helm install 実行時にRBACでひっかかったのか、何回もpermission errorが出て苦労しました。

$ helm install --name kikeyama --namespace splunk-connect-k8s -f my_values.yaml https://github.com/splunk/splunk-connect-for-kubernetes/releases/download/v1.0.0/splunk-connect-for-kubernetes-1.0.0.tgz

Error: release kikeyama failed: namespaces "splunk-connect-k8s" is forbidden: User "system:serviceaccount:kube-system:default" cannot get namespaces in the namespace "splunk-connect-k8s"

こちら を参考に helm init しなおしたら上手くいきました。

他にもいろいろ手間取りましたが、上記手順でいけるはずです。 カンタンでしょ?


おまけ

Kubernetesの状況をモニタリングするダッシュボード作ってみました。

kubernetes_overview_20180622.png

これについてはまた後日別の記事で。

Nginx Ingress入れてログをSplunkに取り込んでみたので、その記事も後日書きます(たぶん)