ติดตั้ง EFK Stack บน Ubuntu 18.04 LTS

วันนี้จะมาทำขั้นตอนการติดตั้ง EFK Stack บน Ubuntu 18.04 LTS Bionic ครับสิ่งที่ต้องเตรียมกันก่อนใน Lab ของผมวันนี้นะครับ เครื่องเซิฟเวอร์ 4 เครื่องดังนี้

  1. สำหรับติดตั้ง Elastic Search
  2. สำหรับติดตั้ง Fluentd
  3. สำหรับติดตั้ง Kibana
  4. สำหรับติดตั้ง Fluent-bit เพื่อทำตัวเป็น Log Forwarder
โดยขั้นตอนการติดตั้งผมจะทำเป็น Syntax Highlight อาจจะเป็นแบบยาว ๆ พิมพ์คำสั่งไปด้วยอธิบายไปด้วยนะครับ เริ่มกันเลยครับที่เครื่องเซิฟเวอร์ทุกเครื่องให้อัพเดท repository ให้เป็นรุ่นล่าสุด


Update repository ให้เรียบร้อย
sudo apt -y update && sudo apt -y upgrade && sudo -y dist-upgrade
sudo apt autoremove -y
...
ที่เครื่อง elasticsearch ให้ติดตั้ง Java ให้เรียบร้อยโดยพิมพ์
ติดตั้ง Java 8 ลงบนเครื่อง
sudo apt-get install -y apt-transport-https openjdk-8-jre-headless uuid-runtime pwgen vim
...

จากนั้นให้ download และติดตั้ง elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.1.deb

จากนั้นให้ติดตั้งโดยพิมพ์
dpkg -i elasticsearch-6.6.1.deb
(Reading database ... 102890 files and directories currently installed.)
Preparing to unpack elasticsearch-6.6.1.deb ...
/usr/bin/java
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Unpacking elasticsearch (6.6.1) ...
Setting up elasticsearch (6.6.1) ...
Created elasticsearch keystore in /etc/elasticsearch
Processing triggers for systemd (237-3ubuntu10.13) ...
Processing triggers for ureadahead (0.100.0-20) ...
...

หลังจากติดตั้งเสร็จก็ตั้งค่าให้กับ elasticsearch ครับ
พิมพ์ sudo vim /etc/elasticsearch/elasticsearch.yml
ให้แก้ไขที่บรรทัดที่ 55 กับ 59 เป็นหมายเลข IP กับหมายเลข Port ที่ต้องการเปิดให้บริการ
 55 network.host: 192.168.33.4
 56 #
 57 # Set a custom port for HTTP:
 58 #
 59 http.port: 9200
จากนั้นเซฟแล้วออกจากโปรแกรม แล้วพิมพ์คำสั่ง
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
sudo systemctl status elasticsearch.service

จะได้ผลลัพธ์แบบนี้
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-02-25 08:34:23 UTC; 6s ago
     Docs: http://www.elastic.co
 Main PID: 20404 (java)
    Tasks: 17 (limit: 2319)
   CGroup: /system.slice/elasticsearch.service
           ├─20404 /usr/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Des.n
           └─20492 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

Feb 25 08:34:23 ISO-EFK-Stack-E systemd[1]: Started Elasticsearch.
...

จากนั้นให้ไปต่อที่เครื่องที่เป็น Kibana แล้วดำเนินการติดตั้ง Kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.6.1-amd64.deb
dpkg -i kibana-6.6.1-amd64.deb
Selecting previously unselected package kibana.
(Reading database ... 102393 files and directories currently installed.)
Preparing to unpack kibana-6.6.1-amd64.deb ...
Unpacking kibana (6.6.1) ...
Setting up kibana (6.6.1) ...
Processing triggers for systemd (237-3ubuntu10.13) ...
Processing triggers for ureadahead (0.100.0-20) ...
...

จากนั้นให้เข้าไปตั้งค่าให้ Kibana เชื่อมกับ elasticsearch โดยให้ดำเนินการตามนี้
พิมพ์ sudo vim /etc/kibana/kibana.yml
ที่บรรทัดด้านล่างให้ตั้งค่าหมายเลข IP และหมายเลข Port รวมถึงดำเนินการเชื่อมต่อกับ elasticsearch โดยใส่หมายเลข IP และหมายเลข Port ของเครื่องที่เราติดตั้ง elasticsearch ไว้ก่อนหน้านี้ลงไปด้วยครับ
 2 server.port: 5601
 7 server.host: "192.168.33.5"
 28 elasticsearch.hosts: ["http://192.168.33.4:9200"]
เซฟแล้วออกจากโปรแกรมแล้วพิมพ์
sudo systemctl enable kibana.service
sudo systemctl start kibana.service
sudo systemctl status kibana.service

จะได้ผลลัพธ์แบบนี้
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-02-25 08:45:23 UTC; 13s ago
 Main PID: 17801 (node)
    Tasks: 11 (limit: 2319)
   CGroup: /system.slice/kibana.service
           └─17801 /usr/share/kibana/bin/../node/bin/node --no-warnings --max-http-header-size=65536 /usr/share/kibana/bin/../src/cli -c /etc/kibana/k

Feb 25 08:45:23 ISO-EFK-Stack-K systemd[1]: Started Kibana.
...

ทดลองเข้าหน้า Kibana ผ่านทาง Web browser โดยเปิดโปรแกรม web browser ขึ้นมาแล้วพิมพ์หมายเลข IP:port ครับถ้าทำถูกต้องจะได้ผลลัพธ์ดังนี้ครับ


ให้คลิกที่ Explore on my own เนื่องจากเราจะนำเข้า Data มาเองนะครับเสร็จแล้วจะพบกับหน้า welcome ดังภาพด้านล่างครับ


จากนั้นเราจะไปติดตั้ง Fluentd กันครับไปที่เครื่อง Fluentd

curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-bionic-td-agent3.sh | sh
...
Get:1 http://packages.treasuredata.com/3/ubuntu/bionic bionic/contrib amd64 td-agent amd64 3.3.0-1 [47.9 MB]
Fetched 47.9 MB in 7s (7,149 kB/s)
Selecting previously unselected package td-agent.
(Reading database ... 102393 files and directories currently installed.)
Preparing to unpack .../td-agent_3.3.0-1_amd64.deb ...
Unpacking td-agent (3.3.0-1) ...
Setting up td-agent (3.3.0-1) ...
Adding system user `td-agent' (UID 111) ...
Adding new group `td-agent' (GID 113) ...
Adding new user `td-agent' (UID 111) with group `td-agent' ...
Creating home directory `/var/lib/td-agent' ...
Installing default conffile /etc/td-agent/td-agent.conf ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...

Installation completed. Happy Logging!
...

เสร็จสิ้นการติดตั้ง Fluentd เราจะมาตั้งค่า Fluentd ให้เปิดช่องทางสำหรับรอรับ Log จากเครื่อง Agent กันครับ
***เนื่องจากตัว Syntax highlighter ของผมทำงานไม่น่ารักเท่าไรบรรทัดที่เป็น apache.** ให้จบแค่ตรงส่วนนี้นะครับไอ้ ="" ไม่เกี่ยวนะครับ

ที่เครื่อง Fluentd พิมพ์
sudo vim /etc/td-agent/td-agent.conf

ที่ประมาณบรรทัดที่ 37-38 จะเป็นส่วนของการตั้งค่าการรับ log (จริง ๆ จะพิมพ์ตรงไหนก็ได้แต่ถ้าทำให้เป็นกลุ่มชัดเจนจะสะดวกเวลาเกิดปัญหาครับ) ให้เขียนเพิ่มดังนี้
 38 
 39   @type forward
 40   port 5140
 41   bind 0.0.0.0
 42 
 43
 44 
 45   @type elasticsearch
 46   host 192.168.33.4
 47   port 9200
 48   logstash_format true
 49 

เซฟแล้วออกจากโปรแกรม แล้วสั่งให้มันทำงานด้วยการพิมพ์
sudo systemctl enable td-agent.service
sudo systemctl start td-agent.service
sudo systemctl status td-agent.service

จะได้ผลลัพธ์แบบนี้
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/lib/systemd/system/td-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-02-25 08:16:02 UTC; 51min ago
     Docs: https://docs.treasuredata.com/articles/td-agent
 Main PID: 18137 (fluentd)
    Tasks: 11 (limit: 2319)
   CGroup: /system.slice/td-agent.service
           ├─18137 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/
           └─18145 /opt/td-agent/embedded/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --d

Feb 25 08:16:02 ISO-EFK-Stack-F systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
Feb 25 08:16:02 ISO-EFK-Stack-F systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.
...

หลังจากนั้นเราต้องทำการติดตั้ง plugin ของ fluentd เพื่อให้สามารถเชื่อมต่อไปยัง elasticsearch ได้โดยพิมพ์
sudo gem install msgpack
sudo gem install fluent-plugin-elasticsearch

จะได้ผลลัพธ์ดังนี้
Parsing documentation for multipart-post-2.0.0
Installing ri documentation for multipart-post-2.0.0
Parsing documentation for faraday-0.15.4
Installing ri documentation for faraday-0.15.4
Parsing documentation for elasticsearch-transport-6.1.0
Installing ri documentation for elasticsearch-transport-6.1.0
Parsing documentation for elasticsearch-api-6.1.0
Installing ri documentation for elasticsearch-api-6.1.0
Parsing documentation for elasticsearch-6.1.0
Installing ri documentation for elasticsearch-6.1.0
Parsing documentation for fluent-plugin-elasticsearch-3.2.3
Installing ri documentation for fluent-plugin-elasticsearch-3.2.3
Done installing documentation for yajl-ruby, cool.io, sigdump, serverengine, http_parser.rb, thread_safe, tzinfo, tzinfo-data, strptime, dig_rb, fluentd, excon, multi_json, multipart-post, faraday, elasticsearch-transport, elasticsearch-api, elasticsearch, fluent-plugin-elasticsearch after 10 seconds
19 gems installed
...

เสร็จแล้วให้ restart service หนึ่งครั้งโดยพิมพ์
sudo systemctl restart td-agent.service

แล้วตรวจดูว่า service ทำงานตามที่เราตั้งค่าแล้วหรือไม่โดยพิมพ์
netstat -anupl | grep 5140
udp        0      0 0.0.0.0:5140            0.0.0.0:*                           21461/ruby
ถ้าได้ผลลัพธ์ตามนี้ถือว่าเสร็จครับ

คราวนี้เราจะไปติดตั้ง Agent ให้ทำการ forward log มาที่เครื่อง Fluentd นะครับ
ที่เครื่องเซิฟเวอร์ที่เราต้องการส่ง log มาให้ Fluentd Server พิมพ์
wget -qO - https://packages.fluentbit.io/fluentbit.key | sudo apt-key add -

sudo vim /etc/apt/sources.list
ให้ไปที่บรรทัดสุดท้ายแล้วทำการเพิ่ม repository ของ fluent-bit เข้าไป
deb https://packages.fluentbit.io/ubuntu/bionic bionic main

เซฟแล้วออกจากโปรแกรมแล้วดำเนินการอัพเดท repository อีกครั้ง

sudo apt -y update && sudo apt -y upgrade
sudo apt install -y td-agent-bit

จะได้ผลลัพธ์ตามนี้
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  td-agent-bit
0 upgraded, 1 newly installed, 0 to remove and 34 not upgraded.
Need to get 1,865 kB of archives.
After this operation, 11.6 MB of additional disk space will be used.
Get:1 https://packages.fluentbit.io/ubuntu/bionic bionic/main amd64 td-agent-bit amd64 1.0.4 [1,865 kB]
Fetched 1,865 kB in 2s (805 kB/s)
Selecting previously unselected package td-agent-bit.
(Reading database ... 108636 files and directories currently installed.)
Preparing to unpack .../td-agent-bit_1.0.4_amd64.deb ...
Unpacking td-agent-bit (1.0.4) ...
Setting up td-agent-bit (1.0.4) ...
...

จากนั้นให้เข้าไปตั้งค่าของ fluent-bit โดยให้พิมพ์
sudo vim /etc/td-agent-bit/td-agent-bit.conf

ค้นหาบรรทัด [INPUT] แล้วแก้ค่าข้างในตามนี้
[INPUT]
    Name tail
    Path /var/log/apache2/access.log
    Tag  apache.*
    Parser apache

จากนั้นให้เพิ่ม
[FILTER]
    Name record_modifier
    Match *
    Record host_param ${HOSTNAME}
แล้วมองหาบรรทัด [OUTPUT] แล้วแก้หมายเลข IP ใหม่
[OUTPUT]
    Name  forward
    Match *
    Host 192.168.33.6
    Port 5142

จากนั้นเซฟแล้วออกจากโปรแกรม
ทำการสั่งให้โปรแกรมทำงานพร้อมกับระบบโดยพิมพ์

sudo systemctl enable td-agent-bit.service
sudo systemctl start td-agent-bit.service
sudo systemctl status td-agent-bit.service

จะได้ผลลัพธ์ดังนี้
● td-agent-bit.service - TD Agent Bit
   Loaded: loaded (/lib/systemd/system/td-agent-bit.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-02-25 16:49:08 +07; 5s ago
 Main PID: 24049 (td-agent-bit)
    Tasks: 2 (limit: 2319)
   CGroup: /system.slice/td-agent-bit.service
           └─24049 /opt/td-agent-bit/bin/td-agent-bit -c //etc/td-agent-bit/td-agent-bit.conf

...

เป็นอันเสร็จพิธีในการติดตั้งและส่ง Log มานะครับเบื้องต้นผมทำการตั้งค่าให้ Agent ทำการไปอ่าน Apache log แล้วทำการส่งมาที่ Fluentd Server แล้วตัว Fluentd Server ก็จะทำการ forward log ต่อไปให้ elasticsearch ในรูปแบบของ logstash format นะครับทีนี้เราจะมาดู log กันนะครับว่าส่งมาถึงจริงรึเปล่าให้กลับไปที่โปรแกรม web browser ที่ได้ทดลองเปิด Kibana ที่เราลงไว้ก่อนหน้านี้ครับแล้วไปที่ Management คลิก Index Patterns ดังภาพครับ


ให้คลิกที่ Create index pattern ที่ช่อง text box ให้พิมพ์ logstash* ลงไปแล้วสังเกตว่ามันจะตรงกับชื่อของ index ที่เรามีอยุ่ซึ่ง index ตรงนี้ถูกส่งมาจากเครื่อง Fluentd Server นั่นเอง แล้วคลิก Next Step


เราจากนั้นให้คลิกที่ drop down list แล้วเลือก @timestamp เพื่อให้ใช้ฟิลด์ timestamp เป็นฟิลด์หลักในการแสดงผล เสร็จแล้วคลิก Create index pattern


จากนั้นเราจะเห็นผลลัพธ์ดังภาพด้านล่างเป็นอันเสร็จขั้นตอนการสร้าง index pattern


ให้ไปที่ discover ก็จะเห็นผลลัพธ์จากการที่เราส่ง log มาแล้ว


ถ้าใครไม่เห็นให้คลิกที่คำว่า logstash* ตามที่เราได้สร้างไว้ครับแล้วจะเห็น log ที่ส่งมาครับ

ถ้าทำได้ทั้งหมดตามนี้ถือเสร็จสิ้นขั้นตอนการติดตั้ง EFK Stack เรียบร้อยแล้วครับ ^ ^


No comments:

Post a Comment

วิธีการติดตั้ง และตั้งค่า Apache2 พร้อมเปิดใช้งาน HTTPS ด้วยวิธี Self-Sign บน Ubuntu 18.04.1 LTS

ดีจร้า วันนี้ช่วงเช้าว่างเลยมาเขียนบทความเพิ่มเติมเกี่ยวกับการติดตั้ง และตั้งค่า Apache2 ให้สามารถใช้งานผ่าน HTTPS ได้กันมาเริ่มกันเลยครับ ...