Thu thập và truy vấn logs Kubernetes với Grafana Loki, Grafana và Grafana Agent (phần 1)

1868
27-11-2023
Thu thập và truy vấn logs Kubernetes với Grafana Loki, Grafana và Grafana Agent (phần 1)

Ghi Logs của Kubernetes giúp kiểm tra sức khỏe của cluster và các ứng dụng đang chạy. Nó cũng được sử dụng để tìm và sửa các vấn đề xảy ra. Việc thu thập và phân tích nhật ký ứng dụng và cụm có thể giúp xác định các trở ngại và tối ưu hóa triển khai để đạt được hiệu suất tốt hơn.

Tuy nhiên, Kubernetes không có giải pháp native để quản lý và phân tích logs. Thay vào đó, Kubernetes gửi logs được cung cấp bởi container engine đến các standard streams. Từ đó có thể tích hợp 1 backend riêng để lưu trữ, phân tích và truy vấn log tập trung.

Một giải pháp log tập trung cho phép:

  • Kiểm tra các hành động được thực hiện trên cluster 
  • Có thông tin để khắc phục sự cố với các ứng dụng và cluster 
  • Giám sát hiệu suất cluster

Bài viết này giới thiệu về log trong Kubernetes và hướng dẫn qua các bước sau:

1. Triển khai Loki, Grafana và Grafana Agent 

2. Truy vấn và xem dữ liệu log Kubernetes bằng Grafana

3. Sử dụng truy vấn số liệu để tạo số liệu từ log

4. Thiết lập cảnh báo từ log

Tuy nhiên trong phần 1 này thì ta sẽ chỉ hướng dẫn về cách triển khai Loki và Grafana

Khái niệm Kubernetes log

Kubernetes log là kiến trúc cho phép người dùng thu thập và xem dữ liệu về các ứng dụng và dịch vụ đang chạy trên cluster. Tuy nhiên, log này khác với việc ghi log trên máy chủ truyền thống và máy ảo ở một vài điểm như sau.

- Log được Kubernetes thu thập không được cung cấp trực tiếp bởi ứng dụng mà được cung cấp bởi container engine hoặc runtime. Log này được thu thập bởi các agent được cài đặt trên các nodes được gọi là [kubelets]. Kubelet Agent giữ các nhật ký trên node ngay cả sau khi pod bị xóa, điều này giúp quay vòng logs và ngăn ngừa tài nguyên node bị quá tải.

- Bạn có thể sử dụng lệnh "kubectl log" để xem các logs từ pods. Tuy nhiên, những logs này chỉ cho bạn logs vào thời điểm thực hiện lệnh. Để thu thập các nhật ký và thực hiện phân tích dữ liệu sâu hơn sau này, bạn cần 1 backend.

- Kubernetes xử lý các loại logs khác nhau, bao gồm logs ứng dụng, logs control plane và event. Event là một đối tượng Kubernetes được thiết kế để cung cấp chi tiết hơn vào những gì đang xảy ra bên trong các node và pod

Mặc dù có sự khác biệt giữa logs truyền thống và logs của Kubernetes, vẫn cần thiết thiết lập 1 giải pháp ghi logs để tối ưu cluster Kubernetes.

Trước khi bắt đầu thiết lập Grafana Loki trong cluster cần xem xét các chế độ triển khai khác nhau mà Loki để hiểu được ưu điểm và nhược điểm của mỗi chế độ.

Loki deployment modes

Loki có 3 chế độ triển khai khác nhau, về cơ bản mỗi chế độ này sẽ cho kiểm soát cách mà Loki sẽ mở rộng thế nào

- Chế độ Monolithic: Trong chế độ này, tất cả các thành phần của Loki - distributor, ingestor, ruler, querier và query frontend - chạy trong 1 file binary duy nhất hoặc 1 container. Lợi ích của phương pháp này là tính đơn giản trong cả triển khai và cấu hình, thích hợp cho những người muốn dùng thử Loki. Chế độ này cũng phù hợp với các trường hợp sử dụng với lượng đọc / ghi không vượt quá 100GB mỗi ngày.

- Chế độ Microservices: Chế độ này cho phép bạn quản lý từng thành phần của Loki độc lập , kiểm soát tối đa về tính mở rộng chế độ này cho phép Loki xử lý lượng lớn logs, làm cho chế độ này lý tưởng cho các dự án quy mô lớn.

- Chế độ Scalable: Chế độ này cho phép Loki mở rộng đến một vài TB logs mỗi ngày. Điều này có thể được thực hiện bằng cách phân tách các vấn đề đọc và ghi vào các microservice độc lập, làm cho việc mở rộng triển khai dễ dàng theo nhu cầu. Tuy nhiên, bạn nên lưu ý rằng chế độ này yêu cầu 1 loadbalancer hoặc gateway để quản lý việc đọc và ghi giữa các node.

Cài đặt log cho Kubernetes với bộ công cụ Grafana LGTM Stack

Bộ công cụ Grafana LGTM Stack (bao gồm Loki cho logs, Grafana cho visualization, Tempo cho traces và Mimir cho metrics) là một hệ sinh thái quan sát mở toàn diện (open source observability ecosystem). Trong bài hướng dẫn này, bạn sẽ sử dụng các thành phần sau:

- [Grafana Loki](https://grafana.com/oss/loki/?pg=blog&plcmt=body-txt): Loki là một hệ thống thu thập log, đa người dùng, có khả năng mở rộng được lấy cảm hứng từ Prometheus

- [Grafana](https://grafana.com/?pg=blog&plcmt=body-txt): Grafana là công cụ trực quan mã nguồn mở hàng đầu. Bài hướng dẫn này sẽ sử dụng bảng điều khiển Grafana để trực quan hóa các log, chạy các truy vấn và thiết lập cảnh báo.

- [Grafana Agent](https://grafana.com/docs/tempo/latest/grafana-agent/?pg=blog&plcmt=body-txt): Bạn có thể coi Grafana Agent là một công cụ thu thập dữ liệu telemetry cho bộ công cụ LGTM.

Chuẩn bị

Chuẩn bị sẵn thành phần sau:

1. Một cluster Kubernetes với một control-plane và ít nhất 2 worker node để xem cách Loki hoạt động trong chế độ có thể mở rộng.

2. Máy local với `kubectl` và `Helm`

Cài đặt Loki và Grafana Agent với Helm

Từ máy local, thêm Grafana Helm chart sử dụng lệnh sau:

helm repo add grafana https://grafana.github.io/helm-charts "grafana" already exists with the same configuration, skipping

 Cập nhật Helm charts sử dụng lệnh sau:

helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "grafana" chart repository Update Complete. ⎈Happy Helming!⎈

Trước khi bắt đầu, ta sẽ xem qua 1 lượt các chart cho Loki

helm search repo loki NAME CHART VERSION APP VERSION DESCRIPTION bitnami/grafana-loki 2.10.4 2.8.3 Grafana Loki is a horizontally scalable, highly... grafana/loki 5.9.2 2.8.3 Helm chart for Grafana Loki in simple, scalable... grafana/loki-canary 0.12.1 2.8.3 Helm chart for Grafana Loki Canary grafana/loki-distributed 0.70.6 2.8.3 Helm chart for Grafana Loki in microservices mode grafana/loki-simple-scalable 1.8.11 2.6.1 Helm chart for Grafana Loki in simple, scalable... grafana/loki-stack 2.9.10 v2.6.1 Loki: like Prometheus, but for logs. grafana/fluent-bit 2.5.0 v2.1.0 Uses fluent-bit Loki go plugin for gathering lo... grafana/promtail 6.11.9 2.8.3 Promtail is an agent which ships the contents o...

Ở đây ta sẽ cài đặt chart grafana/loki. Ta sẽ tách một môi trường riêng cho hệ thống ghi log, điều này sẽ giúp cho ta quản lý việc phân quyền dễ hơn và theo dõi được tài nguyên tiêu thụ tốt hơn. Tạo namespace mới có tên là loki sử dụng lệnh sau: 

kubectl create ns loki namespace/loki created

Loki cần một giải pháp lưu trữ đối tượng tương thích với S3 để lưu trữ logs cluster Kubernetes. Ta sẽ dùng minio . Để kích hoạt ta cần thêm vào file Loki's Helm Chart values

Tạo một file mới tên là values.yml và dán cấu hình như sau vào:

minio: enabled: true

Lưu lại file và cài đặt grafana/loki trong namespace loki sử dụng lệnh như sau:

helm upgrade --install --namespace loki logging grafana/loki -f values.yml --set loki.auth_enabled=false

Kết quả nếu thành công sẽ trông thế nào

Release "logging" does not exist. Installing it now. NAME: logging LAST DEPLOYED: Thu Jul 27 15:49:19 2023 NAMESPACE: loki STATUS: deployed REVISION: 1 NOTES: *********************************************************************** Welcome to Grafana Loki Chart version: 5.9.2 Loki version: 2.8.3 *********************************************************************** Installed components: * grafana-agent-operator * gateway * minio * read * write * backend

Tiếp theo ta sẽ cài đặt frontend Grafana

Cài đặt và cấu hình Grafana với Helm

Grafana là một nển tảng mạnh mẽ cho việc tạo các truy vấn, cảnh báo và xem logs, metrics, … . Cài đặt Grafana trong namespace loki sử dụng lệnh sau

helm upgrade --install --namespace=loki loki-grafana grafana/grafana

Xác thực lại việc cài đặt hệ thống log, sử dụng câu lệnh sau:

kubectl get all -n loki

Kết quả cho ra như sau:

NAME READY STATUS RESTARTS AGE pod/logging-grafana-agent-operator-75c9bd4c87-h4b66 1/1 Running 0 28m pod/logging-loki-logs-n94gx 2/2 Running 0 33m pod/logging-loki-logs-w5xzk 2/2 Running 0 8m2s pod/logging-loki-logs-wnp2v 2/2 Running 0 33m pod/logging-minio-0 1/1 Running 0 27m pod/loki-backend-0 1/1 Running 0 27m pod/loki-backend-1 1/1 Running 4 (21m ago) 28m pod/loki-backend-2 1/1 Running 0 63m pod/loki-canary-25bl6 1/1 Running 0 8m2s pod/loki-canary-gkd2m 1/1 Running 0 33m pod/loki-canary-qwvgq 1/1 Running 0 33m pod/loki-gateway-58fc94b78d-whx42 1/1 Running 3 (27m ago) 28m pod/loki-grafana-b98f7c4d7-gv2cv 1/1 Running 0 28m pod/loki-read-56c7ddb44f-ptvkm 1/1 Running 0 28m pod/loki-read-56c7ddb44f-rk9b7 1/1 Running 0 27m pod/loki-read-56c7ddb44f-tpj4t 1/1 Running 0 63m pod/loki-write-0 1/1 Running 0 28m pod/loki-write-1 1/1 Running 0 27m pod/loki-write-2 1/1 Running 0 63m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/logging-minio ClusterIP 10.93.6.50 <none> 9000/TCP 63m service/logging-minio-console ClusterIP 10.93.116.98 <none> 9001/TCP 63m service/logging-minio-svc ClusterIP None <none> 9000/TCP 63m service/loki-backend ClusterIP 10.93.97.214 <none> 3100/TCP,9095/TCP 63m service/loki-backend-headless ClusterIP None <none> 3100/TCP,9095/TCP 63m service/loki-canary ClusterIP 10.93.68.96 <none> 3500/TCP 63m service/loki-gateway ClusterIP 10.93.85.148 <none> 80/TCP 63m service/loki-grafana ClusterIP 10.93.221.119 <none> 80/TCP 58m service/loki-memberlist ClusterIP None <none> 7946/TCP 63m service/loki-read ClusterIP 10.93.57.181 <none> 3100/TCP,9095/TCP 63m service/loki-read-headless ClusterIP None <none> 3100/TCP,9095/TCP 63m service/loki-write ClusterIP 10.93.171.206 <none> 3100/TCP,9095/TCP 63m service/loki-write-headless ClusterIP None <none> 3100/TCP,9095/TCP 63m service/query-scheduler-discovery ClusterIP None <none> 3100/TCP,9095/TCP 63m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/logging-loki-logs 3 3 3 3 3 <none> 63m daemonset.apps/loki-canary 3 3 3 3 3 <none> 63m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/logging-grafana-agent-operator 1/1 1 1 63m deployment.apps/loki-gateway 1/1 1 1 63m deployment.apps/loki-grafana 1/1 1 1 58m deployment.apps/loki-read 3/3 3 3 63m NAME DESIRED CURRENT READY AGE replicaset.apps/logging-grafana-agent-operator-75c9bd4c87 1 1 1 63m replicaset.apps/loki-gateway-58fc94b78d 1 1 1 63m replicaset.apps/loki-grafana-b98f7c4d7 1 1 1 58m replicaset.apps/loki-read-56c7ddb44f 3 3 3 63m NAME READY AGE statefulset.apps/logging-minio 1/1 63m statefulset.apps/loki-backend 3/3 63m statefulset.apps/loki-write 3/3 63m

Tiếp theo ta cấu hình datasource của grafana vào loki

 Cấu hình datasource trên Grafana

Để truy cập grafana ta cân token để truy cập

kubectl get secret --namespace loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

Token này dùng để đăng nhập vào Grafana. Tiếp theo ta sẽ foward grafana xuống máy local sử dụng lệnh

kubectl port-forward --namespace loki service/loki-grafana 3000:80

Vào trình duyệt truy cấp đến http://localhost:3000 và điền username là admin và mật khẩu là token ở trên.

Thu thập và truy vấn logs Kubernetes với Grafana Loki, Grafana và Grafana Agent (phần 1) - Ảnh 15.

Ở màn hình chính truy cập vào Data Sources 

Thu thập và truy vấn logs Kubernetes với Grafana Loki, Grafana và Grafana Agent (phần 1) - Ảnh 16.

 Tìm đến Loki và chọn làm Data Source

Thu thập và truy vấn logs Kubernetes với Grafana Loki, Grafana và Grafana Agent (phần 1) - Ảnh 17.

Tiếp theo, ta sẽ điền backend của Loki vào, ta phải điền tên miền đầy đủ (FQDN) theo format sau: <service-name>.<namespace-of-the-service>.svc.cluster.local.

Trong trường hợp này ta điền URL là http://loki-gateway.loki.svc.cluster.local. Sau khi điền xong thì có thể bỏ qua các mục khác và bấm nút Save and test. Nếu như mọi thứ hoạt động tốt thì sẽ trả ra tin nhắn như sau: "Data source connected and labels found" as shown below:

Thu thập và truy vấn logs Kubernetes với Grafana Loki, Grafana và Grafana Agent (phần 1) - Ảnh 18.

Vậy tà đã cài đặt và triển khai xong Grafana và Loki, đồng thời gắn datasource vào để có thể truy cập Logs

Theo dõi bài viết tiếp theo để cập nhật những kiến thức về:

1. Truy vấn và xem dữ liệu log Kubernetes bằng Grafana

2. Sử dụng truy vấn số liệu để tạo số liệu từ log

3. Thiết lập cảnh báo từ log

 

SHARE