1. ELK Stack là gì?
ELK Stack là tập hợp 3 phần mềm đi chung với nhau, phục vụ cho công việc logging. Ba phần mềm này lần lượt là:
- Elasticsearch: Cơ sở dữ liệu để lưu trữ, tìm kiếm và query log
- Logstash: Tiếp nhận log từ nhiều nguồn, sau đó xử lý log và ghi dữ liệu và Elasticsearch
- Kibana: Giao diện để quản lý, thống kê log. Đọc thông tin từ Elasticsearch
Cơ chế hoạt động của ELK Stack cũng khá đơn giản, các bạn xem hình sẽ hiểu:
Cơ chế hoạt động của ELK như sau:
- Đầu tiên, log sẽ được đưa đến Logstash. (Thông qua nhiều con đường, ví dụ như server gửi UDP request chứa log tới URL của Logstash, hoặc Beat đọc file log và gửi lên Logstash)
- Logstash sẽ đọc những log này, thêm những thông tin như thời gian, IP, parse dữ liệu từ log (server nào, độ nghiêm trọng, nội dung log) ra, sau đó ghi xuống database là Elasticsearch.
- Khi muốn xem log, người dùng vào URL của Kibana. Kibana sẽ đọc thông tin log trong Elasticsearch, hiển thị lên giao diện cho người dùng query và xử lý.
2. Triển khai ELK bằng Docker Compose.
Tạo file elk.yaml.
vi /home/elk.yaml
Điền vào nội dung như dưới và nếu muốn thì bạn hãy thay đổi các thông số theo ý muốn của bạn.
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
container_name: es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
container_name: es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
kib01:
image: docker.elastic.co/kibana/kibana:7.13.2
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: '["http://es01:9200","http://es02:9200","http://es03:9200"]'
networks:
- elastic
logstash:
image: logstash:7.13.2
container_name: logstash
ports:
- 5044:5044
networks:
- elastic
volumes:
- /home/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- /home/sample-json.log:/home/sample-json.log
environment:
ELASTICSEARCH_URL: http://es01:9200
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
Ở đây mình sẽ tạo thêm file /home/sample-json.log để test json parse cho các bài sau.
touch /home/sample-json.log
Tạo file fillter để mount vào container logstash.
vi /home/logstash.conf
Hãy cho nội dung này vào và lưu lại, đây là bộ lọc đơn giản dùng để test logs, về sau các bạn phải viết nó bằng ngôn ngữ riêng dành cho log được gọi là grok.
input {
beats {
port => 5044
ssl => false
}
}
output {
elasticsearch {
hosts => ["es01:9200"]
sniffing => true
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
}
}
Hãy triển khai file elk.yaml bằng lệnh docker-compose -f /home/elk.yaml up -d
$ docker-compose -f /home/elk.yaml up -d
[+] Running 5/5
⠿ Network home_elastic Created 0.1s
⠿ Container es02 Started 4.6s
⠿ Container kib01 Started 2.4s
⠿ Container es03 Started 3.4s
⠿ Container es01 Started 1.4s
Kết quả sau khi triển khai xong file elk.yaml.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10b06ac625d0 docker.elastic.co/elasticsearch/elasticsearch:7.13.2 "/bin/tini -- /usr/l…" About a minute ago Up About a minute 9200/tcp, 9300/tcp es02
31f0346bdf85 docker.elastic.co/elasticsearch/elasticsearch:7.13.2 "/bin/tini -- /usr/l…" About a minute ago Up About a minute 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp es01
8b567ff7dffb docker.elastic.co/elasticsearch/elasticsearch:7.13.2 "/bin/tini -- /usr/l…" About a minute ago Up About a minute 9200/tcp, 9300/tcp es03
1d523f49c854 docker.elastic.co/kibana/kibana:7.13.2 "/bin/tini -- /usr/l…" About a minute ago Up About a minute 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp kib01
Nếu es01, es02, es04 không start được, bạn hãy dùng lệnh docker logs es01 xem lỗi gì, nếu Elastic search bạn gặp lỗi dưới, bạn hãy làm theo các bước tiếp theo để fix lỗi.
Elastic search error: "Native controller process has stopped - no new native processes can be started"
Lý do là tuỳ chọn vm.max_map_count được đặt thành nhỏ theo mặc định. Điều này hạn chế hàng đợi của thông báo nên để giải quyết bạn hãy tăng tuỳ chọn này lên trên máy node chạy Docker bằng cách sau:
Trên Linux chạy lệnh sau để được giải quyết.
sysctl -w vm.max_map_count=262144
Trên Windows với docker desktop chạy lệnh dưới.
wsl -d docker-desktop
Và sau đó sử dụng lệnh này.
sysctl -w vm.max_map_count=262144
Kiểm tra xem port của Kibana đã listen chưa.
$ netstat -tlnp | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 21694/docker-proxy
tcp6 0 0 :::5601 :::* LISTEN 21702/docker-proxy
Và đây là kết quả.
Khi không dùng nữa bạn có thể huỷ các container bằng lệnh docker-compose down như dưới.
$ docker-compose -f elk.yaml down
[+] Running 5/5
⠿ Container es03 Removed 1.1s
⠿ Container es01 Removed 1.2s
⠿ Container kib01 Removed 10.5s
⠿ Container es02 Removed 1.0s
⠿ Network home_elastic Removed 0.1s
3. Cài đặt Filebeat.
Filebeat là một plugin nhẹ được sử dụng để thu thập và gửi các logs. Đây là mô-đun Beats được sử dụng phổ biến nhất. Một trong những ưu điểm chính của Filebeat là nó làm chậm tốc độ của nó nếu dịch vụ Logstash xử lý quá nhiều dữ liệu.
Cài đặt Filebeat bằng cách chạy lệnh sau:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb https://artifacts.elastic.co/packages/oss-7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt-get install apt-transport-https
apt-get update
apt-get install filebeat
Theo mặc định, Filebeat sẽ gửi dữ liệu đến Elaticsearch. Filebeat cũng có thể được cấu hình để gửi dữ liệu sự kiện tới Logstash.
3.1. Để định cấu hình, hãy chỉnh sửa file cấu hình filebeat.yml.
vi /etc/filebeat/filebeat.yml
3.2. Trong phần Elaticsearch o utput , hãy comment lại các dòng sau để Filebeat không gửi logs đến Elaticsearch.
# output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
3.3. Trong phần Logstash output , bỏ comment (#
) ở 2 dòng sau với 192.168.13.205:5044 là ip address và port của Logstash mục đích là cho Filebeat gửi logs đến Logstash.
output.logstash:
# The Logstash hosts
hosts: ["192.168.13.205:5044"]
Như vậy sau khi chỉnh sửa xong, phần Output của Elaticsearch và Logstash nó sẽ giống như thế này.
# ================================== Outputs ===================================
# Configure what output to use when sending the data collected by the beat.
# ---------------------------- Elasticsearch Output ----------------------------
# output.elasticsearch:
# Array of hosts to connect to.
# hosts: ["localhost:9200"]
# Protocol - either `http` (default) or `https`.
#protocol: "https"
# Authentication credentials - either API key or username/password.
#api_key: "id:api_key"
#username: "elastic"
#password: "changeme"
# ------------------------------ Logstash Output -------------------------------
output.logstash:
# The Logstash hosts
hosts: ["192.168.13.205:5044"]
# Optional SSL. By default is off.
# List of root certificates for HTTPS server verifications
#ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication
#ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key
#ssl.key: "/etc/pki/client/cert.key"
3.4. Tiếp theo, kích hoạt mô-đun hệ thống Filebeat , mô-đun này sẽ kiểm tra nhật ký hệ thống mà bạn đang cài đặt Filebeat:
$ sudo filebeat modules enable system
Enabled system
3.5. Tiếp theo, load một index template với 192.168.13.205:9200 là ip address và port của Elaticsearch.
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.13.205:9200"]'
Hãy chắc chắn rằng server chạy Filebeat của bạn đã listen được port 9200 của Elaticsearch.
$ telnet 192.168.13.205 9200
Trying 192.168.13.205...
Connected to 192.168.13.205.
Escape character is '^]'.
Hệ thống sẽ thực hiện một số công việc, quét hệ thống của bạn và kết nối với bảng điều khiển Kibana của bạn.
$ sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.13.205:9200"]'
Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.
Index setup finished.
Vào Slack Management.
Index Management và bạn sẽ thấy Index của bạn đã xuất hiện (2).
3.6. Khởi động và kích hoạt Filebeat.
sudo systemctl start filebeat
sudo systemctl enable filebeat
Verify lại việc Elasticsearch đã nhận logs từ Filebeat.
$ curl -XGET http://192.168.13.205:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_7.13.2_001 jNmjumGZSXe7UaXKG9XNBA 1 1 38 25 8.6mb 4.3mb
green open .apm-custom-link 8sJMKGWrTte4a4zcIY5Ekw 1 1 0 0 416b 208b
green open .kibana-event-log-7.13.2-000001 xUJfkhouTxqzEcdZaLiCVg 1 1 4 0 43.5kb 21.7kb
green open .apm-agent-configuration fcETS-NPSaaf7EjCVp_D4Q 1 1 0 0 416b 208b
green open logstash-2022.11.19-000001 OqxqOrGaR96GKhk4WGftOQ 1 1 0 0 416b 208b
green open filebeat-7.17.7-2022.11.19-000001 VPGniisCSsWLLZTfpthkyQ 1 1 0 0 416b 208b
green open .async-search enx7QrESSwynJ3jKDpzrSg 1 1 0 0 3.5kb 228b
green open .kibana_task_manager_7.13.2_001 7weCBMJAQp257YRxigEVHQ 1 1 10 764 1.7mb 1.6mb
green open .tasks uQ3i-yJ-SLyHNJZUltoZaQ 1 1 6 0 63.7kb 28.9kb
Sau khi chắc chắn Elaticsearch đã lấy được logs từ Logstash, bạn hãy vào index pattern trên Kibana và tạo 1 pattern mới.
Lúc này Kibana sẽ hiện ra 1 loạt pattern mà nó define được.
Mình sẽ fillter để lấy các pattern là filebeat và bấm Next step như hình dưới.
Mình chọn fillter là timestamp.
Sau khi add pattern xong, bạn sẽ nhận được các Fields như dưới.
Để show các logs bạn vào Discover.
Chọn index là filebeat là xong.
Nếu có logs bạn sẽ thấy dữ liệu như bên dưới.
Kết luận
Bây giờ bạn đã cài đặt xong cụm ELK trên hệ thống Ubuntu. Mình khuyên bạn nên xác định các yêu cầu của mình và bắt đầu điều chỉnh ELK cho phù hợp với nhu cầu của mình. Công cụ phân tích logs mạnh mẽ này có thể được tùy chỉnh cho các trường hợp sử dụng riêng lẻ.
Tùy chỉnh các luồng dữ liệu với Logstash, sử dụng các mô-đun Beats khác nhau để thu thập các loại dữ liệu khác nhau và sử dụng Kibana để dễ dàng duyệt qua các file nhật ký.
Tài liệu tham khảo ELK Stack on Docker.