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