ログの監視と分析は、アプリケーションであろうとサーバー/コンテナーインフラストラクチャであろうと、今日では重要になっています。選択できるログ分析とモニタリングで最も人気のあるソフトウェアスタックの1つは、Elasticsearch、Fluentd、およびKibana(EFKスタック)です。
EFKスタックは、構造化された検索と分析を可能にする分散型でスケーラブルな検索エンジンです。また、このチュートリアルでは、Dockerを使用してEFKスタックログモニタリングを設定し、コンテナログをEFKスタックに一元化する方法を学習します。
準備?読んで、ログ分析を簡単にしてください!
前提条件
このチュートリアルは、実践的なデモンストレーションで構成されています。フォローするには、次のものがあることを確認してください。
- Linuxホスト–この例では、6GBのメモリ容量を持つDebian11Bullseyeサーバーを使用しています。
- LinuxホストにインストールされているDockerCE(Community Edition)とDockerCompose。
EFKスタックプロジェクトの設定
EFK Stackは、ベアメタルおよびコンテナインフラストラクチャ向けのエンタープライズ対応のログ集約およびログ分析フレームワークです。ただし、EFKスタックをデプロイする前に、まずプロジェクトディレクトリを設定し、DockerホストにEFKスタックをデプロイするためのDocker構成を作成します。
この例では、次の仕様のDockerイメージを使用します。
- Elasticsearch 7.17.0 –高速のLightningApacheLuceneベースの検索機能でデータを保存できます
- Kibana 7.17.0 –JSONデータをサポートするオープンソースのデータ集約およびコレクター。
- v1.14.1に基づくFluentdカスタムイメージ–Elasticsearch用のデータ視覚化ソフトウェア。
EFKスタックプロジェクトを設定するには:
1.ターミナルを開き、サーバーにログインします。
2.以下のコマンドを実行して、DockerとDockerComposeの両方がシステムにインストールされていることを確認します。
# Checking Docker version
docker --version
# Checking docker-compose version
docker-compose version
以下に示すように、インストールされているDocker CE(Community Edition)v20.10.12およびDockerComposev1.29.2のバージョン。
3.次のコマンドを実行して、新しいプロジェクトディレクトリ(mkdir
)を作成します )そしてそれを作業ディレクトリとして設定します(cd
)。
ディレクトリには好きな名前を付けることができますが、このチュートリアルでは、ディレクトリの名前はefkです。このディレクトリには、このチュートリアルのすべてのEFKスタック構成ファイルが保存されます。
mkdir -p ~/efk; cd ~/efk
4.次に、新しい構成ファイル(docker-compose.yml
)を作成します )お好みのエディタを使用して、次の構成を設定します。
以下の構成では、Docker Composeスクリプトv3を使用し、すべてのEFKスタックコンテナーを定義しています。
version: "3"
# Define the Docker volume named esdata for the Elasticsearch container.
volumes:
esdata:
# Deploying three container services (fluentd, elasticsearch, and kibana)
services:
# Deploy using the custom image automatically be created during the build process.
fluentd:
build: ./fluentd
links: # Sends incoming logs to the elasticsearch container.
- elasticsearch
depends_on:
- elasticsearch
ports: # Exposes the port 24224 on both TCP and UDP protocol for log aggregation
- 24224:24224
- 24224:24224/udp
# Created using the Docker image elasticsearch:7.17.0
elasticsearch:
image: elasticsearch:7.17.0
expose: # Exposes the default port 9200
- 9200
environment:
- discovery.type=single-node # Runs as a single-node
volumes: # Stores elasticsearch data locally on the esdata Docker volume
- esdata:/usr/share/elasticsearch/data
# Created using the Docker image kibana:7.17.0
kibana:
image: kibana:7.17.0
links: # Links kibana service to the elasticsearch container
- elasticsearch
depends_on:
- elasticsearch
ports: # Runs kibana service on default port 5601
- 5601:5601
environment: # Defined host configuration
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
5.以下のコマンドを実行して、新しいディレクトリfluentd
を作成します そのディレクトリに移動します。 fluentd
ディレクトリにはfluentd
が保存されます サービス構成。
mkdir -p fluentd/; cd fluentd/
6. 〜/ efk / fluentdの内部 ディレクトリに、新しい Dockerfileを作成します 好みのエディターを使用して、次の構成を設定します。
この構成では、elasticsearchクライアントドライバーとfluentd-plugin-elasticsearchを含むfluentdカスタムイメージが作成されます。
必ずelasticsearchとelasticsearchクライアントドライバーの間で同じバージョンを使用してください—このチュートリアルではバージョン7.17.0を使用しています。
# image based on fluentd v1.14-1
FROM fluentd:v1.14-1
# Use root account to use apk
USER root
# below RUN includes plugin as examples elasticsearch is not required# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
sudo build-base ruby-dev \
&& gem uninstall -I elasticsearch \
&& gem install elasticsearch -v 7.17.0 \
&& sudo gem install fluent-plugin-elasticsearch \
&& sudo gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem
# copy fluentd configuration from host image
COPY ./conf/fluent.conf /fluentd/etc/
# copy binary start file
COPY entrypoint.sh /bin/
RUN chmod +x /bin/entrypoint.sh
USER fluent
7.次に、別の構成ファイル(entrypoint.sh
)を作成します )お好みのエディターを使用して、次の構成を設定します。このスクリプトは、fluentd
のときに実行されます コンテナサービスを開始します。
以下は、基本コマンドfluentd –config /fluentd/etc/fluentd.conf –plugin / etc / fluentd/pluginsを実行するfluentdコンテナーサービスのスタータースクリプトです。
#!/bin/sh
#source vars if file exists
DEFAULT=/etc/default/fluentd
if [ -r $DEFAULT ]; then
set -o allexport
. $DEFAULT
set +o allexport
fi
# If the user has supplied only arguments append them to `fluentd` commandif [ "${1#-}" != "$1" ]; then
set -- fluentd "[email protected]"
fi
# If user does not supply config file or plugins, use the defaultif [ "$1" = "fluentd" ]; then
if ! echo [email protected] | grep -e ' \-c' -e ' \-\-config' ; then
set -- "[email protected]" --config /fluentd/etc/${FLUENTD_CONF}
fi
if ! echo [email protected] | grep -e ' \-p' -e ' \-\-plugin' ; then
set -- "[email protected]" --plugin /fluentd/plugins
fi
fi
8.以下のコマンドを実行して、新しいディレクトリconf
を作成します。 〜/ efk / fluentdの下 ディレクトリ。
mkdir -p conf
9.ここで、fluentd構成( conf / fluentd.conf )を作成します )お好みのエディターを使用して、次の構成を設定します。
この構成により、fluentdコンテナーサービスはログメッセージを受信し、elasticsearchコンテナーサービスに転送できます。
# bind fluentd on IP 0.0.0.0
# port 24224
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
# sendlog to the elasticsearch
# the host must match to the elasticsearch
# container service
<match *.**>
@type copy
<store>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix fluentd
logstash_dateformat %Y%m%d
include_tag_key true
type_name access_log
tag_key @log_name
flush_interval 300s
</store>
<store>
@type stdout
</store>
</match>
10.最後に、以下のコマンドを実行して、EFKスタックプロジェクトディレクトリの構造を確認します。
treeコマンドがない場合は、次のコマンドを使用してインストールします:apt install tree -y
# Checking list of files and directory
ls
# Checking directory structure
tree
以下は、EFKStackプロジェクトディレクトリの完全な構造です。
Dockerを使用したEFKスタックのデプロイ
これで、DockerとDockerComposeを使用してEFKスタックをデプロイするためのすべての構成ファイルが作成されました。次のステップは、docker-compose
を使用してEFKスタックをデプロイすることです。 コマンドを実行すると、プロジェクトディレクトリ(〜/ efk )で展開が行われます。 。
1.まず、以下のコマンドを実行して、作業ディレクトリをefk
に変更します。 プロジェクトディレクトリ。
cd ~/efk/
2.次に、docker-compose
を実行します 以下のコマンドでデプロイします(up
)EFKスタックログ分析およびログ監視システム。
このコマンドは、DockerイメージElasticsearchとKibanaを自動的にダウンロードします。また、FluentdDockerイメージはDockerfileを使用して自動的にビルドされます fluentd ディレクトリ。
Dockerホストの仕様によっては、デプロイに時間がかかる場合があります。
docker-compose up -d
以下は、FluentdDockerイメージのビルドプロセスのスクリーンショットです。
以下は、デプロイが完了し、Kibanaコンテナサービスが実行されていることを示すスクリーンショットです。
3.以下の各コマンドを実行して、EFKスタックビルドプロセスのログを確認します。展開プロセスでエラーが発生した場合は、常にこれらのコマンドを実行してください。
# Checking logs for service fluentd
docker-compose logs fluentd
# Checking logs for service kibana
docker-compose logs kibana
以下は、fluentdコンテナーサービスが実行されているときのログメッセージです。
以下は、kibanaコンテナのログです。
4.次に、以下のコマンドを実行して、すべてのコンテナサービスのステータスを確認します(ps
)。
docker-compose ps
以下に示すように、EFKスタックコンテナサービスは稼働しています。次のステップでコンテナーが正しく実行されていることをさらに確認するために、elasticsearchコンテナー名(efk_elasticsearch_1)を書き留めます。
5.さらに、以下のコマンドを実行して、elasticsearchコンテナーサービスを確認します。このコマンドは、efk_elasticsearch_1
の詳細設定を出力します 容器。
docker inspect efk_elasticsearch_1
以下に示すように、efk_elasticsearch_1コンテナは172.18.0.2のIPアドレスを取得します。
6.最後に、以下のコマンドを実行して、IPアドレス(172.18.0.2
)でelasticsearchコンテナーにアクセスして確認します。 )。ポート9200
はelasticsearchコンテナのデフォルトポートです。
curl 172.18.0.2:9200
マシンのelasticsearchコンテナが実行されている場合は、次のような出力が表示されます。
Kibanaインデックスパターンの設定
Docker環境でのEFKスタックのデプロイが完了したので、WebブラウザーからKibanaを開きます。ログの監視と分析のためのインデックスパターンを設定します。
1.お気に入りのWebブラウザーを開き、サーバーのIPアドレスに移動してからKibanaサービスポート5601(http://172.16.1.10:5601など)に移動します。
2.次に、自分で探索をクリックします 下のウェルカムページのボタン。
3.スタック管理をクリックします [管理]セクションでKibanaインデックスパターンを設定するオプション。
4.キバナについて 左側のメニューセクションで、メニューインデックスパターンをクリックします インデックスパターンの作成をクリックします ボタンをクリックして、新しいインデックスパターンを作成します。
5.ここで、インデックスパターン名前を入力します 流暢-として *、タイムスタンプフィールドを設定します @timestampへ 、[インデックスパターンの作成]をクリックします ボタンをクリックして、インデックスパターンの設定を確認します。
右側には、fluentd-%Y%m%dなどのfluentdから利用可能なインデックスパターンが表示されます。 %Y%m%dの日付形式は、fluentd構成( fluentd.conf )に基づいています。 。
6.最後に、左上のメニュー(省略記号)をクリックしてから、検出をクリックします。 ログ監視を表示するメニュー。
以下は、Kibanaログの監視と分析のダッシュボードのスクリーンショットです。リストされているすべてのログはElasticsearchから取得され、Fluentdログアグリゲーションによって出荷されます。
FluentdLogDriverを使用したDockerコンテナの実行
Kibanaインデックスパターンを構成した後、Fluentdログドライブを使用してDockerコンテナーを実行し、ログをEFKスタックに自動的に送信します。
1.以下のコマンドを実行して、NGINXイメージをダウンロードします。 alpine
バージョンは、Ubuntu、CentOS、またはFedoraに基づく通常のイメージよりも小さいです。
docker pull nginx:alpine
2.次に、以下のコマンドを実行して、新しいNGINXコンテナー(nginx_container
)を開始します )デタッチモード(-d
)。
このコマンドは、ログドライブをFluentd(–log-driver =fluentd)に設定し、コンテナー(nginx_container)のDockerホストマシンのポート8080を公開します。
docker run --name nginx_container -d --log-driver=fluentd -p 8080:80 nginx:alpine
3.コンテナを実行した後、docker
を実行します 以下のコマンドを実行して、実行中のすべてのコンテナを確認します。
docker ps
nginx_containerが稼働していてホストポート8080で実行されていることを確認する必要があります。
4.次に、以下のコマンドを実行して、nginx_container
にアクセスします。 アクセスログを生成します。
curl localhost:8080
または、ウェブブラウザで新しいタブを開き、サーバーのIPアドレスに続けてポート8080(http://172.168.1.10:8080など)を入力します。
すべてがうまくいけば、デフォルトの index.htmlが表示されます。 nginx_containerのページ。
5.最後に、Kibanaダッシュボードに戻り、検出をクリックします。 左側のメニュー。
KQL(Kibana Query Language)フィールドでcontainer_name:nginx_containerクエリをクリックすると、以下に示すように、nginx_containerからのログが表示されます。
結論
Dockerを使用したログの監視と分析のために、このチュートリアル全体でEFKスタック(Elasticsearch、Fluentd、およびKibana)をデプロイする方法を学習しました。 Fluentdログドライバーを使用してDockerコンテナーのログを設定する方法も学習しました。この時点で、アプリケーションとサービスの完全に機能するログ監視が可能になりました。
次の段階では、KQL(Kibana Query Language)を使用してログの監視と分析を視覚化することに興味があるかもしれません。