Triển khai EFK Stack trên Kubernetes

Tram Ho

EFK stack on K8S

Giới thiệu

Một hệ thống có thể chạy nhiều dịch vụ hoặc ứng dụng khác nhau, vì vậy việc
theo dõi hệ thống là vô cùng cần thiết. Logging là một công cụ đơn giản nhưng
lại rất tiện lợi giúp ghi lại toàn bộ hoạt động của hệ thống. Nhờ có logging,
ta có thể tra cứu lại trạng thái của hệ thống trong quá khứ và có thể tìm và
fix lại lỗi dễ dàng hơn.

Hiện nay đã có khá nhiều công cụ để quản lý log khác nhau. Trong bài viết này,
mình sẽ đề cập đến bộ công cụ EFK(Elasticsearch-Fluentbit-Kibana). EFK có rất nhiều
ưu điểm như phần mềm mã nguồn mở hoàn toàn miễn phí và rất dễ xài nữa.
Bây giờ, mình sẽ giới thiệu cho anh em bộ công cụ này và mình dùng để demo theo
dõi log của cụm kubernetes. OK!!! Vào thôi.

EFK stack là tập hợp của 3 phần mềm đi chung với nhau bao gồm:

  • Elasticsearch: Cơ sở dữ liệu NoSQL dùng để lưu trữ dữ liệu và cung cấp
    interface để tìm kiếm và query log.
  • Fluent-bit: Là phần mềm mã nguồn mở, viết bằng C, được thiết kế nhằm
    chú trọng đến hiệu suất. Nó cho phép bạn thu thập logs từ nhiều nguồn khác nhau.
    Fluent bit được phát triển bởi Fluentd team với mục đích tạo ra một phiên
    bản lightweight trong việc xử lý logs. Sau đó, fluent bit được sử dụng như
    một giải pháp xử lý dành cho Cloud.
  • Kibana: Giao diện để quản lý, thống kê logs. Có nhiệm vụ đọc thông tin
    từ elasticsearch.

Cơ chế hoạt động của bộ công cụ được mô tả qua hình dưới đây:

  1. Đầu tiên, log sẽ được đưa đến Fluent-bit.
  2. Fluent-bit 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) và ghi xuống
    Elasticsearch.
  3. Để xem log, chúng ta truy cập 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ý.

Bây giờ, mình sẽ “đề mô” EFK stack cho Kubernetes

Demo

Ở bài viết này, mình sử dụng minikube để deploy cụm kubernetes, vì vậy
anh em nào chưa cài minikube thì cài nha. Để cài thì anh em cứ vô trang
chủ xem thôi, cũng đơn giản thôi. Anh em sẽ phải cài hai thứ là minikube
set up kubectl cho minikube, mình để link cài ở đây
cho ai lười tìm :v.

Mình sẽ demo theo thứ tự sau Elasticsearch – Kibana – Fluent bit. Source code
mình sẽ để ở đây cho anh em tiện theo
dõi.

Bước 1: Start cụm minikube

Bước 2: Tạo namespace chung cho cụm kubernetes

Kiểm tra

Ta thấy namespace kube-logging chung đã được tạo

Bước 3: Deploy Elasticsearch. Ở bước này chung ta sẽ deploy 2 phần, đầu
tiên là servicestatefuleset của elasticsearch. Ở trong serivices
mình sử dụng type: NodePort để dễ dàng chọc vô kiểm tra, nhưng cách này
chỉ phục vụ demo cho dễ thôi chứ không an toàn vì ai lại đi choc vô DB tùy tiện
nhỷ.

Kiểm tra

Bước 4: Deploy Kibana, mình cũng sẽ deploy giống thằng elasticsearch,
services vẫn sẽ để type: NodePort để tiện demo.

Kiểm tra

Sau đây là phần quan trọng nhất, deploy bé Fluent-bit. Mình sẽ giải thích
kỹ qua các bước deploy.

Đầu tiên, để thu thập logs từ cụm kubernetes, mình sẽ phải cấp cho fluent-bit
một account và một số quyền như ["get", "list", "watch"] để có thể quản lý
logs.

OK!!! Sau đó, ta cần liên kết ServiceAccount với ClusterRole vừa tạo ở trên

Tiếp theo, mình tiến hành deploy file ConfigMap của fluent-bit. Anh em có thể
theo dõi file ConfigMap của mình ở đây.
Ở đây, mình sử dụng 4 sections của fluent-bit:

  1. [SERVICE] dùng để tạo file logs.
  2. [INPUT] cấu hình đầu vào của nơi lấy logs. Phần lấy logs mình lấy tại thư mục
    /var/log/containers/*.log trong cụm minikube. Anh em có thể cấu hình file
    log mà mình muốn lấy (Ví dụ: etcd, kube-api, …).
  3. [OUTPUT] cấu hình đầu ra file log là hostport của elasticsearch.
  4. [PARSER] cấu hình file logs dạng json và time,…

Anh em có thể tìm hiểu thêm trên docs của fluent-bit nhá. Mình cấu hình sương
sương vậy, demo tiếp thôi :3

Cuối cùng là deploy file DaemonSet của fluent-bit. Nhưng trước đó, anh em quay
lại chỗ của elasticsearch để lấy IP và cấu hình vào file DaemonSet của
fluent-bit như sau:

Lấy IP của elasticsearch

Cấu hình vào fluent-bit:

OK!!! Xong xuôi rôi deploy thôi :3

Kiểm tra

Done!!! Kiểm tra thành quả nào. Anh em check ip của cụm minikube theo command
minikube ip sau đó check port của kibana qua command:

Sau đó, mở trình duyệt truy cập địa chỉ $(minikube ip):31122 để xem kết quả

Kibana

Vậy là mình là vừa demo xong EFK stack để theo dõi logs của cụm kubernetes.

Hy vọng, bài viết này của mình sẽ giúp anh hiểu được phần nào của cách hoạt động
và lợi ích của EFK. Cảm ơn anh em đã đọc.

References

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo