Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus

Xin chào cư dân Khabrovsk! Vào đêm trước ngày bắt đầu tuyển sinh mới cho khóa học "Các phương pháp và công cụ DevOps" Chúng tôi đã chuẩn bị một bản dịch tài liệu thú vị cho bạn.

Bài viết này là một giới thiệu ngắn gọn về Loki. Dự Án Loki được hỗ trợ bởi Grafana và nhằm mục đích thu thập nhật ký tập trung (từ máy chủ hoặc vùng chứa).

Nguồn cảm hứng chính cho Loki là Prometheus với ý tưởng áp dụng phương pháp quản lý nhật ký của mình:

  • sử dụng nhãn để lưu trữ dữ liệu
  • tiêu thụ ít tài nguyên

Chúng ta sẽ quay lại cách Prometheus hoạt động và đưa ra một số ví dụ về cách sử dụng nó trong bối cảnh Kubernetes.

Đôi lời về Prometheus

Để hiểu đầy đủ cách Loki hoạt động, điều quan trọng là phải lùi lại một bước và nhớ một chút về Prometheus.

Một trong những tính năng đặc biệt của Prometheus là trích xuất số liệu từ các điểm thu thập (thông qua nhà xuất khẩu) và lưu trữ chúng trong TSDB (Cơ sở dữ liệu chuỗi thời gian), với việc bổ sung siêu dữ liệu dưới dạng nhãn.

Tại sao bạn cần nó

Gần đây, Prometheus đã trở thành tiêu chuẩn thực tế trong thế giới container và Kubernetes: việc cài đặt nó rất đơn giản và cụm Kubernetes đi kèm với điểm cuối riêng cho Prometheus. Prometheus cũng có thể trích xuất số liệu từ các ứng dụng được triển khai trong vùng chứa trong khi lưu trữ các nhãn cụ thể. Vì vậy, việc giám sát ứng dụng rất dễ thực hiện.

Thật không may, vẫn chưa có giải pháp chìa khóa trao tay cho việc quản lý nhật ký và bạn phải tự tìm giải pháp cho mình:

  • dịch vụ đám mây được quản lý để tập trung nhật ký (AWS, Azure hoặc Google)
  • dịch vụ giám sát “giám sát như một dịch vụ” (ví dụ: Datadog)
  • tạo dịch vụ thu thập nhật ký của riêng bạn.

Đối với tùy chọn thứ ba, theo truyền thống, tôi sử dụng Elaticsearch, mặc dù thực tế là tôi không phải lúc nào cũng hài lòng với nó (đặc biệt là độ nặng và độ phức tạp của cấu hình).

Loki được thiết kế để đơn giản hóa việc thực hiện theo các nguyên tắc sau:

  • bắt đầu thật đơn giản
  • tiêu thụ ít tài nguyên
  • làm việc độc lập mà không cần bảo trì đặc biệt
  • đóng vai trò bổ sung cho Prometheus để giúp điều tra lỗi

Tuy nhiên, sự đơn giản này phải trả giá bằng một số thỏa hiệp. Một trong số đó là không lập chỉ mục nội dung. Vì vậy, việc tìm kiếm văn bản chưa hiệu quả, phong phú và không cho phép thống kê về nội dung văn bản. Nhưng vì Loki muốn tương đương với grep và là phần bổ sung cho Prometheus nên đây không phải là bất lợi.

Điều tra tai nạn

Để hiểu rõ hơn tại sao Loki không cần lập chỉ mục, chúng ta hãy quay lại phương pháp điều tra sự cố mà các nhà phát triển Loki đã sử dụng:

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
1 Cảnh báo → 2 Trang tổng quan → 3 Truy vấn Adhoc → 4 Tổng hợp nhật ký → 5 Theo dõi phân tán → 6 Khắc phục!
(1 Cảnh báo → 2 Trang tổng quan → 3 Truy vấn Adhoc → 4 Tổng hợp nhật ký → 5 Theo dõi phân tán → 6 Sửa lỗi!)

Ý tưởng là chúng tôi nhận được một số loại cảnh báo (Thông báo chậm, SMS, v.v.) và sau đó:

  • nhìn vào bảng điều khiển Grafana
  • xem số liệu dịch vụ (ví dụ: trong Prometheus)
  • xem các mục nhật ký (ví dụ: trong Elaticsearch)
  • có thể xem xét các dấu vết được phân phối (Jaeger, Zipkin, v.v.)
  • và cuối cùng là khắc phục vấn đề ban đầu.

Ở đây, trong trường hợp ngăn xếp Grafana + Prometheus + Elaticsearch + Zipkin, bạn sẽ phải sử dụng bốn công cụ khác nhau. Để giảm thời gian, sẽ thật tuyệt nếu có thể thực hiện tất cả các bước này bằng một công cụ: Grafana. Điều đáng chú ý là phương pháp nghiên cứu này đã được triển khai trong Grafana kể từ phiên bản 6. Do đó, có thể truy cập dữ liệu Prometheus trực tiếp từ Grafana.

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
Màn hình Explorer phân chia giữa Prometheus và Loki

Từ màn hình này, bạn có thể xem nhật ký Loki liên quan đến số liệu của Prometheus bằng cách sử dụng khái niệm chia đôi màn hình. Kể từ phiên bản 6.5, Grafana cho phép bạn phân tích id theo dõi trong các mục nhật ký Loki để theo các liên kết đến các công cụ theo dõi phân tán yêu thích của bạn (Jaeger).

Bài kiểm tra Loki địa phương

Cách dễ nhất để kiểm tra Loki cục bộ là sử dụng docker-compose. Tệp soạn thảo docker được đặt trong kho Loki. Bạn có thể lấy kho lưu trữ bằng lệnh sau git:

$ git clone https://github.com/grafana/loki.git

Sau đó, bạn cần vào thư mục sản xuất:

$ cd production

Sau này, bạn có thể nhận được phiên bản mới nhất của hình ảnh Docker:

$ docker-compose pull

Cuối cùng, ngăn xếp Loki được khởi chạy bằng lệnh sau:

$ docker-compose up

Kiến trúc Loki

Đây là một sơ đồ nhỏ với kiến ​​trúc Loki:

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
Nguyên tắc kiến ​​trúc Loki

Máy khách web chạy các ứng dụng trên máy chủ, Promtail thu thập nhật ký và gửi chúng cho Loki, máy khách web cũng gửi siêu dữ liệu cho Loki. Loki tổng hợp mọi thứ và truyền nó cho Grafana.
Loki được phóng đi. Để xem các thành phần có sẵn, hãy chạy lệnh sau:

$ docker ps

Trong trường hợp Docker mới được cài đặt, lệnh sẽ trả về kết quả sau:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Chúng ta thấy các thành phần sau:

  • Promtail: đại lý chịu trách nhiệm tập trung nhật ký
  • Grafana: một công cụ bảng điều khiển nổi tiếng
  • Loki: Daemon tập trung dữ liệu

Là một phần của cơ sở hạ tầng cổ điển (ví dụ: dựa trên máy ảo), tác nhân Promtail phải được triển khai trên mỗi máy. Grafana và Loki có thể được cài đặt trên cùng một máy.

Triển khai vào Kubernetes

Việc cài đặt các thành phần Loki trên Kubernetes sẽ như sau:

  • daemonSet để triển khai tác nhân Promtail trên mỗi máy trong cụm máy chủ
  • Triển khai Loki
  • và việc cuối cùng là việc triển khai Grafana.

May mắn thay, Loki có sẵn dưới dạng gói Helm, giúp việc triển khai trở nên dễ dàng.

Cài đặt qua Heml

Bạn đã cài đặt Heml rồi. Nó có thể được tải xuống từ kho GitHub của dự án. Nó được cài đặt bằng cách giải nén kho lưu trữ tương ứng với kiến ​​trúc của bạn và thêm phần điều khiển vào $PATH.

Lưu ý: phiên bản 3.0.0 của Helm đã được phát hành gần đây. Vì đã có nhiều thay đổi nên người đọc nên chờ một chút trước khi sử dụng..

Thêm nguồn cho Helm

Bước đầu tiên là thêm kho lưu trữ “loki” bằng lệnh sau:

$ helm add loki https://grafana.github.io/loki/charts

Sau này, bạn có thể tìm kiếm các gói có tên “loki”:

$ helm search loki

Kết quả:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Các gói này có các tính năng sau:

  • gói loki/loki chỉ phù hợp với máy chủ Loki
  • gói loki/fluent-bit cho phép bạn triển khai DaemonSet bằng cách sử dụng Fluent-bin để thu thập nhật ký thay vì Promtail
  • gói loki/promtail chứa một tác nhân thu thập tệp nhật ký
  • gói loki/loki-stack, cho phép bạn triển khai ngay Loki cùng với Promtail.

Cài đặt Loki

Để triển khai Loki cho Kubernetes, hãy chạy lệnh sau trong namespace “monitoring”:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Để lưu vào đĩa, thêm tham số --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Lưu ý: nếu bạn muốn triển khai Grafana cùng lúc thì hãy thêm tham số --set grafana.enabled = true

Khi bạn chạy lệnh này, bạn sẽ nhận được kết quả đầu ra sau:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Nhìn vào trạng thái của các pod trong namespace “monitoring”, chúng ta có thể thấy mọi thứ đã được triển khai:

$ kubectl -n monitoring get pods -l release=loki

Kết quả:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Tất cả các nhóm đang chạy. Bây giờ là lúc để làm một số bài kiểm tra!

Kết nối với Grafana

Để kết nối với Grafana trong Kubernetes, bạn cần mở một đường hầm tới nhóm của nó. Dưới đây là lệnh mở cổng 3000 cho nhóm Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Một điểm quan trọng khác là cần khôi phục mật khẩu quản trị viên Grafana. Mật khẩu được giữ bí mật loki-grafana trong lĩnh vực .data.admin-user ở định dạng base64.

Để khôi phục nó, bạn cần chạy lệnh sau:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Sử dụng mật khẩu này cùng với tài khoản quản trị viên mặc định (quản trị viên).

Xác định nguồn dữ liệu Loki trong Grafana

Trước hết, hãy đảm bảo rằng nguồn dữ liệu Loki đã được tạo (Cấu hình/Nguồn dữ liệu).
Đây là một ví dụ:

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
Ví dụ thiết lập nguồn dữ liệu cho Loki

Bằng cách nhấp vào “Kiểm tra”, bạn có thể kiểm tra kết nối với Loki.

Đưa ra yêu cầu với Loki

Bây giờ hãy truy cập Grafana vào phần “Khám phá”. Khi nhận nhật ký từ vùng chứa, Loki sẽ thêm siêu dữ liệu từ Kubernetes. Vì vậy, có thể xem nhật ký của một vùng chứa cụ thể.

Ví dụ: để chọn nhật ký vùng chứa quảng cáo, bạn có thể sử dụng truy vấn sau: {container_name = "promtail"}.
Ở đây cũng nhớ chọn nguồn dữ liệu Loki.

Truy vấn này sẽ trả về hoạt động của vùng chứa như sau:

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
Kết quả truy vấn trong Grafana

Thêm vào trang tổng quan

Bắt đầu với Grafana 6.4, bạn có thể đặt thông tin nhật ký trực tiếp trên trang tổng quan. Sau này, người dùng sẽ có thể nhanh chóng chuyển đổi giữa số lượng yêu cầu trên trang web của mình và dấu vết ứng dụng.

Dưới đây là ví dụ về trang tổng quan triển khai tương tác này:

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
Bảng thông tin mẫu với số liệu Prometheus và nhật ký Loki

Tương lai của Loki

Tôi bắt đầu sử dụng Loki vào tháng 0.1/tháng 1 với phiên bản 1.1. Hôm nay phiên bản 1.2, thậm chí XNUMX và XNUMX đã được phát hành.

Phải thừa nhận rằng phiên bản 0.1 chưa đủ ổn định. Nhưng 0.3 đã có dấu hiệu trưởng thành thực sự và các phiên bản tiếp theo (0.4, rồi 1.0) chỉ củng cố thêm ấn tượng này.

Sau 1.0.0, không ai có lý do gì để không sử dụng công cụ tuyệt vời này.

Những cải tiến tiếp theo không phải là về Loki mà là sự tích hợp của nó với Grafana xuất sắc. Trên thực tế, Grafana 6.4 đã tích hợp tốt với bảng điều khiển.

Grafana 6.5, được phát hành gần đây, cải thiện hơn nữa sự tích hợp này bằng cách tự động nhận dạng nội dung nhật ký ở định dạng JSON.

Video dưới đây cho thấy một ví dụ nhỏ về cơ chế này:

Loki - thu thập nhật ký bằng cách sử dụng phương pháp Prometheus
Sử dụng chuỗi Loki được hiển thị trong Grafana

Ví dụ: có thể sử dụng một trong các trường JSON cho:

  • liên kết đến công cụ bên ngoài
  • lọc nội dung nhật ký

Ví dụ: bạn có thể nhấp vào traceId để truy cập Zipkin hoặc Jaeger.

Như thường lệ, chúng tôi rất mong nhận được ý kiến ​​đóng góp của bạn và mời bạn tham gia mở hội thảo trực tuyến, nơi chúng ta sẽ nói về cách ngành DevOps phát triển trong năm 2019 và thảo luận về các lộ trình phát triển khả thi cho năm 2020.

Nguồn: www.habr.com