まとめの背景
- dockerコンテナ関連のログのSplunkへの出力方法は2015年からいくつか存在していた
-
Docker Logging Driver
- 元祖Dockerロギングドライバー
-
Universal Forwarderコンテナイメージ
- みんな大好きUF
-
Splunk Connect for Docker 2018 brand new
- Docker Logging Driverの後継機
-
Docker Logging Driver
- コンテナのログの集め方はそれぞれ特性があり、調べた2019.09.28時点で感じたのは、日々コンテナ周りの技術進化のスピードが速く、取り込み方法もケースバイケースで使い分けする必要がありそう
- Docker単体でなく、k8sを経由してログを収集するモジュールもある(Splunk Connect for Kubernetes)
- とりあえず今回はSplunk Connect for Dockerを使ってコンテナ内のデータをどのように収集できるのか検証を実施
Splunk Connect for Dockerのポイント
- Dockerからplugin経由でpushでログを飛ばす仕組みです。Splunk側はHECで受け取る。
- コンテナログはjson, inline(default), rawの3つのフォーマットで出力が可能
手順
Docker環境の準備
-
Amazon Linux release 2 (Karoo)で構築
-
※AWS Market Placeのdockerホストはいまいち。2017年公開のもののためkernelが古かったり、splunk containerが起動しなかったり。。
-
利用したdockerのversion
# docker version
Client version: 1.7.0-dev
Client API version: 1.19
Go version (client): go1.8.3
Git commit (client): 582db78
OS/Arch (client): freebsd/amd64
Server version: 1.7.0-dev
Server API version: 1.19
Go version (server): go1.8.3
Git commit (server): 582db78
OS/Arch (server): freebsd/amd64
- DockerイメージのDL(nginx)今回はnginxを利用。
# docker pull nginx
Splunk Connect for Dockerの準備
pluginのインストール
# docker plugin install splunk/docker-logging-plugin:latest --alias splunk-logging-plugin
pluginの有効化を確認
# docker plugin ls
ID NAME DESCRIPTION ENABLED
35530a1a22e5 splunk-logging-plugin:latest Splunk Logging Plugin true
Splunk設定(HTTP Event Collector(HEC))
HECのグローバル設定の有効化
- グローバル設定をクリック
- 以下のようなパラメータを設定
HECトークンの新規作成
- 設定 - データ入力 - HTTPイベントコレクタの新規追加
- HTTPイベントコレクタの名前を入力し、次へ
- とりあえずsourcetypeは自動でindexはdockerを作成
Dockerイメージの起動(nginx)
- splunk-logging-driverを読みこみながら、nginxを起動
# docker run -it -d -p 80:80 --log-driver=splunk-logging-plugin \
--log-opt splunk-token=c7d0854b-b0d5-xxxx-xxxx-xxxxxxxxxxx \
--log-opt splunk-url=https://13.xxx.xxx.xx:8088 \
--log-opt splunk-insecureskipverify=true \
--log-opt splunk-index=docker \
nginx
splunk-loggin-pluginをログドライバーにセット。オプション-dをつけることでバックグランドで動作します。-p 80:80とすることで、ホストのポート80がコンテナのポート80にマップ。
run -it -d -p 80:80 --log-driver=splunk-logging-plugin
HECのtokenをセット
--log-opt splunk-token=c7d0854b-b0d5-xxxx-xxxx-xxxxxxxxxxx
HECのURLをセット
--log-opt splunk-url=https://13.xxx.xxx.xx:8088
SSL証明書チェックを無視
--log-opt splunk-insecureskipverify=true
index=dockerに保存
--log-opt splunk-index=docker
nginxイメージを起動
nginx
- Docker のログ出力先として、splunk-logging-pluginが読み込まれていることを確認
# docker inspect 0ab8e00dccd4 |grep log
"Type": "splunk-logging-plugin”,
- dockerコンテナのSTATUS正常に起動していることを確認
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
44fb61ee4ed3 nginx "nginx -g 'daemon of…" 2 hours ago Up About an hour 0.0.0.0:80->80/tcp compassionate_jones
*Exited(1)などは何かしら正常に動いていないことをしめす
About a minute ago Exited (1) About a minute ago
*そんなときは下記コマンドで原因のログを調査
# docker logs (コンテナID)
Error response from daemon: configured logging driver does not support reading
ログの取得を確認
- **http://(GlobalIP)**でWebアクセス
- Splunkにログが届くことを確認
- nginxのコンテナイメージの場合、標準でaccess_logとerror_logをコンテナのログ出力対象(/dev/stdout, /dev/stderr)に設定されている模様
root@44fb61ee4ed3:/var/log/nginx# ls -la
total 0
drwxr-xr-x 1 root root 41 Sep 12 14:37 .
drwxr-xr-x 1 root root 63 Sep 28 06:32 ..
lrwxrwxrwx 1 root root 11 Sep 12 14:37 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Sep 12 14:37 error.log -> /dev/stderr
フィールドの抽出
- はい、ただ残念ながら1ラインのログの場合、よくあるapacheのTAを使って自動的にフィールド抽出がされません。これがlogging-driverの制限かな。json形式のアプリケーションログだったらおそらくsplunkに入るときにキレイにパーシングされるとは思います。
- でも、必要なフィールド抽出はsplunkが得意なところ。
- Scheme on the Fly!
- はい、webアクセスログは楽な方。フィールド抽出できました。
注意点
- 1コンテナ内で生成されるデータに対して1種類のsourcetypeの指定まではできる。とはいえコンテナ内に複数種類のログソースがある場合、もうちょっとスマートに取りたいところ
--log-opt splunk-sourcetype=access_combined
まとめ
- とりあえずコンテナのデータをsyslogサーバに飛ばしておく感覚でSplunkに飛ばすことは簡単に可能
- あとはスキーマオンザフライの力を使って必要なフィールドを後から抽出していく
- もう一周くらいまでばコンテナ関連のデータをもっと効率的に集める仕組みが確立されるかもしれないと期待して、.conf2019に期待
参照リンク
SplunkでDocker運用監視
Dockerコンテナ内のログをSplunkに入れてみた
SplunkでKubernetesのログとメトリクスを監視してみよう