1. 程式人生 > >ELK搭建(docker環境)

ELK搭建(docker環境)

ELK是Elasticsearch、Logstash、Kibana的簡稱,這三者是核心套件,但並非全部。

Elasticsearch是實時全文搜尋和分析引擎,提供蒐集、分析、儲存資料三大功能;是一套開放REST和JAVA API等結構提供高效搜尋功能,可擴充套件的分散式系統。它構建於Apache Lucene搜尋引擎庫之上。

Logstash是一個用來蒐集、分析、過濾日誌的工具。它支援幾乎任何型別的日誌,包括系統日誌、錯誤日誌和自定義應用程式日誌。它可以從許多來源接收日誌,這些來源包括 syslog、訊息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出資料,包括電子郵件、websockets和Elasticsearch。

Kibana是一個基於Web的圖形介面,用於搜尋、分析和視覺化儲存在 Elasticsearch指標中的日誌資料。它利用Elasticsearch的REST介面來檢索資料,不僅允許使用者建立他們自己的資料的定製儀表板檢視,還允許他們以特殊的方式查詢和過濾資料

一、參考資料

  • 官網地址
  • http://mirrors.aliyun.com/centos
  • https://github.com/medcl/elasticsearch-analysis-ik/releases
  • https://www.cnblogs.com/William-Guozi/p/elk-docker.html
  • https://www.cnblogs.com/peterpoker/p/9573720.html
  • https://www.cnblogs.com/just-coder/p/11017050.html

二、下載相關的docker映象

docker pull elasticsearch:7.6.0
docker pull kibana:7.6.0
docker pull logstash:7.6.0
docker pull filebeat:7.6.0
docker pull mobz/elasticsearch‐head:5

三、搭建ELK日誌系統

建立一個elk資料夾, 後面的配置檔案都放在裡面

mkdir /home/elk

3.1 安裝elasticsearch

建立一個elasticsearch.yml

檔案

vi /home/elk/elasticsearch.yml

在裡面新增如下配置:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
# 訪問ID限定,0.0.0.0為不限制,生產環境請設定為固定IP
transport.host: 0.0.0.0
# elasticsearch節點名稱
node.name: node-1
# elasticsearch節點資訊
cluster.initial_master_nodes: ["node-1"]
# 下面的配置是關閉跨域驗證
http.cors.enabled: true
http.cors.allow-origin: "*"

建立並啟動elasticsearch容器

docker run -di -p 9200:9200 -p 9300:9300 --name=elasticsearch -v /home/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.6.0

之後通過9200埠在瀏覽器上範圍,有資訊返回則成功

注意:如果需要新增外掛將容器的外掛目錄對映到實際的路徑中或者通過命令(如安裝ik分詞器:docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/)將其拷貝到容器中

可能遇到的問題

1.啟動成功後,過了一會就停止

這與我們剛才修改的配置有關,因為elasticsearch在啟動的時候會進行一些檢查,比如最多開啟的檔案的個數以及虛擬記憶體
區域數量等等,如果你放開了此配置,意味著需要開啟更多的檔案以及虛擬記憶體,所以我們還需要系統調優。

  • 修改/etc/security/limits.conf ,新增如下內容:

      * soft nofile 65536
      * hard nofile 65536

nofile是單個程序允許開啟的最大檔案個數 soft nofile 是軟限制 hard nofile是硬限制

  • 修改/etc/sysctl.conf,追加內容

      vm.max_map_count=655360

    限制一個程序可以擁有的VMA(虛擬記憶體區域)的數量

執行下面命令 修改核心引數馬上生效,之後重啟伺服器和docker服務

sysctl ‐p
2. 啟動失敗顯示如下日誌資訊
ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

這個是由於elasticsearch7是叢集多節點的版本,需要在elasticsearch.yml中新增如下配置:

# elasticsearch節點名稱
node.name: node-1
# elasticsearch節點資訊
cluster.initial_master_nodes: ["node-1"]
3. 外網上已經可以通過9200埠推送資料和查詢資料,但是後面安裝的kibana等元件卻無法連

檢視日誌發現如下錯誤

error=>"Elasticsearch Unreachable: [http://192.168.6.128:9200/][Manticore::...

這個問題通常是由於安裝在一臺機器上的docker容器,防火牆開啟的狀態下,docker容器內部無法訪問宿主機服務(能夠訪問非宿主機的其他區域網計算機的服務),解決方法:

    1. 配置防火牆規則firewall-cmd --zone=public --add-port={port}/tcp --permanent,並重載防火牆規則firewall-cmd --reload
    1. 啟動容器時使用--net host模式(docker的4種網路模式:https://www.jianshu.com/p/22a7032bb7bd)
    1. 關閉防火牆

安裝elasticsearch‐head外掛做除錯使用(可以不安裝)

docker run ‐di ‐‐name=es-head ‐p 9100:9100 mobz/elasticsearch‐head:5

啟動成功後訪問9100埠即可使用介面化進行管理elasticsearch。

在本地電腦上安裝
  1. 下載head外掛:https://github.com/mobz/elasticsearch-head
  2. 將grunt安裝為全域性命令 。Grunt是基於Node.js的專案構建工具。它可以自動執行你所 設定的任務

    npm install ‐g grunt‐cli
  3. 安裝依賴

     npm install
  4. 啟動

     grunt server

    開啟瀏覽器,輸入 http://localhost:9100

3.2 安裝kibana

kibana主要用於對elasticsearch的資料進行分析檢視。注意選擇的版本必須和elasticsearch的版本相同或者低,建議和elasticsearch的版本相同,否則會無法將無法使用kibana。

建立一個kibana.yml配置檔案,在裡面編寫如下配置:

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch的IP:9200"]
# 操作介面語言設定
i18n.locale: "zh-CN"

建立並啟動kibana容器

docker run -di --name kibana -p 5601:5601 -v /home/elk/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.6.0

啟動成功後訪問5601埠即可進入kibana管理介面。(進入後要求選擇配置,直接選擇自己瀏覽即可)

新增索引配置

這個先安裝logstash後再回過來操作;輸入log*即可選擇logstash的日誌資訊,建立成功後即可檢視日誌資訊

3.3 安裝logstash

建立一個logstash.conf配置檔案,在裡面新增如下配置:

input {
    tcp {
        port => 5044
        codec => "plain"
    }
}
filter{

}
output {
    # 這個是logstash的控制檯列印(進行安裝除錯的開啟,稍後成功後去掉這個配置即可)
    stdout {
        codec => rubydebug
    }
    # elasticsearch配置
    elasticsearch {
        hosts => ["elasticsearch的IP:9200"]
    }
}

建立和啟動logstash容器

docker run -di -p 5044:5044 -v /home/elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --name logstash logstash:7.6.0

將微服務的日誌推送到logstash中

新增maven依賴

    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>6.3</version>
    </dependency>

下面以springboot中logback作為日誌處理,配置檔案(logback-spring.xml)配置資訊如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制檯輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
        </layout>
    </appender>
    <!--logback輸出-->
    <appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.6.128:5044</destination>
        <includeCallerData>true</includeCallerData>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <includeCallerData>true</includeCallerData>
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80}.%M.%L - %msg %n</pattern>
            </providers>
        </encoder>
    </appender>

    <root level="INFO">
        <!--本地開發除錯將控制檯輸出開啟,同時將日誌檔案輸出關閉,提高日誌效能;線上部署請務必將控制檯輸出關閉-->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="STASH"/>
    </root>
</configuration>