0

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 loki trong Namespace logging.

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:

  1. Đọc log.
  2. Thêm Metadata như Namespace, Pod, Container.
  3. Gửi tới Loki.
  4. 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ỉ host trong 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

Viblo
Let's register a Viblo Account to get more interesting posts.