Ubuntu 14.04でFluentdとElasticSearchを使用してDockerログを集中化する方法

Fluentdの記事

前書き

  • Fluentdとは?*

Fluentdは、ロギングインフラストラクチャを統合するために設計されたオープンソースデータコレクターです。 ログの収集と保存を簡単かつスケーラブルにすることで、運用エンジニア、アプリケーションエンジニア、およびデータエンジニアをまとめるように設計されています。

Fluentdの前に

image:https://assets.digitalocean.com/articles/dockerlogs_fluentd/1.jpg [多くのプログラム間の関係を示す乱雑なログ構造]

Fluentd後

image:https://assets.digitalocean.com/articles/dockerlogs_fluentd/2.png [Fluentdは多くのソースからアプリケーションおよびアクセスログを収集し、それらを多くの分析、アーカイブ、およびメトリック出力に集めます]

主な機能

Fluentdには、クリーンで信頼性の高いログパイプラインの構築に適した4つの重要な機能があります。

  • * JSONを使用した統合ロギング:* Fluentdは、可能な限りJSONとしてデータを構造化しようとします。 これにより、Fluentdは、ログデータの処理のすべての面を統合できます。複数のソースと宛先間でログを収集、フィルタリング、バッファリング、出力します。 JSONを使用すると、厳格なスキーマを強制せずにアクセスできる十分な構造を持つため、ダウンストリームのデータ処理がはるかに簡単になります。

  • プラガブルアーキテクチャ: Fluentdには、コミュニティが機能を拡張できる柔軟なプラグインシステムがあります。 コミュニティが提供する300以上のプラグインは、多数のデータソースを多数のデータ出力に接続し、必要に応じてデータを操作します。 プラグインを使用することで、すぐにログを有効に活用できます

  • *必要な最小リソース:*ユーザーがビジーなマシンで快適に実行できるように、データコレクターは軽量である必要があります。 FluentdはCとRubyの組み合わせで記述されており、最小限のシステムリソースが必要です。 バニラインスタンスは30〜40 MBのメモリで実行され、13,000イベント/秒/コアを処理できます。

  • *組み込みの信頼性:*データの損失は決して起こりません。 Fluentdはメモリベースおよびファイルベースのバッファリングをサポートし、ノード間のデータ損失を防ぎます。 Fluentdは堅牢なフェールオーバーもサポートし、高可用性を実現するようにセットアップできます

目標:Fluentdを使用した集中化されたDockerコンテナーログの収集

Dockerコンテナは実稼働環境で展開されるため、コンテナよりも一時的でない場所でコンテナのログを保持する必要性が高まっています。

このチュートリアルでは、Fluentdをインストールし、それを使用してDockerコンテナーからログを収集し、コンテナーを停止した後にデータを保存できるように外部に保存する方法を示します。 同じUbuntu 14.04サーバー上のElasticsearchを実行している別のコンテナーにデータをストリーミングします。

KubernetesのGitHubリポジトリで概説されているように、このアーキテクチャはFluentdの機能を使用してJSON-perを追跡および解析します。コンテナーごとにDockerデーモンによって生成される行ログファイル。 最小限の設定については、http://www.fluentd.org/guides/recipes/docker-logging [このレシピ]をご覧ください。

このチュートリアルの最後で、さらに2つのユースケースについて説明します。 この記事を読んだ後、Fluentdの使用方法の基本を理解する必要があります。

前提条件

チュートリアルのこれらの前提条件を満たしていることを確認してください。

  • Ubuntu 14.04ドロップレット

  • sudo accessを持つユーザー

ステップ1-Fluentdのインストール

Fluentdをデプロイする最も一般的な方法は、 `+ td-agent`パッケージを使用することです。 Fluentdの元の作者であるTreasure Dataは、Fluentdを独自のRubyランタイムでパッケージ化するため、ユーザーが独自のRubyをセットアップしてFluentdを実行する必要はありません。

現在、 `+ td-agent`は以下のプラットフォームをサポートしています:

  • Ubuntu:明id、正確、信頼

  • Debian:WheezyおよびSqueeze

  • RHEL / Centos:5、6、および7

  • Mac OSX:10.9以降

このチュートリアルでは、Ubuntu 14.04 LTS(Trusty)を実行しているDigitalOcean Dropletを使用していると想定しています。

次のコマンドで `+ td-agent`をインストールします:

curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

`+ td-agent`を起動します:

sudo /etc/init.d/td-agent start

ログをチェックして、正常にインストールされたことを確認します。

tail /var/log/td-agent/td-agent.log

次のような出力が表示されます。

   port 24230
 </source>
</ROOT>
2015-02-22 18:27:45 -0500 [info]: adding source type="forward"
2015-02-22 18:27:45 -0500 [info]: adding source type="http"
2015-02-22 18:27:45 -0500 [info]: adding source type="debug_agent"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="td.*.*" type="tdlog"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="debug.**" type="stdout"
2015-02-22 18:27:45 -0500 [info]: listening fluent socket on 0.0.0.0:24224
2015-02-22 18:27:45 -0500 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

_ _ *注意:*あるいは、FluentdはRuby gemとして利用でき、 `+ gem install fluentd +`でインストールできます。 sudo権限がない場合は、Rubyをインストールしてください(https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-debian-7-wheezyを参照してください[Rubyのインストール](例)ここで)を実行します:

gem install fluentd --no-rdoc --no-ri

_ _

ステップ2-Dockerのインストール

次に、Dockerをインストールします。 このチュートリアルは、Docker v1.5.0でテストされました。

Dockerリポジトリのキーを追加して、最新のDockerパッケージを取得できるようにします。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

ソースにリポジトリを追加します。

sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"

システムを更新します。

sudo apt-get update

Dockerをインストールします。

sudo apt-get install lxc-docker

バージョンを確認して、Dockerがインストールされたことを確認します。

docker --version

次のような出力が表示されるはずです。

Docker version 1.5.0, build a8a31ef

手順3-Dockerグループへのユーザーの追加

Dockerは* root *として実行されるため、 `+ docker `コマンドを発行するには、sudoユーザーを* docker *グループに追加します。 `+`を選択したユーザーに置き換えます。

sudo gpasswd -a  docker

次に、Dockerを再起動します。

sudo service docker restart

最後に、現在sudoユーザーとしてログインしている場合は、ログアウトして再度ログインする必要があります。

ステップ4-Fluentdイメージの構築

このセクションでは、Fluentd DockerコンテナーのDockerイメージを作成します。 一般的なDockerの詳細については、https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-introduction-to-common-components [この入門チュートリアル]をご覧ください。

Fluentd Dockerリソース用の新しいディレクトリを作成し、そこに移動します。

mkdir ~/fluentd-docker && cd ~/fluentd-docker

次の `+ Dockerfile +`を作成します。

sudo nano Dockerfile

ファイルに次の内容を正確に追加します。 このファイルは、Dockerコンテナーを更新し、Ruby、Fluentd、ElasticsearchをインストールするようにDockerに指示します。

FROM ruby:2.2.0
MAINTAINER [email protected]
RUN apt-get update
RUN gem install fluentd -v "~>0.12.3"
RUN mkdir /etc/fluent
RUN apt-get install -y libcurl4-gnutls-dev make
RUN /usr/local/bin/gem install fluent-plugin-elasticsearch
ADD fluent.conf /etc/fluent/
ENTRYPOINT ["/usr/local/bundle/bin/fluentd", "-c", "/etc/fluent/fluent.conf"]

同じディレクトリに `+ fluent.conf +`ファイルを作成する必要もあります。

sudo nano fluent.conf

`+ fluent.conf +`ファイルは次のようになります。 このファイルを正確にコピーできます。

<source>
 type tail
 read_from_head true
 path /var/lib/docker/containers/*/*-json.log
 pos_file /var/log/fluentd-docker.pos
 time_format %Y-%m-%dT%H:%M:%S
 tag docker.*
 format json
</source>
# Using filter to add container IDs to each event
<filter docker.var.lib.docker.containers.*.*.log>
 type record_transformer
 <record>
   container_id ${tag_parts[5]}
 </record>
</filter>

<match docker.var.lib.docker.containers.*.*.log>
 type elasticsearch
 logstash_format true
 host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature
 port 9200
 flush_interval 5s
</match>

このファイルの目的は、他のDockerコンテナーのログの場所をFluentdに伝えることです。

次に、 `+ fluentd-es +`と呼ばれるDockerイメージをビルドします。

docker build -t fluentd-es .

これには数分かかります。 イメージが正常にビルドされたことを確認します。

docker images

次のような出力が表示されます。

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
fluentd-es          latest              89ba1fb47b23        2 minutes ago       814.1 MB
ruby                2.2.0               51473a2975de        6 weeks ago         774.9 MB

ステップ5-Elasticsearchコンテナーの開始

次に、Elasticsearchコンテナのホームディレクトリまたは優先ディレクトリに戻ります。

cd ~

Elasticsearchコンテナーをダウンロードして開始します。 このための自動化されたビルドが既にあります:

docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch

コンテナイメージがダウンロードされて起動するのを待ちます。

次に、Dockerプロセスをチェックして、Elasticsearchコンテナーが正しく実行されていることを確認します。

docker ps

次のような出力が表示されます。

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES
c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   4 minutes ago      Up 4 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es

ステップ6-Fluentd-to-Elasticsearchコンテナーの開始

次に、Fluentdを実行し、ログを収集し、Elastcisearchに送信するコンテナーを起動します。

docker run -d --link es:es -v /var/lib/docker/containers:/var/lib/docker/containers fluentd-es

上記のコマンドでは、 `-link es:es +`部分はElasticsearchコンテナーをFluentdコンテナーにリンクします。 ホストコンテナのログディレクトリをFluentdコンテナにマウントするには、「-v / var / lib / docker / containers:/ var / lib / docker / containers +」の部分が必要です。 。

最後に、アクティブなDockerプロセスを確認して、コンテナーが実行されていることを確認します。

docker ps

今回は、Elasticsearchコンテナと新しい `+ fluentd-es +`コンテナの両方が表示されるはずです。

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES
f0d2cac81ac8        fluentd-es:latest               "/usr/local/bundle/b   2 seconds ago    Up 2 seconds                                                        stupefied_brattain
c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   6 minutes ago      Up 6 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es

ステップ7-Elasticsearchがイベントを受信して​​いることを確認する

最後に、Elasticsearchがイベントを受信して​​いることを確認しましょう。

curl -XGET 'http://localhost:9200/_all/_search?q=*'

出力には、次のようなイベントが含まれている必要があります。

{"took":66,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
{"took":59,"timed_out":false,"_shards":{"tod","_id":"AUwLaKjcnpi39wqZnTXQ","_score":1.0,"_source":{"log":"2015-03-12 00:35:44 +0000 [info]: following tail of /var/lib/docker/containers/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9-json.log\n","stream":"stdout","container_id":"6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9","@timestamp":"2015-03-12T00:35:44+00:00"}}]}}

設定によっては、かなりの数のイベントが記録される場合があります。 単一のイベントは、 `+ {" took ":+`で始まり、タイムスタンプで終わる必要があります。

この出力が示すように、Elasticsearchはデータを受信して​​います。 (コンテナIDは上記のものとは異なります!)

ステップ8-イベントログを次のレベルに進める

コンテナイベントがElasticsearchによって保存されたので、次に何をする必要がありますか? Elasticsearchには便利なことがたくさんあります。 アイデアを探しているなら、チェックアウトしたいかもしれません:

結論

Dockerコンテナーからログを収集することは、Fluentdを使用する1つの方法にすぎません。 このセクションでは、Fluentdの他の2つの一般的な使用例を紹介します。

ユースケース1:リアルタイムログ検索とログアーカイブ

多くのユーザーがFluentdに来て、リアルタイムのログ検索と長期保存の両方を行うロギングパイプラインを構築します。 アーキテクチャは次のようになります。

image:https://assets.digitalocean.com/articles/dockerlogs_fluentd/3.png [複数のバックエンドからElasticsearch、MongoDB、Hadoopへのログのファンネル化]

このアーキテクチャは、データストリームをコピーして複数のストレージシステムに出力するFluentdの機能を利用しています。 上記の設定では、Elasticsearchがリアルタイム検索に使用され、MongoDBやHadoopがバッチ分析と長期ストレージに使用されます。

ユースケース2:集中化されたアプリケーションロギング

Webアプリケーションは大量のログを生成しますが、多くの場合、それらは任意にフォーマットされ、ローカルファイルシステムに保存されます。 これは2つの理由で悪いです。

  • ログはプログラムで解析するのが難しく(多くの正規表現を必要とする)、統計分析(A / Bテスト、不正検出など)を通じてユーザーの行動を理解したい人にはあまりアクセスできません。

  • テキストログはストレージシステムにバルクロードされるため、ログにはリアルタイムでアクセスできません。 また、サーバーのディスクがバルクロード間で破損した場合、ログは失われるか破損します

Fluentdはこれらの問題を次の方法で解決します。

  • 一貫したAPIを使用して、さまざまなプログラミング言語用のロガーライブラリを提供します。各ロガーは、Fluentdにトリプル(タイムスタンプ、タグ、JSON形式のイベント)を送信します。 現在、Ruby、Node.js、Go、Python、Perl、PHP、Java、C ++用のロガーライブラリがあります

  • アプリケーションが「発火して忘れる」ことを許可する:ロガーはFluentdに非同期でログを記録でき、バックエンドシステムにアップロードする前にログをバッファリングします

リソース:

前の投稿:ビルドタグを使用したGoバイナリのカスタマイズ
次の投稿:CentOS 7でEtckeeperを使用してバージョン管理で/ etcを管理する方法