ELK 筆記 – 1 – 以 Docker Container 建構一組 ELK(Elasticsearch、Logstash、Kibana)
前言
本篇試玩筆記選定 ELK Open Source 的 6.3.2 版。
這是由於本研究是要模擬一套現有的 ELK,該 ELK 的 Elasticsearch 跟 Kibana 使用 Aws 現成服務,版本為 6.3.2,因此才是這個版本。
這邊提醒 – 若要自行建構 ELK 的人,應注意不同版本的差異,例如:
- 有些在 6.x 版只能由 YAML 設定的功能,到 7.x 版已經可以用環境變數,在 create container 時指派。
- Open Source 版本沒有 x-pack 相關功能
- Aws 上跑的 Elasticsearch 是 Open Source 版本
- Aws 現將 Elasticsearch 歸在他的 Open Search 下,可以選核心為 Elasticsearch 或 Aws 自己開發的 Opensearch
今日正題
參考資料
Elasticsearch Container 範例
- 注意這邊的 discovery.type=single-node,代表不要 Cluster 的模式,如果要 Cluster 模式可以參考文件 Install Elasticsearch with Docker
$ 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 相關議題參考資訊
這裡有一篇很好的參考資料,建議詳加閱讀
- 如果你會拿 ELK 去二次開發功能,你只能用 Open Source 版(名稱後面有 -OSS 的,裡面沒有 x-pack 相關功能)
- 如果你是使用 AWS 的 Elasticsearch 服務(現在改名 Open Search),那個是 Open Source 版。
提醒: 授權的分級、模式有可能會持續變動,這邊的資訊隨著時間推移也很可能變成錯的,請在使用前自行確認您的情境是否符合 Elastic 相關的授權範圍。
Leave a Reply