[03] 构建 EFK(Elasticsearch + Fluentd + Kibana)…启动 Docker 容器(附有说明)
首先
在职场1中,我们谈到了引入”CI/CD日志”和”CLI和Web应用程序日志”的收集和可视化。另外,在我在家学习K8s的过程中,经常听到Fluentd这个词。
因此,我决定在我的Ubuntu 18.04主机上使用docker-compose来构建一个Elasticsearch + Fluentd + Kibana(EFK)环境,如下图和下表所示,以进行验证并获得对这些软件的理解。
在本章节中,将列举使用docker-compose.yml文件来配置并启动下图所示内容的详细步骤。
如果在代理下进行设置,
[04] EFK(Elasticsearch + Fluentd + Kibana)的构建… 可能会参考Docker容器的启动(在代理服务器下)。
形成
图
整一下
Fluentd のテストのために導入しているだけである.
本表 No 2 の Fluentd(24224) へログを配送する.2Fluentd2422424224採用バージョン v1.13.1.
受信したログを本表 No 3 の Fluentd(34224)へ転送する.3Fluentd3422434224採用バージョン v1.13.1.
受信したログを Elasticsearch へ書き込みする.4Elasticsearch2920029200採用バージョン v7.14.
ログ格納のためのデータストア.
日本語検索をするための analysis-kuromoji 導入あり.5Kibana2960129601採用バージョン v7.14.
Elasticsearch の視覚化
请注意下一个事项
为了考虑到工作环境,进行了以下设置。
・有两个部署了Fluentd的实例。
・将Elasticsearch容器的端口设置为9200以外的其他端口。
・将Kibana容器的端口设置为5601以外的其他端口。
请用汉语将以下内容进行释义,只需提供一种选项:
步驟
1. 文件结构
使用Git clone获取整个代码库。
$ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git
$ cd qiita-efk.git
$ tree . --charset=c
.
|-- PV
| |-- elasticsearch
| | `-- config
| | `-- elasticsearch.yml ... Elasticsearch の挙動パラメータ定義
| |-- fluentd
| | |-- etc
| | | `-- fluent.conf ......... Fluentd 24224ポートでの待ち受け定義
| | `-- log ..................... バッファログ出力先ディレクトリ
| |-- fluentd2
| | |-- etc
| | | `-- fluent.conf ......... Fluentd 34224ポートでの待ち受け定義
| | `-- log ..................... バッファログ出力先ディレクトリ
| `-- kibana
| `-- config
| `-- kibana.yml .......... Kibana の挙動パラメータ定義
|-- README.md
|-- assets
| |-- elasticsearch
| | `-- Dockerfile .............. 日本語検索のための analysis-kuromoji のインストールあり
| |-- fluentd2
| | `-- Dockerfile .............. Elasticsearch プラグインのインストールあり
| `-- nginx
| `-- Dockerfile .............. jwilder/dockerize を使って Fluentd, Elasticsearch, Kibana の起動を待つ
| K8s での ReadinessProbe の挙動に近いはず
`-- docker-compose.yml
2. 每个文件的详细信息。
文件的全部内容可以从以下地方获得。在这里只记录了认为重要的事项。
$ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git
docker-compose.yml的翻译就是:docker-compose.yml
我在代码中将要注意的要点作为注释写下来。
关于docker-compose.yml文件中的Nginx部分
略
# ⬇️ Nginx は Fluentd のテストのために導入しただけである
nginx:
image: nginx:1.20.0
build: assets/nginx
container_name: myfld_nginx
ports:
- "21337:80"
# ⬇️ ログ出力先を fluentd にする
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
tag: "docker.{{.Name}}"
# ⬇️ jwilder/dockerize コマンドを使って、0.5秒周期で最大2分間まで、
# Fluentd, Elasticsearch, Kibana の起動を待つ. HTTP 応答 200 なら起動完了とみなす.
# なお、jwilder/dockerize は Dockerfile の中でインストールをしている.
command: >
dockerize -wait tcp://fluentd:24224 -wait tcp://fluentd2:34224 -wait tcp://kibana:29601 -wait tcp://elasticsearch:29200 -timeout 2m -wait-retry-interval 0.5s
/usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
depends_on:
- fluentd
- elasticsearch
- kibana
略
关于 docker-compose.yml 文件中的 Fluentd 配置
fluentd:
image: fluent/fluentd:v1.13-1
container_name: myfld_fluentd
restart: always
command: >
/usr/bin/fluentd -c /fluentd/etc/fluent.conf -v
ports:
- "127.0.0.1:24224:24224"
- "127.0.0.1:24224:24224/udp"
volumes:
# ⬇️ バッファリングしたデータファイルが保存される
- ./PV/fluentd/log:/fluentd/log
# ⬇️ fluent.conf の配置先である.
# fluent.conf の中で 34224 への転送設定や転送周期、フィルタ条件などを定義している.
- ./PV/fluentd/etc:/fluentd/etc
fluentd2:
image: fluent/fluentd:v1.13-1
build: assets/fluentd2
container_name: myfld_fluentd2
restart: always
command: >
/usr/bin/fluentd -c /fluentd/etc/fluent.conf -v
ports:
- "127.0.0.1:34224:34224"
- "127.0.0.1:34224:34224/udp"
volumes:
- ./PV/fluentd2/log:/fluentd/log
# ⬇️ fluent.conf の配置先である.
# fluent.conf の中で 34224 からのログ転送を許可している.
- ./PV/fluentd2/etc:/fluentd/etc
关于 docker-compose.yml 中的 Elasticsearch
略
elasticsearch:
image: elasticsearch:7.14.0
build: assets/elasticsearch
container_name: myfld_elasticsearch_fluentd2
ports:
# ⬇️ コンテナ側ポートを 29200 にするためには、ここの定義を変えるだけでは不十分だった.
# そのために、./PV/elasticsearch/config/elasticsearch.yml で 29200 を指定した.
- "29200:29200"
environment:
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
# ⬇️ 公式手順では JVM パラメータは環境変数で設定できるようだが、当方の場合は切り替えできず.
# docker-compose.yml の記載ミスの疑いが高いが、仕方なく設定ファイル elasticsearch.yml
# を配置する方法にした.
- ./PV/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
# ⬇️ ローカルボリュームを使うと Java で Exception が生じてしまう. (2021/08 時点では理由不明)
# 外付け SSD でマウントしているからなのだろうか. 本記事とは全く別のコンテナでも同現象が起きた.
# - ./PV/elasticsearch/data:/usr/share/elasticsearch/data
- myfld_elasticsearch_fluentd2_vol:/usr/share/elasticsearch/data
# - "./PV/elasticsearch/config/jvm.options.d:/usr/share/elasticsearch/config/jvm.options.d/"
depends_on:
- fluentd
- fluentd2
略
volumes:
myfld_elasticsearch_fluentd2_vol:
关于 docker-compose.yml 文件中的 Kibana 部分
略
kibana:
image: kibana:7.14.0
container_name: myfld_kibana_fluentd2
ports:
# ⬇️ コンテナ側ポートを 29601 にするためには、ここの定義を変えるだけでは不十分だった.
# そのために、./PV/kibana/config/kibana.yml で 29601 を指定した.
- "29601:29601"
# ⬇️ 環境変数だと Kibana サーバのポート変更ができず.
# そのためにホスト側から /usr/share/kibana/config/kibana.yml をマウントしている.
# environment:
# - ELASTICSEARCH_URL=http://elasticsearch:29200
volumes:
- ./PV/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
depends_on:
- fluentd
- fluentd2
- elasticsearch
资产/弹性搜索/Dockerfile
## FROM elasticsearch:7.14.0
## プロキシサーバを使う場合
# ENV http_proxy="http://proxy.co.jp:8080"
# ENV https_proxy="http://proxy.co.jp:8080"
# ⬇️ 下記コマンドを使って日本語検索プラグイン analysis-kuromoji をインストールした.
RUN elasticsearch-plugin install analysis-kuromoji
资产/流畅腾2/Dockerfile
安装 Fluentd 的 Elasticsearch 插件。
FROM fluent/fluentd:v1.13-1
USER root
RUN gem install fluent-plugin-elasticsearch
资产/网页服务器/Docker构建文件
安装jwilder/dockerize,这是一个用于确认容器启动的工具。
FROM nginx:1.20.0-alpine
## プロキシサーバを使う場合
# ENV http_proxy="http://proxy.co.jp:8080"
# ENV https_proxy="http://proxy.co.jp:8080"
ENV DOCKERIZE_VERSION v0.6.1
RUN apk add --no-cache openssl \
&& wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz
PV/elasticsearch/config/elasticsearch.yml的翻译:
持久卷/ Elasticsearch / 配置 / elasticsearch.yml
## 公式ドキュメント: https://www.elastic.co/guide/en/elasticsearch/reference/7.14/important-settings.htm
## 参考記事: http://www.tech-joy.work/article/a20180527115811.html
## ⬇️ 今回は Elasticsearch コンテナは 1個なので single-node と記述する.
## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html
discovery.type: "single-node"
## ⬇️ ヒープのみ使用しスワップは使わない.
## Dockerでの運用だとどうなるのか不明だが、true としている人が多いので定義をしてみる.
## swapoff -a を恒久設定しておく.
bootstrap.memory_lock: true
## ⬇️ クラスタ名. 目的に応じたクラスタ名が良いとはある.
cluster.name: "docker-cluster"
## ⬇️ どの NIC から待ち受けするかを定義する. 0.0.0.0 の場合は全ての NIC となる.
## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/modules-network.html
network.host: 0.0.0.0
## ⬇️ HTTP Client との通信用ポート. 指定が無ければ 9200-9300 のポートを使う.
## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/modules-network.html
http.port: 29200
## ⬇️ 「xpack.monitoring.enabled: true」は deprecated とある.
## 代わりに下記を使えば良いのだと思う.
## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/current/monitoring-settings.html
xpack.monitoring.collection.enabled: true
## ⬇️ watcher は通知に関する設定である.
## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/notification-settings.html
xpack.watcher.enabled: true
## ⬇️ インデックス削除のときに「*」による指定を認めない(true).
## [doc] https://www.elastic.co/guide/en/elasticsearch/reference/7.14/index-management-settings.html
action.destructive_requires_name: true
PV/Fluentd等/Fluent.conf
定义对来自24224端口的输入的行为
## ⬇️ 24224 ポートからの入力を待ち受ける
<source>
@type forward
port 24224
</source>
## ⬇️ docker-compose.yml にてタグを定義していたはずである
<match docker.myfld_nginx> #.......... フィルタ条件のタグを「docker.myfld_nginx」に絞ってしまう
@type forward
buffer_type file #.................................... ファイルバッファにする
buffer_path /fluentd/log/fluentd-nginx.*.buffer #..... バッファファイルの出力先
flush_interval 1s #................................... 1秒ごとにバッファをフラッシュする
<server>
name aggregate2
host fluentd2 #..................................... 転送先マシンの名前
port 34224 #........................................ 転送先のポート
</server>
</match>
PV/fluentd2/etc/fluent.conf 的污染物/流畅.conf
监视从34224端口的输入,并在匹配的标记下将其输出到标准输出。
<source>
@type forward
port 34224
</source>
<match docker.**>
@type stdout
</match>
PV/kibana/config/kibana.yml
永久卷/kibana/配置/kibana.yml
我尝试在docker-compose.yml中设置环境变量,但行为没有改变。
因此,我直接在配置文件中进行了设置。
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0"
server.port: "29601"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:29200" ]
请用汉语将以下内容进行同义改写,只需提供一种选项:
Please bring me a glass of water.
进行Docker镜像构建和容器启动。
$ cd qiita-efk.git
$ docker-compose build --no-cache
$ docker-compose up -d
4. 访问 Kibana.
等待大约4分钟,直到上述3个容器启动完成后,如果能够访问下面的URL并启动Kibana的Dev Tools,则表示一切正常。
・http://localhost:29601/app/dev_tools#/console can be paraphrased in Chinese as: “本地主机:29601/app/dev_tools#/控制台”
确认Nginx日志已经发送到Fluentd的34224端口。
对于Fluentd的行为进行确认,但是这里先记录下来。
5-1. 监控Fluentd 34224端口的标准输出。
$ docker-compose -f logs fluentd2
5-2. 通过 WEB-UI 访问 http://localhost:21337
请确认在上述5-1的控制台上是否输出了Nginx的访问日志。
以上
请提供参考书籍和网站。
hé .
https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html
https://qiita.com/suzuki_y/items/6365799485fa3973b916
https://qiita.com/sugikeitter/items/f3b2c57bf8bbdc47a8bc
https://github.com/sugikeitter/elasticsearch-kibana-docker/blob/master/docker-compose.yml
https://gitya107.hatenablog.com/entry/2018/06/15/170334
http://ittoo.jugem.jp/?eid=737
https://qiita.com/kaibadash@github/items/9cfb532696dc8711e408日本語検索を可能にするhttps://qiita.com/mserizawa/items/8335d39cacb87f12b678日本語検索を可能にするhttps://github.com/deviantony/docker-elkELK を構築するための docker-compose が公開されているhttps://dev.classmethod.jp/articles/es-01/index, document, type の説明が簡潔に RDMS に例えられていて良かったhttp://www.tech-joy.work/article/a20180527115811.html/etc/elasticsearch/elasticsearch.yml の記述例と説明ありhttps://qiita.com/Esfahan/items/3c07bfbb57c7098e95313台に Elasticsearch を導入した場合の手順ありhttps://stackoverflow.com/questions/52621299/date-is-not-appending-to-elasticsearch-index-name-while-using-td-agentfluent.conf で %Y%m%d 展開できない問題の対策であるhttps://wyukawa.hatenablog.com/entry/2019/07/03/162511Elasticsearch 7 からはタイプが無くなるので、fluent.conf での記述方法が記されている
以下是一种中国原生的转述方式: