Docker Compose : Elasticsearch, Fluentd and Kibana

Docker Compose を使って環境構築を行う。

今回使うのは、Elasticsearch, Fluentd, Kibana である。

rsyslog に流れるログを Fluentd で収集し、Elasticsearch に格納し、Kibana で参照する。

導入環境

  • CentOS 7.7
  • Docker 19.03.6
  • Docker Compose 1.25.4

事前準備

PJディレクトリを作成する(任意のディレクトリで可)。

# mkdir docker-efk

Fluentd のディレクトリを作成する。

# cd docker-efk/
# mkdir fluentd

Fluentd

Dockerfile

Dockerfile を作成する。

# touch fluentd/Dockerfile

Dockerfile に下記を追加する。

FROM fluentd:v1.9-1

USER root

RUN apk add --update --no-cache tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone && \
    apk del tzdata

RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "4.0.3"]

fluent.conf

fluent.conf を作成する。

# mkdir fluentd/conf
# touch fluentd/conf/fluent.conf

fluent.conf に下記を追記する。

<source>
  @type syslog
  port 5140
  bind 0.0.0.0
  tag system
  format none
  protocol_type udp
</source>
<match **>
  @type copy
  <store>
    @type file
    path /fluentd/log/messages
    append true
    time_slice_format %Y%m%d
    flush_interval 1s
    compress gzip
  </store>
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    tag_key @log_name
    type_name fluentd
    flush_interval 1s
  </store>
</match>

ログ出力ディレクトリを作成する。

# mkdir fluentd/logs

docker-compose

docker-compose.yml を作成する。

# touch docker-compose.yml

docker-compose.yml

docker-compose.yml に下記を追記する。

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.5.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "TZ=Japan"
    expose:
      - 9200
      - 9300
    ports:
      - "9200:9200"
      - "9300:9300"

  kibana:
    image: kibana:7.5.0
    container_name: kibana
    environment:
      - "TZ=Japan"
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"

  fluentd:
    build: ./fluentd
    container_name: fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
      - ./fluentd/logs:/fluentd/log
    links:
      - "elasticsearch"
    ports:
      - "5140:5140"
      - "5140:5140/udp"

解説

シングルノードで稼働するように設定している。

environment:
  - discovery.type=single-node

JVM option (heap size) を変更している。

environment:
  - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

コンテナのタイムゾーンJST に変更している。

environment:
  - "TZ=Japan"

動作確認

コンテナを起動する。

# docker-compose up -d

Elasticsearch が起動したことを確認するため、Webブラウザhttp://localhost:9200へアクセスする。 f:id:saito_shion:20200228145056p:plain Kibana が起動したことを確認するため、Webブラウザhttp://localhost:5601へアクセスする。 f:id:saito_shion:20200228145104p:plain Fluentd が起動したことを確認するため、コンソールでdocker-compose logs fluentdを実行する。

~~~
 [info]: #0 GET http://elasticsearch:9200/ [status:200, request:0.027s, query:n/a]
~~~

Kibana による動作確認

  1. [Discover] をクリックする。 f:id:saito_shion:20200228145558p:plain
  2. [fluentd-*] を入力する。 f:id:saito_shion:20200228145604p:plain
  3. [@timestamp] を選択する。 f:id:saito_shion:20200228145611p:plain
  4. [Create index pattern] をクリックする。 f:id:saito_shion:20200228151117p:plain

終わりに

EFK の連携がこれでできたはず…できていなかったらごめんなさい。

これで syslog からメッセージが流れてくると Kibana 上で確認することができる。

参考サイト

Elasticsearch on Dockerで仮想通貨の情報を取得する - Yuya Sugano - Medium