EFK(6) - 使用 docker 包裝 Fluentd

Aggregator 與 Forwarder

使用 docker 建立 fluentd image

為了模擬需要的環境,我們來使用 docker 建立 fluentd image

參考fluent/fluentd-docker-image來製作個人化的 fluentd image

2.1 準備工作

建立 custom-fluentd 資料夾

1
mkdir custom-fluentd

建立 plugin 資料夾

1
2
cd custom-fluentd
mkdir plugins

下載 Dockerfile 範例

1
curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/Dockerfile.sample > Dockerfile

下載 fluent.conf 範例

1
curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/fluent.conf.erb > fluent.conf

2.2 製作 Fluentd Log Aggregator Image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM fluent/fluentd:onbuild
Luka <[email protected]>

USER root

RUN apk add --update --virtual .build-deps \
sudo build-base ruby-dev \

# cutomize following instruction as you wish
&& sudo -u fluent gem install \
fluent-plugin-secure-forward \

&& sudo -u fluent gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /var/cache/apk/* \
/home/fluent/.gem/ruby/2.3.0/cache/*.gem

USER fluent

EXPOSE 24284

因為我們需要輸出給 Elasticsearch Kibana 可以接收的格式,
所以需要安裝 elasticsearch plugin

在的下面fluent-plugin-secure-forward \加上 fluent-plugin-elasticsearch \ 變成:

1
2
3
4
# cutomize following instruction as you wish
&& sudo -u fluent gem install \
fluent-plugin-secure-forward \
fluent-plugin-elasticsearch \

Aggregator 與 Forwarder 不同之處會是 config 檔與 plugin 的安裝,因為 Forwarder 不負責過濾與輸出 log 格式,只負責運送 Log,以此觀念下我們來構建 Fluentd 的高可用架構。

編輯 fluntd.conf (官方 image 所設定路徑)
input 使用 forward 來接收從 Fowarder 傳過來的 log。
output 傳送到 elasticsearch。

1
2
3
4
5
6
7
8
9
10
11
12
# Input
<source>
@type forward
port 24224
</source>

# Output
<match fluentd.es.**>
@type elasticsearch
logstash_format true
flush_interval 1s # for testing
</match>

產生 docker image 的方法是到剛剛我們編輯好的 Docker File 資料夾底下(包含 config 檔案)輸入

1
docker build -t my-fluentd-aggregator:1.0 ./

編譯完成後即會有叫做 my-fluentd-aggregator 的 image 可以使用。

接著輸入 docker run -p 24224:24224 custom-fluentd 即可啟動 container,並 bind 至本機 24224 port 上。

2.3 製作 Fluentd Log Aggregator Image

Forwarder 也是如法炮製,差別在於 Dockerfile 不需加上 Elasticsearch Output 套件。

並修改 fluent.conf 檔:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# input

<source>
@type forward
port 24224
</source>

# forward to aggregator

<match fluentd.forwarder.**>
@type forward
send_timeout 10s
heartbeat_interval 1s
heartbeat_type tcp
# optional
recover_wait 10s
phi_threshold 16
hard_timeout 10s

buffer_type file
buffer_path ~/splashtop/EFK/buffer/
buffer_chunk_limit 8m
buffer_queue_limit 4096
flush_interval 5s
retry_wait 20s
<server>
# primary host
host xxx.xxx.xxx.xxx
port 25225
</server>
<server>
host 192.168.0.2
port 24224
standby
</server>
</match>

完成後輸入

1
docker build -t my-fluentd-forwarder:1.0 ./

編譯完成後即會有叫做 my-fluentd-forwarder 的 image 可以使用。

接著輸入 docker run -p 24225:24224 custom-fluentd 即可啟動 container,並 bind 至本機 24225 port 上。

使用 docker-compose 整合容器

可以使用 docker-compose 節省 build 的動作。
新增檔案 docker-compose.yml,輸入以下內容:

1
2
3
4
5
6
7
8
9
10
version: '1'
services:
forwarder:
build: ./fluentd-forwarder
ports:
- "24224:24224"
aggregator:
build: ./fluentd-aggregator
ports:
- "24225:24224"

輸入 docker-compose up 一次 build forwarder 和 aggregator 兩個 image,
並將容器跑起來。

實際運作

實際運作的時候只需將 fluent.conf 中的 ip 位置,改成真實 Server IP,即可開始運作。

評論