ELK 筆記 – 1 – 以 Docker Container 建構一組 ELK(Elasticsearch、Logstash、Kibana)

前言

本篇試玩筆記選定 ELK Open Source 的 6.3.2 版。

這是由於本研究是要模擬一套現有的 ELK,該 ELK 的 Elasticsearch 跟 Kibana 使用 Aws 現成服務,版本為 6.3.2,因此才是這個版本。

這邊提醒 – 若要自行建構 ELK 的人,應注意不同版本的差異,例如:

  1. 有些在 6.x 版只能由 YAML 設定的功能,到 7.x 版已經可以用環境變數,在 create container 時指派。
  2. Open Source 版本沒有 x-pack 相關功能
  3. Aws 上跑的 Elasticsearch 是 Open Source 版本
    • Aws 現將 Elasticsearch 歸在他的 Open Search 下,可以選核心為 Elasticsearch 或 Aws 自己開發的 Opensearch

今日正題

參考資料

  1. ELK學習筆記(1):安裝ElasticSearch、Logstash、Kibana
  2. Elastic stack(安裝篇 via Docker)

Elasticsearch Container 範例

$ docker pull docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2
$ docker run -d -p 9200:9200 \
 -p 9300:9300 \
 -e "discovery.type=single-node" \
 --name es_local_oss_632 \
 docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2  

Kibana Container 範例

$ docker pull docker.elastic.co/kibana/kibana-oss:6.3.2
$ docker run \
 -d \
 -p 5601:5601 \
--volume="/path_to_your_kinana_yaml/kibana-oss-632.yml:/usr/share/kibana/config/kibana.yml" \
 --name kb_local_oss_632 \
 docker.elastic.co/kibana/kibana-oss:6.3.2
  • 這邊用 Volume 把外部的 YAML 設定接進去,目的是設定 Elasticsearch 的 Host,更多詳情可參考 Kibana 6.8 文件,YAML 範例請參考下面『Kibana YAML 範例』
  • 如果你使用 Kibana 7.x,可以改用環境變數設定 Elasticsearch 的 Host,請參考 Kibana 7.15 文件

Kibana YAML 範例

server.name: kibana
server.host: "0"
elasticsearch.url: http://host.docker.internal:9200
  • 注意這裡因為 Elasticsearch 也是用 Docker Container 跑,所以連接的 Host Url 不是 localhost。
  • 這邊是直接透過 Host 來讓 Container 之間彼此做存取,所以是連接到 host.docker.internal 的 9200 Port,如果你熟悉 container 的建立,也可以用 link 或者 network 的方式使 container 之間互相可以存取。

Logstash Container 範例

$ docker pull docker.elastic.co/logstash/logstash-oss:6.3.2
$ docker run -d \
 -p 5055:5055 -p 9600:9600  \
 --name lg_local_oss632 \
 -v /path_to_your_conf/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
 docker.elastic.co/logstash/logstash-oss:6.3.2
  • 這裏透過 Volume 把外部的 config 設定接進去,範例請參考下方 『Logstash pipeline config』。
  • Config 主要是訂定 Logstash 的 pipeline,最基本的是 input 跟 output,請參考下方範例。
  • 這邊的 port 使用 5055,這定於 config ,請參考下方設定的 input 部分。

Logstash pipeline config

input {
    tcp {
        port => 5055
        codec => plain {
            charset => "UTF-8"
        }
    }
}
output {
    elasticsearch {
        hosts => "http://host.docker.internal:9200"
    }
}
  • input 這邊是定為聆聽本機 tcp 5055 port。
  • 這裏 elasticsearch 的 host ,沒寫 https 的話,預設會以 http 連接,所以若為 https ,記得一定要寫上 https:// 開頭。
  • 這邊只是跑起 Logstash 最基本的 Config,更多 pipeline config 可參考文件,也可以參考這篇鐵人賽的文章。

Logstash 連接檢測

ELK 都跑起來後,可以做兩個檢測:

1. 以 docker log 查看 ELK 的開機訊息,確認啟動情形

$ docker logs -f [Container 名稱]

以 Logstash 來說,應該要看到類似這樣的訊息出現,代表成功啟動。

[2021-09-30T08:16:10,489][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}

Logstash 啟動失敗範例,連接到 Elasticsearch 失敗

[2021-09-30T08:39:54,189][WARN ][logstash.outputs.elasticsearch] Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"http://host.docker.internal:9200", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError, :error=>"Got response code '400' contacting Elasticsearch at URL 'http://host.docker.internal:9200'"}
[2021-09-30T08:39:59,191][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://host.docker.internal:9200, :path=>"/"}

2. 用 netcat 發訊息給 Logstash,看看是否成功轉送到 Kibana

2.1 用 nc 指令發訊息

指令範例如下

$ nc localhost 5055
test init message
  • 打完 nc localhost 5055 後按 Enter,這時候已經跟 Logstash 連上,進入互動式的發訊狀態。
  • 再打上 test init message ,之後按 Enter,訊息就發出去了,理論上, Logstash 就會收到這段文字,然後把它存到 Elasticsearch 上。
  • 結束按 Ctrl + c 即可。
  • 這邊範例是假設 ELK 都跑在 localhost 上,所以指令寫 nc localhost ,假設你是從別台機器連,就自己替換 IP 即可。
2.2 打一下 Elasticsearch API

看看有沒有新的 Index 出現,名稱格式是 logstash-*,有的話就是成功了。如下範例

$ curl http://localhost:9200/_cat/indices
green open logstash-2021.11.20 EuaKzopvWcsDqovYamwzMk  5  1  2  0 22kb  11kb

新增 Kibana Index Pattern

要新增 logstash-* 的 pattern。

方法一 打 Kibana API

curl -XPOST -D- "http://localhost:5601/api/saved_objects/index-pattern" \
    -H "Content-Type: application/json" \
    -H "kbn-version: 6.3.2" \
    -d "{'attributes':{'title':'logstash-*','timeFieldName':'@timestamp'}}"

方法二 由 Kibana 圖形介面操作

1. 左側選單 Management -> 點擊 Index Patterns

2. 進入 Create Index Pattern 步驟的 Step 1,在輸入框輸入 logstash-*,並且應該要看到如下畫面中的『Success! Your index pattern match 1 index.』,之後按下 Next Step 按鈕。

3. 進入 Step 2,在此步的下拉選單,選 @timestamp

4. 按 Create Index Pattern,完成!

5. 之後就可以到 Kibana 的 Discover 這邊,點選 logstash-* 這個 pattern 查看相關資訊。如下圖,並且可以看到藍色箭頭所指,就是剛剛發的訊息,被存在 message 欄位。

其他參考資訊

Elasticsearch License 相關議題參考資訊

這裡有一篇很好的參考資料,建議詳加閱讀

  1. 如果你會拿 ELK 去二次開發功能,你只能用 Open Source 版(名稱後面有 -OSS 的,裡面沒有 x-pack 相關功能)
  2. 如果你是使用 AWS 的 Elasticsearch 服務(現在改名 Open Search),那個是 Open Source 版。

提醒: 授權的分級、模式有可能會持續變動,這邊的資訊隨著時間推移也很可能變成錯的,請在使用前自行確認您的情境是否符合 Elastic 相關的授權範圍。

如果你想再多看點熱鬧,例如 Elastic 跟 Amazon 在 Elasticsearch 這塊的戰鬥

  1. Open Source 的商業模式?Elasticsearch 是不是要開始收費了?從 Elastic 與 Amazon 對 Elasticsearch 的開源授權爭議談起
  2. Elastic更新自家授權,推出更簡單寬鬆的ELv2

You Might Also Like

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料