docker搭建EFK

1、概述

Elasticsearch是一個開源搜索引擎,以易用性着稱。kibana是一個圖形界面,能夠在上面條件檢索存儲在ElasticSearch裏數據,至關於提供了ES的可視化操做管理器。html

fluentd

fluentd是一個針對日誌的收集、處理、轉發系統。經過豐富的插件系統,能夠收集來自於各類系統或應用的日誌,轉化爲用戶指定的格式後,轉發到用戶所指定的日誌存儲系統之中。node

fluentd 經常被拿來和Logstash比較,咱們常說ELK,L就是這個agent。fluentd 是隨着Docker,GCP 和es一塊兒流行起來的agent。web

這篇文章裏歸納一下的話,有如下區別:docker

  • fluentd 比 logstash 更省資源;
  • 更輕量級的 fluent-bid 對應 filebeat,做爲部署在結點上的日誌收集器;
  • fluentd 有更多強大、開放的插件數量和社區。插件列表這一點值得多說,插件太多了,也很是靈活,規則也不復雜。
  • 基本的架構

    這裏主要解決的問題是日誌查詢,日誌來源是docker。咱們使用docker部署任務時,可使用docker logs -f <容器id>查看日誌,也能夠去/var/lib/docker/containers/<容器id>/<容器id>-json.log查看日誌文件。可是這都很難去作查詢,本文介紹的EFK就能夠解決這個問題。
  • 咱們會建立四個容器:json

  • httpd (發送日誌給EFK)
  • Fluentd
  • Elasticsearch
  • Kibana
  • 環境說明:

    請安裝最新的docker及docker-compose,老版本會有些問題。centos

    docker安裝,請參考連接:服務器

    https://www.cnblogs.com/xiao987334176/p/11771657.html網絡

    docker-compose安裝,請參考連接:架構

    https://www.cnblogs.com/xiao987334176/p/12377113.htmlcurl

    操做系統:centos 7.6

    配置:2核8g

    docker版本:19.03.6

    docker-compose版本:1.24.1

    本文使用一臺centos7.6服務器,來演示EFK。

    注意:內存至少在4g或者以上。

    咱們會建立四個容器:

  • 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或者以上。

  • 2、docker-compose運行EFK

  • 目錄結構

     建立一個空目錄

    mkdir -p /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
    RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri"]
    而後新建文件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

      啓動容器

      在後臺啓動,使用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              local27d56becedb8        efk_default         bridge              local1d5b4653e1df        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,暴露端口,其餘服務器去發送便可,實際上還沒試過。

相關文章
相關標籤/搜索