docker-composeでfluentdとelasticsearch/kibanaを動かす
最近自宅サーバの環境をモダンにする作業を進めています。 直接ホストで動かしてたデーモンをdockerに載せたり、ログを準リアルタイム的に解析出来るようにしたり。で、この記事はこのログの部分のメモです。
docker-comopseで立ち上げたコンテナのログを、fluentd経由でelasticsearchに流し込みます。 本当はこの先kibanaで解析するのだけれど、この記事では扱いません。一応立てるだけ。
なお、ここで使ったファイル一式はgithubにあります。
fluentdのイメージを用意する
Docker Hubにfluentdのイメージがあるにはあるのですが、このままだとelasticsearchにoutputするためのプラグインが入っていません。 なので、ドキュメントを参考にしてDockerfileを作ります。
FROM fluent/fluentd RUN apk add --update --virtual .build-deps sudo build-base ruby-dev \ && sudo gem install fluent-plugin-elasticsearch \ && sudo gem sources --clear-all \ && apk del .build-deps \ && rm -rf /var/cache/apk/* /home/fluent/.gem/ruby/2.4.0/cache/*.gem
こんな感じでおっけー。ファイル名は./fluentd/Dockerfile
にしました。
fluentdの設定ファイルを書く
イベージが出来たら、それ用の設定ファイルを書きます。コンテナイメージの中にCOPYしなかったのはちょこちょこ弄りたいから。
ここでは、elasticsearchのコンテナの名前はそのまんまelasticsearch
ということにしておきます。
最小限の内容だと以下のような感じ。受け取った内容をそのまんまelasticsearchに流すだけ。 githubのやつは標準出力にも出すようにしてあります。お好みで。
<source> @type forward port 24224 </source> <match **> @type elasticsearch host elasticsearch port 9200 logstash_format true logstash_prefix fluent.${tag} </match>
どこに置いても良いのですが、とりあえず./fluentd/fluentd.conf
にしました。
ひと通り立ち上げてみる
elasticsearchとkibanaについてはオフィシャルのリポジトリをそのまま使えるので使います。バージョン古いっぽいけど、まあ良いでしょう。
とりあえず立ち上げるだけのdocker-composeは以下のような感じになります。ファイル名は./docker-compose.yml
で。
version: '3' services: fluentd: build: ./fluentd volumes: - ./fluentd/fluentd.conf:/fluentd/etc/fluentd.conf:ro ports: - 24224:24224 environment: FLUENTD_CONF: fluentd.conf elasticsearch: image: elasticsearch depends_on: - fluentd kibana: image: kibana ports: - 5601:5601 depends_on: - elasticsearch
ファイルが出来たら、普通に起動します。
$ docker-compose up -d
この状態でlocalhost:5601にアクセスするとkibanaが開いて色々見れるはず。 ただ、このままだとログも何も流れてこないのでさびしい。
コンテナのログをfluentdに流す
いよいよ本題。コンテナが吐き出すログを全部fluentdに流して、elasticsearchに保存します。
./docker-compose.yml
を書き換えて、以下のような感じに。
version: '3.4' x-logging: &default-logging driver: fluentd options: fluentd-address: localhost:24224 tag: "log.{{.Name}}" services: fluentd: build: ./fluentd volumes: - ./fluentd/fluentd.conf:/fluentd/etc/fluentd.conf:ro ports: - 24224:24224 environment: FLUENTD_CONF: fluentd.conf elasticsearch: image: elasticsearch depends_on: - fluentd logging: *default-logging kibana: image: kibana ports: - 5601:5601 depends_on: - elasticsearch logging: *default-logging
変更は以下の三点です。
- versionが3から3.4になった
- x-loggingってのが増えた
- elasticsearchとkibanaのサービスに
logging: *default-logging
が増えた。
実際のところ3番だけでよくて、1と2は何度も同じことを書かなくてよくするためにやっています。Extension Fieldと言うらしい。
versionを変えたくない場合はlogging:
以下にx-loggingの内容(&default-logging
以外)を書けばおっけーです。
ちなみに、x-logging.options.tag
の部分に.Name
(コンテナの名前が入る)とかいうのを使ってますが、この部分は他にも色々使えるみたいです。dockerのドキュメントにtagに使える変数のリストが載ってるので参考にどうぞ。
この状態でもう一回起動すると、elasticsearchにがしがしログが追記されていくはずです。
ログのタグはfluent.log.(コンテナ名)-YYYY-MM-DD
になっているはず。
このままだとメッセージが全てテキストとして入ってしまって使い勝手が悪いのですが、上手くフィルタ(?)を書いてあげればパースすることも出来るみたいです。
きちんと設定してあげるとかなり快適かつ漏れ無くに監視出来るようになりそうな気がします。素敵。