Giải pháp thu thập nhật ký nhẹ nhẹ Loki

Hiểu rõ mức độ nhẹ nhõm của hệ thống

Thông tin tài liệu chính thức: https://grafana.com/docs/loki/latest/

Giới thiệu

Grafana Loki là công cụ tổng hợp nhật ký, đóng vai trò cốt lõi trong bộ công cụ quan sát hoàn chỉnh.

Loki là kho lưu trữ dữ liệu tối ưu hóa cho việc lưu trữ dữ liệu nhật ký. Việc chỉ số hóa dữ liệu nhật ký theo nhãn giúp Loki khác biệt với các hệ thống nhật ký khác. Khác với các hệ thống nhật ký truyền thống, Loki không lập chỉ mục nội dung bản thân tin nhắn nhật ký mà chỉ dựa vào nhãn.

Agent (còn gọi là client) thu thập nhật ký, chuyển đổi thành luồng dữ liệu và gửi qua API HTTP tới Loki. Promtail được thiết kế riêng cho Loki nhưng nhiều agent khác cũng tích hợp trơn tru với Loki.

Đặc điểm nổi bật của Loki

  • Tiêu thụ bộ nhớ hiệu quả cho việc lập chỉ mục nhật ký

Việc lập chỉ mục dựa trên nhóm nhãn giúp chỉ mục nhỏ hơn đáng kể so với các sản phẩm tổng hợp nhật ký khác. Việc sử dụng bộ nhớ ít hơn giúp giảm chi phí vận hành.

  • Hỗ trợ đa người dùng

Loki cho phép nhiều người dùng sử dụng chung một instance. Dữ liệu của từng người dùng được tách biệt hoàn toàn. Việc cấu hình đa người dùng được thực hiện bằng cách gán ID người dùng trong agent.

  • Ngôn ngữ truy vấn LogQL, đặc trưng của Loki

Người dùng quen với PromQL của Prometheus sẽ thấy LogQL quen thuộc và linh hoạt, có thể tạo các truy vấn dành riêng cho nhật ký. Ngôn ngữ này còn hỗ trợ tạo chỉ số từ dữ liệu nhật ký, tính năng vượt trội hơn so với chỉ việc tổng hợp nhật ký.

  • Tính mở rộng

Loki hoạt động tốt ở quy mô nhỏ. Ở chế độ đơn tiến trình, tất cả các microservice cần thiết chạy trong một tiến trình. Chế độ này phù hợp để kiểm tra Loki, chạy cục bộ hoặc ở quy mô nhỏ.

Loki cũng được thiết kế để mở rộng ngang cho các triển khai quy mô lớn. Mỗi thành phần microservice của Loki có thể tách thành tiến trình riêng biệt và cấu hình cho phép mở rộng từng thành phần.

  • Tính linh hoạt

Nhiều agent (client) hỗ trợ plugin. Điều này cho phép cấu trúc quan sát hiện tại thêm Loki vào bộ công cụ tổng hợp nhật ký mà không cần thay đổi các thành phần hiện tại.

  • Tích hợp với Grafana

Loki tích hợp liền mạch với Grafana, cung cấp bộ công cụ quan sát hoàn chỉnh.

Loki / Promtail / Grafana so với EFK

Stack EFK (Elasticsearch, Fluentd, Kibana) dùng để thu thập, trực quan hóa và truy vấn nhật ký từ nhiều nguồn.

Dữ liệu trong Elasticsearch được lưu trữ dưới dạng đối tượng JSON không cấu trúc. Các khóa và nội dung của mỗi đối tượng đều được lập chỉ mục. Sau đó có thể truy vấn dữ liệu bằng ngôn ngữ truy vấn DSL hoặc Lucene. Trong khi đó, Loki ở chế độ đơn nhị phân có thể lưu trữ dữ liệu trên đĩa, nhưng ở chế độ mở rộng ngang, dữ liệu được lưu trữ trên hệ thống lưu trữ đám mây như S3, GCS hoặc Cassandra. Nhật ký được lưu trữ dưới dạng văn bản thuần túy với một tập hợp nhãn tên và giá trị, chỉ lập chỉ mục các cặp nhãn. Sự đánh đổi này giúp giảm chi phí vận hành so với việc lập chỉ mục toàn bộ và cho phép nhà phát triển ghi nhật ký tích cực từ ứng dụng. Sử dụng LogQL để truy vấn nhật ký trong Loki. Tuy nhiên, do sự đánh đổi thiết kế này, các truy vấn LogQL lọc theo nội dung (văn bản trong dòng nhật ký) cần tải tất cả các khối khớp với nhãn được định nghĩa trong truy vấn trong phạm vi tìm kiếm.

Fluentd thường được sử dụng để thu thập nhật ký và chuyển đến Elasticsearch. Fluentd được gọi là bộ thu thập dữ liệu, có thể thu thập nhật ký từ nhiều nguồn, xử lý và chuyển đến một hoặc nhiều đích.

Trong khi đó, trường hợp sử dụng của Promtail được thiết kế riêng cho Loki. Chế độ hoạt động chính của nó là phát hiện các tệp nhật ký trên đĩa và chuyển chúng đến Loki cùng với một tập hợp nhãn. Promtail có thể thực hiện phát hiện dịch vụ cho các pod Kubernetes chạy cùng node với Promtail, hoạt động như sidecar hoặc driver nhật ký Docker, đọc nhật ký từ thư mục được chỉ định và theo dõi nhật ký systemd.

Cách Loki biểu diễn nhật ký theo nhóm nhãn giống cách Prometheus biểu diễn chỉ số. Khi triển khai cùng môi trường với Prometheus, do sử dụng cơ chế phát hiện dịch vụ giống nhau, nhật ký của Promtail thường có cùng nhãn với chỉ số ứng dụng. Nhật ký và chỉ số có cùng nhãn giúp người dùng chuyển đổi ngữ cảnh giữa chỉ số và nhật ký một cách liền mạch, hỗ trợ phân tích nguyên nhân gốc rễ.

Kibana dùng để trực quan hóa và tìm kiếm dữ liệu Elasticsearch, và rất mạnh trong việc phân tích dữ liệu này. Kibana cung cấp nhiều công cụ trực quan để phân tích dữ liệu, ví dụ bản đồ vị trí, học máy để phát hiện bất thường và đồ thị để khám phá mối quan hệ dữ liệu. Cảnh báo có thể được cấu hình để thông báo cho người dùng khi có sự kiện bất thường.

Trong khi đó, Grafana được thiết kế riêng cho dữ liệu chuỗi thời gian từ các nguồn như Prometheus và Loki. Bảng điều khiển có thể được thiết lập để trực quan hóa chỉ số (sắp tới sẽ hỗ trợ nhật ký) và có thể thực hiện truy vấn tạm thời cho dữ liệu của bạn. Giống như Kibana, Grafana hỗ trợ gửi cảnh báo dựa trên chỉ số của bạn.

Sơ đồ kiến trúc

Sơ đồ thu thập nhật ký

Vui lòng đặt đường dẫn bài viết gốc ở đầu bài viết: https://www.cnblogs.com/Sunzz/p/15190702.html

Giới thiệu Loki

Promtail: Công cụ thu thập nhật ký

Loki: Hệ thống tổng hợp nhật ký

Grafana: Công cụ trực quan hóa

I. Triển khai Loki

Địa chỉ chính thức: GitHub - grafana/loki: Tương tự Prometheus, nhưng dành cho nhật ký.

1. loki

Chỉnh sửa tệp cấu hình loki loki-config.yaml

Tham khảo: https://grafana.com/docs/loki/latest/configuration/examples/

https://grafana.com/docs/loki/latest/installation/docker/

 1 ---
 2 apiVersion: v1
 3 kind: ConfigMap
 4 metadata:
 5   name: loki-config
 6   labels:
 7     name: loki
 8 data:
 9   loki-config.yaml: |-
10     auth_enabled: false
11 
12     server:
13       http_listen_port: 3100
14       grpc_listen_port: 9096
15 
16     ingester:
17       lifecycler:
18         address: 127.0.0.1
19         ring:
20           kvstore:
21             store: inmemory
22           replication_factor: 1
23         final_sleep: 0s
24       chunk_idle_period: 5m
25       chunk_retain_period: 30s
26 
27       chunk_target_size: 1048576  # Loki sẽ cố gắng xây dựng các khối đến 1.5MB, gửi trước nếu chunk_idle_period hoặc max_chunk_age đạt trước
28       max_transfer_retries: 0     # Tắt khả năng chuyển khối
29 
30     schema_config:
31       configs:
32       - from: 2021-08-18
33         store: boltdb
34         object_store: filesystem
35         schema: v11
36         index:
37           prefix: index_
38           period: 168h
39 
40     storage_config:
41       boltdb:
42         directory: /tmp/loki/index
43 
44       filesystem:
45         directory: /tmp/loki/chunks
46 
47     limits_config:
48       enforce_metric_name: false
49       reject_old_samples: true
50       reject_old_samples_max_age: 168h
51 
52       ingestion_rate_mb: 15
53 
54     chunk_store_config:
55       max_look_back_period: 0s
56 
57     table_manager:
58       retention_deletes_enabled: false
59       retention_period: 0s
kubectl apply -f  loki-config.yaml

Tạo Service và StatefulSet, loki,.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: loki
  annotations:
    k8s.kuboard.cn/displayName: loki
    k8s.kuboard.cn/workload: loki
  labels:
    name: loki
spec:
  ports:
    - name: http
      port: 3100
      protocol: TCP
      targetPort: 3100
  selector:
    name: loki
 
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: loki
spec:
  serviceName: loki
  selector:
    matchLabels:
      name: loki
  template:
    metadata:
      labels:
        name: loki
    spec:
      volumes:
      - name: loki-config
        configMap:
          #defaultMode: 0640
          name: loki-config
      containers:
      - name: loki
        #image: grafana/loki:2.3.0
        image: grafana/loki:master
        args:
        - -config.file=/etc/loki/loki-config.yaml
        ports:
        - containerPort: 3100
          name: loki
          protocol: TCP
        volumeMounts:
        - name: loki-config
          mountPath: /etc/loki/
          readOnly: true

Thực thi lệnh tạo:

kubectl apply -f loki.yaml

2.grafana

Bạn có thể tùy chỉnh phần lưu trữ theo nhu cầu, nếu không thay đổi sẽ là emptyDir, bạn hiểu rồi đó. Tài khoản mật khẩu là admin/admin123. Có thể tự thay đổi

apiVersion: v1
kind: Service
metadata:
  name: grafana
  labels:
    k8s-app: grafana
spec:
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: 3000
  selector:
    k8s-app: grafana
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  labels:
    k8s-app: grafana
spec:
  selector:
    matchLabels:
      k8s-app: grafana
  template:
    metadata:
      labels:
        k8s-app: grafana
    spec:
     # initContainers:             ## Container khởi tạo, dùng để thay đổi nhóm và người dùng của thư mục lưu trữ
     # - name: init-file
     #   image: busybox:1.28
     #   imagePullPolicy: IfNotPresent
     #   securityContext:
     #     runAsUser: 0
     #   command: ['chown', '-R', "472:0", "/var/lib/grafana"]
     #   volumeMounts:
     #   - name: data
     #     mountPath: /var/lib/grafana
     #     subPath: grafana
      containers:                
      - name: grafana             ## Container Grafana
        #image: grafana/grafana
        image: grafana/grafana:7.4.3
        #securityContext:          ## Chính sách bảo mật container, thiết lập nhóm và người dùng chạy container
        #  fsGroup: 0
        #  runAsUser: 472
        ports:
        - name: http
          containerPort: 3000
          protocol: TCP
        env:                      ## Cấu hình biến môi trường, thiết lập tên người dùng/ mật khẩu quản trị mặc định của Grafana
        - name: GF_SECURITY_ADMIN_USER
          value: "admin"
        - name: GF_SECURITY_ADMIN_PASSWORD
          value: "admin123"
        readinessProbe:           ##探针就绪
          failureThreshold: 10
          httpGet:
            path: /api/health
            port: 3000
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 30
        livenessProbe:            ##探针存活
          failureThreshold: 10
          httpGet:
            path: /api/health
            port: 3000
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        volumeMounts:            ## Cấu hình gắn kết container
        - name: data
          mountPath: /var/lib/grafana
          subPath: grafana
      volumes:                   ## Cấu hình gắn kết lưu trữ chung
      - name: data
        emptyDir: {}
        #persistentVolumeClaim:
        #  claimName: grafana     ## Chỉ định PVC sử dụng

3.promtail

Áp dụng kết hợp promtail để thu thập nhật ký.

Ở đây sử dụng mô hình Sidecar. Một pod chạy hai container, một là container ứng dụng, một là promtail, hai container gắn cùng thư mục lưu trữ, promtail có thể thu thập nhật ký.

Chỉnh sửa promtail-config.yaml, có thể thiết lập nhãn theo từng nghiệp vụ.

Tham khảo: https://grafana.com/docs/loki/latest/clients/promtail/installation/

 1 ---
 2 apiVersion: v1
 3 kind: ConfigMap
 4 metadata:
 5   name: promtail-config
 6   labels:
 7     k8s-app: promtail
 8 data:
 9   promtail.yaml: |-
10     server:
11       http_listen_port: 9080
12       grpc_listen_port: 0
13     
14     positions:
15       filename: ./positions.yaml # Vị trí này cần được ghi bởi Promtail.
16       #filename: /tmp/positions.yaml # Vị trí này cần được ghi bởi Promtail.
17     
18     client:
19       url: http://loki:3100/loki/api/v1/push
20    
21     scrape_configs:
22     - job_name: system
23     #- job_name: busybox
24       static_configs:
25       - targets:
26           - localhost
27         labels:
28           job: varlog    #Tùy chỉnh
29           host: busybox  #Tùy chỉnh
30           __path__: /tmp/*.log   Thư mục thu thập nhật ký
 1 ---
 2 apiVersion: apps/v1
 3 kind: Deployment
 4 metadata:
 5   name: promtail-deployment
 6 spec:
 7   replicas: 2
 8   selector:
 9     matchLabels:
10       name: promtail
11   template:
12     metadata:
13       labels:
14         name: promtail
15     spec:
16       volumes:
17       - name: log
18         emptyDir: {}
19       - name: promtail-config
20         configMap:
21           name: promtail-config
22 
23       containers:
24       - name: promtail
25         image: grafana/promtail:master
26         imagePullPolicy: IfNotPresent
27         args:
28         - -config.file=/etc/promtail/promtail.yaml
29         volumeMounts:
30         - name: log
31           mountPath: /tmp/
32         - name: promtail-config
33           mountPath: /etc/promtail/
34 
35       - name: busybox
36         image: centos:7
37         imagePullPolicy: IfNotPresent
38         args:
39         - /bin/sh
40         - -c
41         - "while : ; do echo '--- promtail log test ---' `date` && echo '--- promtail log test ---' `date` >> /tmp/healthy.log && sleep 3 ; done "
42         volumeMounts:
43         - name: log
44           mountPath: /tmp/

II. Cấu hình Grafana và xem nhật ký

Kiểm tra cổng NodePort của Grafana

kubectl get svc

Truy cập trang Grafana bằng IP Node + cổng vừa xem

Nhập tài khoản mật khẩu để đăng nhập admin admin123

Cấu hình nguồn dữ liệu

Tìm đến loki, tại trường url nhập tên service loki và cổng, tức là http://loki:3100. Sau đó nhấn nút "Save && test"

Xem nhật ký:

Chọn host hoặc job để xem nhật ký của các nghiệp vụ khác nhau

Sẽ thấy nội dung nhật ký

Vui lòng đặt đường dẫn bài viết gốc ở đầu bài viết: https://www.cnblogs.com/Sunzz/p/15190702.html

Kết thúc, giải pháp thu thập nhật ký Loki+Promtail+Grafana hoàn tất.

Thẻ: Grafana Loki Promtail Kubernetes LogQL Grafana

Đăng vào ngày 24 tháng 9 lúc 01:29