Docker通過EFK(Elasticsearch + Fluentd + Kibana)查詢日誌

一、概述

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就可以解決這個問題。

我們會創建四個容器:

 

環境說明:

請安裝最新的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"
View Code

注意: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>
View Code

官方設置文檔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,暴露端口,其他服務器去發送即可,實際上還沒試過。

 

本文參考鏈接:

https://zhuanlan.zhihu.com/p/63105931

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章