0

Lab 9.2 - Xây dựng hệ thống Centralized Logging với Fluent Bit, Loki và Grafana

Phần 2 - Triển khai Loki trên Kubernetes

Ở phần trước, chúng ta đã tìm hiểu vì sao một hệ thống Kubernetes Production cần Centralized Logging.

Trong phần này, chúng ta sẽ triển khai thành phần đầu tiên của hệ thống Logging: Loki.

Sau khi hoàn thành phần này, chúng ta sẽ có một nơi để lưu trữ và truy vấn toàn bộ log của các Pod trong Kubernetes.


Loki là gì?

Loki là hệ thống lưu trữ log được phát triển bởi Grafana Labs.

Khác với các hệ thống Log Aggregation truyền thống như Elasticsearch, Loki được thiết kế riêng cho môi trường Cloud Native và Kubernetes.

Điểm khác biệt lớn nhất của Loki là:

  • Không đánh chỉ mục (index) toàn bộ nội dung log.
  • Chỉ đánh chỉ mục các Label.
  • Nội dung log được nén và lưu trữ riêng.

Ví dụ:

Một log của ứng dụng Todo:

2026-08-05 10:15:03 ERROR Database connection timeout

Khi được gửi tới Loki, log sẽ được lưu cùng các Label:

namespace="todo-app"
app="todo-backend"
container="backend"
pod="todo-backend-6d9f7d6c5f-j2w7m"

Khi tìm kiếm, Loki chỉ cần tra cứu các Label trước, sau đó mới đọc nội dung log. Nhờ vậy, Loki tiêu tốn ít CPU, RAM và dung lượng lưu trữ hơn so với nhiều hệ thống Logging truyền thống.


Kiến trúc sau khi triển khai Loki

Sau phần này, kiến trúc của chúng ta sẽ như sau:

             Spring Boot
                  │
           stdout / stderr
                  │
           Kubernetes Node
                  │
             Fluent Bit
                  │
                (Chưa cài)
                  │
                  ▼
                 Loki
                  │
                  ▼
               Grafana

Hiện tại Loki đã sẵn sàng nhận log, nhưng chưa có thành phần nào gửi log đến nó. Chúng ta sẽ cài Fluent Bit ở phần tiếp theo.


Bước 1. Tạo Namespace

Để quản lý các thành phần Logging riêng biệt với Monitoring, chúng ta tạo một Namespace mới.

kubectl create namespace logging

Kiểm tra:

kubectl get namespaces

Ví dụ:

NAME          STATUS   AGE
default       Active
kube-system   Active
monitoring    Active
logging       Active
todo-app      Active

Namespace logging sẽ chứa toàn bộ các thành phần liên quan đến hệ thống Logging.


Bước 2. Thêm Helm Repository

Loki được Grafana Labs phát hành thông qua Helm Chart.

Thêm Repository:

helm repo add grafana https://grafana.github.io/helm-charts

Cập nhật danh sách Chart:

helm repo update

Kiểm tra:

helm search repo grafana/loki

Ví dụ:

NAME             CHART VERSION
grafana/loki     x.x.x

Bước 3. Cài đặt Loki

Để đơn giản cho bài Lab, chúng ta sử dụng cấu hình mặc định của Helm Chart.

helm install loki \
grafana/loki \
-n logging

Sau khi cài đặt thành công:

NAME: loki
STATUS: deployed

Loki sẽ tự động tạo các tài nguyên Kubernetes cần thiết như:

  • Deployment hoặc StatefulSet (tùy chart và chế độ triển khai)
  • Service
  • ConfigMap
  • ServiceAccount

Bước 4. Kiểm tra Pod

Kiểm tra các Pod:

kubectl get pods -n logging

Ví dụ:

NAME                     READY   STATUS    RESTARTS   AGE
loki-0                   1/1     Running   0          2m

Nếu Pod đang ở trạng thái:

Running

có nghĩa Loki đã khởi động thành công.

Nếu Pod ở trạng thái:

Pending

hãy kiểm tra:

kubectl describe pod loki-0 -n logging

Các nguyên nhân thường gặp:

  • Thiếu tài nguyên CPU hoặc Memory.
  • Không kéo được Image.
  • Lỗi Persistent Volume.

Bước 5. Kiểm tra StatefulSet

Loki sử dụng StatefulSet vì cần lưu trữ dữ liệu log.

Kiểm tra:

kubectl get statefulset -n logging

Ví dụ:

NAME   READY   AGE
loki   1/1     2m

StatefulSet đảm bảo:

  • Tên Pod không thay đổi.
  • Dữ liệu được gắn với từng Pod.
  • Có thể mở rộng khi cần.

Bước 6. Kiểm tra Service

Loki cần một Service để các thành phần khác trong Cluster có thể truy cập.

kubectl get svc -n logging

Ví dụ:

NAME    TYPE        CLUSTER-IP      PORT(S)
loki    ClusterIP   10.100.20.50    3100/TCP

Địa chỉ nội bộ của Loki sẽ là:

http://loki.logging.svc.cluster.local:3100

Đây là Endpoint mà Fluent Bit và Grafana sẽ sử dụng trong các phần tiếp theo.


Bước 7. Kiểm tra Log của Loki

Xem log:

kubectl logs \
loki-0 \
-n logging

Ví dụ:

level=info msg="Loki started"

level=info msg="Server listening"

level=info msg="Ready to receive requests"

Nếu thấy các thông báo trên, Loki đã sẵn sàng hoạt động.


Bước 8. Kiểm tra Health Endpoint

Port Forward:

kubectl port-forward \
svc/loki \
3100:3100 \
-n logging

Mở Terminal mới:

curl http://localhost:3100/ready

Kết quả:

ready

Điều này xác nhận Loki đã sẵn sàng nhận log.


Bước 9. Kiểm tra Metrics của Loki

Loki cũng cung cấp Metrics cho Prometheus.

Kiểm tra:

curl http://localhost:3100/metrics

Ví dụ:

loki_build_info

loki_request_duration_seconds

loki_ingester_memory_chunks

loki_distributor_ingester_appends_total

Nếu muốn, bạn có thể thêm Loki vào Prometheus để theo dõi hiệu năng của chính hệ thống Logging.


Bước 10. Kiểm tra Helm Release

Xem Release:

helm list -n logging

Ví dụ:

NAME   NAMESPACE   STATUS
loki   logging     deployed

Xem cấu hình:

helm get values loki -n logging

Đây là cách kiểm tra các cấu hình đã áp dụng và sẽ rất hữu ích khi cần tùy chỉnh Loki trong môi trường Production.


Những lỗi thường gặp

Pod không khởi động

Kiểm tra:

kubectl describe pod loki-0 -n logging

Đặc biệt chú ý các sự kiện (Events) ở cuối kết quả để xác định nguyên nhân.


Không tìm thấy Service

Kiểm tra:

kubectl get svc -n logging

Nếu chưa có Service, kiểm tra lại Helm Release:

helm status loki -n logging

Health Check không thành công

Kiểm tra log:

kubectl logs loki-0 -n logging

Đảm bảo Pod đang ở trạng thái Running và Service đã được tạo.


Kết quả đạt được

Sau phần này, chúng ta đã:

  • Triển khai Loki trên Kubernetes.
  • Hiểu vì sao Loki sử dụng StatefulSet.
  • Kiểm tra Pod và Service của Loki.
  • Xác nhận Loki đã sẵn sàng nhận log.
  • Làm quen với Endpoint và Metrics của Loki.

Kiến trúc hiện tại:

             Spring Boot
                  │
           stdout / stderr
                  │
           Kubernetes Node
                  │
             Fluent Bit
                  │
            (Sẽ cài ở Phần 3)
                  │
                  ▼
                 Loki
                  │
                  ▼
               Grafana

Phần 3, chúng ta sẽ triển khai Fluent Bit dưới dạng DaemonSet, cấu hình Fluent Bit thu thập log từ tất cả các Pod trong Kubernetes và gửi chúng đến Loki để xây dựng hệ thống Centralized Logging hoàn chỉnh.


All Rights Reserved

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