2022年4月28日木曜日

docker で起動した Gitlab の production_json.log を fluentd で elasticsearch に飛ばす方法

docker で起動した Gitlab の production_json.log を fluentd で elasticsearch に飛ばす方法

概要

Gitlab のコンテナの標準出力のログは JSON 形式ではないので docker の fluentd ドライバが使えません
なのでコンテナ内に出力されるアプリケーションのログファイルを見る必要があります

ポイントはコンテナ内のログファイルをホストにマウントする点です

環境

  • Gitlab-ee 14.7.7
  • fluentd 1.3.2
  • fluent-plugin-elasticsearch 4.3.3
  • elasticsearch 7.17.1
  • elasticsearch 7.17.3
  • kibana 7.17.3

ElasticSearch 起動

  • docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.3

Kibana 起動

  • docker run -d -e ELASTICSEARCH_HOSTS=http://192.168.100.10:9200 -p 5601:5601 docker.elastic.co/kibana/kibana:7.17.3

fluentd ビルド&起動

  • vim Dockerfile
FROM fluent/fluentd

RUN apk add --update --virtual .build-deps \
        sudo build-base ruby-dev \
 && sudo gem install \
        elasticsearch -v 7.17.1 \
 && sudo gem install \
        fluent-plugin-elasticsearch -v 4.3.3 \
 && sudo gem sources --clear-all \
 && apk del .build-deps \
 && rm -rf /var/cache/apk/* \
           /home/fluent/.gem/ruby/2.5.0/cache/*.gem
  • vim fluent.conf
<source>
  @type tail
  format json
  path /fluentd/gitlab_log/production_json.log
  pos_file /fluentd/gitlab_log/production_json.log.pos
  tag gitlab.production
  keep_time_key true
</source>

<match gitlab.production>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type elasticsearch
    host 192.168.100.10
    port 9200
    index_name gitlab.production
    type_name fluentd
	    logstash_format true
    time_key time
  </store>
</match>
  • docker build -t my_fluentd .
  • docker run -d -v $(pwd):/fluentd/etc -v /path/to/log/gitlab-rails:/fluentd/gitlab_log -e FLUENTD_CONF=fluent.conf -e FLUENT_UID=998 my_fluentd

ポイント

  • Gitlab のログをホスト側でマウントしてそれを tail で飛ばす
  • 上記の場合は fluentd コンテナの /fluentd/gitlab_log にログをマウントしている
  • マウント先は /fluentd 配下でないと権限がないと言われて怒られる
  • また fluent ユーザの UID は 998 にしている、998は Gitlab 上で動作している git ユーザの UID でログファイルの権限が git ユーザの権限になっている、fluent ユーザのデフォルトの UID は 1000 になっており 1000 のまま fluentd コンテンを起動するとログの権限が 1000 になり Gitlab からログが書き込めずエラーになるのでそれの対応になる
  • production_json.log にはタイムスタンプ用に time フィールドがあるが keep_time_key: true を設定しないと消えるので注意
  • Elasticsearch のバージョンに合わせて elasticsearch-ruby のバージョンも合わせる必要がある
  • ログファイルの権限と fluentd 側の権限 (uid, gid) は合わせる必要がありそう

最後に

他のログも同じように転送することができます

0 件のコメント:

コメントを投稿