一、概述
Elasticsearch是一個開源搜索引擎,以易用性着稱。kibana是一個圖形界面,可以在上面條件檢索存儲在ElasticSearch里數據,相當於提供了ES的可視化操作管理器。
fluentd
fluentd是一個針對日志的收集、處理、轉發系統。通過豐富的插件系統,可以收集來自於各種系統或應用的日志,轉化為用戶指定的格式后,轉發到用戶所指定的日志存儲系統之中。
fluentd 常常被拿來和Logstash比較,我們常說ELK,L就是這個agent。fluentd 是隨着Docker,GCP 和es一起流行起來的agent。
這篇文章里概括一下的話,有以下區別:
- fluentd 比 logstash 更省資源;
- 更輕量級的 fluent-bid 對應 filebeat,作為部署在結點上的日志收集器;
- fluentd 有更多強大、開放的插件數量和社區。插件列表這一點值得多說,插件太多了,也非常靈活,規則也不復雜。
基本的架構
這里主要解決的問題是日志查詢,日志來源是docker。我們使用docker部署任務時,可以使用docker logs -f <容器id>
查看日志,也可以去/var/lib/docker/containers/<容器id>/<容器id>-json.log
查看日志文件。但是這都很難去做查詢,本文介紹的EFK就可以解決這個問題。
我們會創建四個容器:
- httpd (發送日志給EFK)
- Fluentd
- Elasticsearch
- Kibana
環境說明:
請安裝最新的docker及docker-compose,老版本會有些問題。
docker安裝,請參考鏈接:
https://www.cnblogs.com/xiao987334176/p/11771657.html
docker-compose安裝,請參考鏈接:
https://www.cnblogs.com/xiao987334176/p/12377113.html
操作系統:centos 7.6
配置:2核8g
docker版本:19.03.6
docker-compose版本:1.24.1
本文使用一台centos7.6服務器,來演示EFK。
注意:內存至少在4g或者以上。
二、docker-compose運行EFK
目錄結構
創建一個空目錄
mkdir /opt/efk/
目錄結構如下:
./ ├── docker-compose.yml └── fluentd ├── conf │ └── fluent.conf └── Dockerfile
docker-compose.yml

version: '2' services: web: image: httpd ports: - "1080:80" #避免和默認的80端口沖突 links: - fluentd logging: driver: "fluentd" options: fluentd-address: localhost:24224 tag: httpd.access fluentd: build: ./fluentd volumes: - ./fluentd/conf:/fluentd/etc links: - "elasticsearch" ports: - "24224:24224" - "24224:24224/udp" elasticsearch: image: elasticsearch:7.6.0 environment: - discovery.type=single-node expose: - 9200 ports: - "9200:9200" kibana: image: kibana:7.6.0 links: - "elasticsearch" ports: - "5601:5601"
注意:elasticsearch 7.6.0要使用單機模式,必須傳入環境變量discovery.type=single-node
所有web
里的日志會自動發送到fluentd-address: localhost:24224
,也就是fluentd
容器。
Elasticsearch 和 Kibana是目前最新的版本7.6.0,如果想要選擇更新的,可以去這里查看
Elasticsearch image tags in DockerHub
Kibana image tags in DockerHub
Fluentd的配置和插件
新建文件fluentd/Dockerfile
,使用官方鏡像Fluentd’s official Docker image,安裝需要的插件
# fluentd/Dockerfile FROM fluent/fluentd:v0.12-debian RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.7"]
然后新建文件fluentd/conf/fluent.conf
,編寫Fluentd的配置文件

<source> @type forward port 24224 bind 0.0.0.0 </source> <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 1s </store> <store> @type stdout </store> </match>
官方設置文檔config-file
修改/etc/sysctl.conf
此參數一定要改,否則Elasticsearch 無法啟動
vm.max_map_count = 2621440
加載配置
sysctl -p
啟動容器
在后台啟動,使用docker-compose up -d
# docker-compose up -d Starting efk_elasticsearch_1 ... done Starting efk_fluentd_1 ... done Starting efk_kibana_1 ... done Starting efk_web_1 ... done
查看所有容器
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d82b1a16c970 httpd "httpd-foreground" 21 hours ago Up 51 minutes 0.0.0.0:1080->80/tcp efk_web_1 1085be0f9c6e efk_fluentd "tini -- /bin/entryp…" 21 hours ago Up 51 minutes 5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp efk_fluentd_1 3e837917f4cf kibana:7.6.0 "/usr/local/bin/kiba…" 21 hours ago Up 51 minutes 0.0.0.0:5601->5601/tcp efk_kibana_1 3d860ca7e0db elasticsearch:7.6.0 "/usr/local/bin/dock…" 21 hours ago Up 51 minutes 0.0.0.0:9200->9200/tcp, 9300/tcp efk_elasticsearch_1
產生日志
使用curl執行3遍
curl http://localhost:1080/ curl http://localhost:1080/ curl http://localhost:1080/
查看日志
打開http://localhost:5601
,提示需要先建索引,輸入fluentd-*
刷新即可
選擇時間戳
去Discover
頁面,然后就可以看到之前的日志了。
如何接入其他docker日志
這里是以docker-compose形式啟動的一個服務,如果還有別的任務需要將日志發送到fluentd
,需要這幾個步驟。
默認情況下,docker-compose會為我們的應用創建一個網絡,服務的每個容器都會加入該網絡中。這樣,容器就可被該網絡中的其他容器訪問,不僅如此,該容器還能以服務名稱作為hostname被其他容器訪問。
所以我們首先需要找到我們現在創建的EFK的網絡名,
# docker network ls NETWORK ID NAME DRIVER SCOPE afa576d45dff bridge bridge local 27d56becedb8 efk_default bridge local 1d5b4653e1df host host local 901f8a349049 none null local
我是在efk目錄下創建的docker-compose.yml文件,所以這里默認的名字就是efk_default。
再看看之前web的設置
web: image: httpd ports: - "1080:80" #避免和默認的80端口沖突 links: - fluentd logging: driver: "fluentd" options: fluentd-address: localhost:24224 tag: httpd.access
有幾個關鍵設置是:links和logging,link 用於容器直接的互通,logging則是日志的輸出設置。
那我們這里再啟動一個新docker需要這些設置
docker run \ --link efk_fluentd_1 \ --net efk_default \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag=httpd.access \ -d hello-world
我們去kibana看看,果然,日志已經發送到kibana了。
搜索hello
如果是其他機器,需要指定fluentd ip,比如:
docker run \ --log-driver=fluentd \ --log-opt fluentd-address=172.19.155.138:24224 \ --log-opt tag=httpd.access \ -d hello-world
最后想要做的就是如何在一台服務器上搜集所有的日志,理論上來說,只需要一台服務器部署上EFK,暴露端口,其他服務器去發送即可,實際上還沒試過。
本文參考鏈接: