Lab 9.3 - Xây dựng hệ thống Centralized Logging với Fluent Bit, Loki và Grafana
Phần 3 - Triển khai Fluent Bit và thu thập Log từ Kubernetes
Ở phần trước, chúng ta đã triển khai thành công Loki để lưu trữ log.
Tuy nhiên, nếu mở Grafana hoặc truy cập trực tiếp vào Loki lúc này, bạn sẽ thấy không có bất kỳ log nào.
Lý do rất đơn giản:
Loki chỉ là nơi lưu trữ log, chứ không tự thu thập log.
Để đưa log từ các Pod vào Loki, chúng ta cần một Log Collector.
Trong Lab này, chúng ta sẽ sử dụng Fluent Bit.
Mục tiêu của phần này
Sau khi hoàn thành phần này, bạn sẽ:
- Hiểu Fluent Bit là gì.
- Hiểu vì sao Fluent Bit chạy dưới dạng DaemonSet.
- Triển khai Fluent Bit bằng Helm.
- Cấu hình Fluent Bit gửi log đến Loki.
- Kiểm tra Fluent Bit đang thu thập log từ Kubernetes.
- Xác nhận log đã được gửi tới Loki.
Fluent Bit là gì?
Fluent Bit là một Log Collector có hiệu năng cao, được thiết kế để thu thập và chuyển tiếp log.
Trong Kubernetes, Fluent Bit thường đảm nhận các nhiệm vụ:
- Theo dõi log của tất cả Container trên Node.
- Đọc log mới ngay khi chúng được tạo.
- Thêm thông tin Kubernetes (Metadata).
- Gửi log đến Loki.
Có thể hình dung Fluent Bit giống như một "người đưa thư":
Container
↓
Sinh log
↓
Fluent Bit
↓
Loki
↓
Grafana
Vì sao Fluent Bit chạy dưới dạng DaemonSet?
Một Kubernetes Cluster thường có nhiều Node.
Ví dụ:
Node 1
├── Backend Pod
├── Frontend Pod
Node 2
├── PostgreSQL Pod
Node 3
├── Prometheus
├── Grafana
Log của mỗi Pod được lưu trên chính Node mà Pod đang chạy.
Nếu chỉ chạy một Pod Fluent Bit duy nhất, nó sẽ không thể đọc log trên các Node khác.
Giải pháp là triển khai Fluent Bit dưới dạng DaemonSet.
DaemonSet đảm bảo:
Mỗi Node luôn có đúng một Pod Fluent Bit.
Ví dụ:
Kubernetes Cluster
+----------------+ +----------------+ +----------------+
| Node 1 | | Node 2 | | Node 3 |
|----------------| |----------------| |----------------|
| Backend Pod | | PostgreSQL Pod | | Prometheus |
| Frontend Pod | | Fluent Bit | | Grafana |
| Fluent Bit | | | | Fluent Bit |
+----------------+ +----------------+ +----------------+
\ | /
\ | /
\ | /
+-----------------------------+
| Loki |
+-----------------------------+
Nhờ vậy, Fluent Bit có thể thu thập log của toàn bộ Cluster.
Fluent Bit đọc log ở đâu?
Nhiều người nghĩ Fluent Bit đọc log trực tiếp từ ứng dụng.
Thực tế không phải vậy.
Quy trình hoạt động như sau:
Spring Boot
↓
stdout / stderr
↓
Container Runtime
↓
/var/log/containers/*.log
↓
Fluent Bit
↓
Loki
Container Runtime (Docker hoặc containerd) sẽ ghi log của mỗi Container vào thư mục:
/var/log/containers/
Ví dụ:
todo-backend-7f9d8c6d7f-abc12_todo-app_backend.log
todo-frontend-69dfb7fd95-def34_todo-app_frontend.log
prometheus-server.log
Fluent Bit chỉ cần theo dõi thư mục này và gửi các log mới đến Loki.
Bước 1. Thêm Helm Repository
Fluent Bit được phát hành thông qua Helm Chart.
Thêm Repository:
helm repo add fluent https://fluent.github.io/helm-charts
Cập nhật Repository:
helm repo update
Kiểm tra:
helm search repo fluent/fluent-bit
Ví dụ:
NAME CHART VERSION
fluent/fluent-bit x.x.x
Bước 2. Cài đặt Fluent Bit
Để Fluent Bit có thể gửi log đến Loki ngay sau khi cài đặt, chúng ta cấu hình trực tiếp thông qua tham số --set.
Lưu ý: Địa chỉ Loki có thể khác nhau tùy Helm Chart. Trong Lab này chúng ta sử dụng Service
lokitrong Namespacelogging.
Thực hiện:
helm install fluent-bit fluent/fluent-bit \
-n logging \
--set backend.type=loki \
--set backend.loki.host=loki.logging.svc.cluster.local \
--set backend.loki.port=3100
Sau khi cài đặt thành công:
NAME: fluent-bit
STATUS: deployed
Bước 3. Kiểm tra Pod
Kiểm tra:
kubectl get pods -n logging
Ví dụ:
NAME READY STATUS
fluent-bit-k82fj 1/1 Running
loki-0 1/1 Running
Nếu Cluster có nhiều Node:
NAME
fluent-bit-abc12
fluent-bit-def34
fluent-bit-ghi56
Số lượng Pod Fluent Bit sẽ bằng số lượng Node.
Bước 4. Kiểm tra DaemonSet
Kiểm tra:
kubectl get daemonset -n logging
Ví dụ:
NAME DESIRED CURRENT READY
fluent-bit 3 3 3
Ý nghĩa:
- DESIRED: Số Pod cần chạy (bằng số Node).
- CURRENT: Số Pod hiện có.
- READY: Số Pod sẵn sàng hoạt động.
Nếu cả ba giá trị bằng nhau, Fluent Bit đã được triển khai thành công trên tất cả các Node.
Bước 5. Kiểm tra cấu hình Fluent Bit
Kiểm tra ConfigMap:
kubectl get configmap -n logging
Ví dụ:
NAME
fluent-bit
Xem cấu hình:
kubectl get configmap fluent-bit \
-n logging \
-o yaml
Trong cấu hình, bạn sẽ thấy các phần chính:
- INPUT: Đọc log từ
/var/log/containers. - FILTER: Thêm Metadata của Kubernetes.
- OUTPUT: Gửi log đến Loki.
Đây chính là ba thành phần quan trọng nhất của Fluent Bit.
Bước 6. Kiểm tra Fluent Bit đang đọc log
Xem log của Fluent Bit:
kubectl logs \
-l app.kubernetes.io/name=fluent-bit \
-n logging
Ví dụ:
[ info] tail.0 started
[ info] reading /var/log/containers
[ info] kube filter initialized
[ info] output=loki
Các thông báo trên cho thấy:
- Fluent Bit đã bắt đầu theo dõi log.
- Đã kết nối tới Kubernetes API để lấy Metadata.
- Đã sẵn sàng gửi log tới Loki.
Bước 7. Kiểm tra Log của ứng dụng
Sinh một vài request tới ứng dụng:
curl http://localhost:8080/api/todos
Hoặc:
curl -X POST \
http://localhost:8080/api/todos
Sau đó kiểm tra log của Fluent Bit:
kubectl logs \
-l app.kubernetes.io/name=fluent-bit \
-n logging \
--tail=20
Nếu mọi thứ hoạt động đúng, Fluent Bit sẽ tiếp tục ghi nhận các log mới và chuyển chúng tới Loki.
Bước 8. Kiểm tra Loki đã nhận log
Hiện tại chúng ta chưa kết nối Grafana với Loki.
Tuy nhiên có thể kiểm tra nhanh bằng cách xem log của Loki:
kubectl logs \
loki-0 \
-n logging
Bạn có thể thấy các thông báo tương tự:
received log stream
ingested entries
push request received
Điều này cho thấy Loki đã bắt đầu nhận log từ Fluent Bit.
Luồng hoạt động hoàn chỉnh
Sau khi triển khai Fluent Bit, hệ thống Logging hoạt động theo quy trình sau:
Spring Boot
│
log.info()
log.error()
│
stdout / stderr
│
Container Runtime
│
/var/log/containers
│
Fluent Bit
│
Kubernetes Metadata
│
Loki
│
Grafana
Mỗi khi ứng dụng sinh log:
ERROR Database connection timeout
Fluent Bit sẽ tự động:
- Đọc log.
- Thêm Metadata như Namespace, Pod, Container.
- Gửi tới Loki.
- Lưu trữ để Grafana truy vấn.
Toàn bộ quá trình này diễn ra hoàn toàn tự động.
Những lỗi thường gặp
Fluent Bit không khởi động
Kiểm tra:
kubectl describe pod <fluent-bit-pod> -n logging
Đặc biệt chú ý phần Events để xác định nguyên nhân.
Fluent Bit không đọc được log
Kiểm tra log:
kubectl logs <fluent-bit-pod> -n logging
Đảm bảo Fluent Bit đã mount đúng thư mục:
/var/log/containers
Loki không nhận log
Kiểm tra:
- Service của Loki.
- Địa chỉ
hosttrong cấu hình Fluent Bit. - Trạng thái Pod Loki.
Đồng thời xem log của cả Fluent Bit và Loki để xác định lỗi kết nối.
Kết quả đạt được
Sau phần này, chúng ta đã:
- Triển khai Fluent Bit trên Kubernetes.
- Hiểu vì sao Fluent Bit sử dụng DaemonSet.
- Hiểu cách Fluent Bit đọc log từ
/var/log/containers. - Cấu hình Fluent Bit gửi log tới Loki.
- Xác nhận hệ thống Logging đã bắt đầu thu thập log từ các Pod.
Kiến trúc hiện tại:
Spring Boot
│
stdout / stderr
│
/var/log/containers
│
Fluent Bit
│
Loki
│
(Đã nhận log)
│
Grafana
Ở Phần 4, chúng ta sẽ kết nối Grafana với Loki, thực hiện những truy vấn LogQL đầu tiên và bắt đầu tìm kiếm log của ứng dụng Todo ngay trên giao diện Grafana.
All Rights Reserved