日誌系統 Loki - Promtail 詳解

主流的日誌收集架構一般採用 ELK/EFK/EFLK ,但是這些都比較適合在重量級、需要日誌數據清理的場景下使用。

雲原生環境下, Grafana + Loki + Promtail 橫空出世。

“Like Prometheus, but for logs.”

整體介紹

Loki 是受 Prometheus 啓發的水平可擴展、高可用、多租戶日誌聚合系統。非常適合採集 Kubernetes Pod 的日誌,關鍵 Loki 還易於操作且更加輕量級(相比 ELK/EFK/EFLK )。

在 Loki 架構中有以下幾個概念:

Loki 整體架構

Promtail 介紹

Promtail 將本地日誌內容傳送到 Loki 實例。需要監控的應用程序的機器上都需要部署該組件。

它的主要工作流程可以劃分爲:

promtail 原理

Loki 介紹

Loki 是用來接受、存儲、處理、查詢日誌的集合體。

Loki 採用讀寫分離架構,關鍵組件有:

loki 組件通信

Loki 提供了兩種部署方式:

Loki 組件架構

使用 Helm 部署

以 Helm 部署 Loki (StatefulSet 方式) 和 Promtail(DaemonSet 方式)採集 k8s pod 應用的日誌爲例

# 添加 grafana 源
helm repo add grafana https://grafana.github.io/helm-charts

# 創建命名空間
kubectl create ns grafana
kubectl create ns loki

# 部署 grafana,並開啓 NodePort 訪問
# 用戶名 admin
# 密碼 kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
helm install grafana grafana/grafana --set "service.type=NodePort" -n grafana

# 部署 loki
helm install loki grafana/loki -f loki-config.yaml -n loki

# 部署 promtail
helm install promtail grafana/promtail -f promtail-config.yaml -n loki

loki-config.yaml 配置:

# loki 配置
config:
  limits_config:
   # Distributor 分發器的日誌接收速率限制
    ingestion_rate_mb: 8
# 實例數
replicas: 1
# 限制使用資源
resources:
  limits:
    cpu: 2000m
    memory: 2048Mi
# 掛載宿主機時間
extraVolumeMounts:
  - name: host-time
    mountPath: /etc/localtime
extraVolumes:
  - name: host-time
    hostPath:
      path: /etc/localtime

promtail-config.yaml 配置:

extraArgs:
  # 添加全局靜態標籤 cluster:dev
  - -client.external-labels=cluster=dev
# 限制使用資源
resources:
  limits:
    cpu: 512m
    memory: 512Mi
# 掛載宿主機時間
extraVolumeMounts:
  - name: host-time
    mountPath: /etc/localtime
extraVolumes:
  - name: host-time
    hostPath:
      path: /etc/localtime
# promtail 配置
config:
  lokiAddress: http://loki-ip:3100/loki/api/v1/push
  snippets:
    # 清除默認配置
    scrapeConfigs: ""
    # 自定義配置
    extraScrapeConfigs: |
      # 通過 kubernetes_sd_configs:pod 配置 pod 日誌,參考 https://grafana.com/docs/loki/latest/clients/promtail/configuration/#kubernetes_sd_config
      - job_name: kubernetes-pods-app
        # 流水線
        pipeline_stages:
          {{- toYaml .Values.config.snippets.podPipelineStages | nindent 4 }}
        kubernetes_sd_configs:
          - role: pod
        relabel_configs:
          # 把 pod 所有的標籤暴露出來
          - action: labelmap
            regex: __meta_kubernetes_pod_label_(.+)
            replacement: $1
            target_label: $1
          - action: drop
            regex: .+
            source_labels:
              - __meta_kubernetes_pod_label_app_kubernetes_io_name
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_ip
            target_label: pod_ip
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_label_app
            target_label: app
          - action: drop
            regex: ''
            source_labels:
              - app
          - action: replace
            source_labels:
              - __meta_kubernetes_pod_label_component
            target_label: component
          {{if .Values.config.snippets.addScrapeJobLabel }}
          - action: replace
            replacement: kubernetes-pods-app
            target_label: scrape_job
          {{- end }}
          {{- toYaml .Values.config.snippets.common | nindent 4 }}
    podPipelineStages:
      - docker: {}

Grafana 添加 Loki 數據源:

Grafana 中按照標籤查詢日誌:

nginx 日誌示例:

日誌告警

=======

Loki 支持三種模式創建日誌告警:

以下主要介紹 LogQL 轉化爲 Prometheus 指標的方式實現告警。

首先,在 Grafana 添加 Prometheus 數據源,URL 只需要填入 http://loki-ip:3100/loki 即可將 LogQL 查詢轉換爲 Prometheus 指標。

在告警規則配置中配置 Notification channels

新建一個 Dashboard ,配置一個面板,例如:當 nginx 出現 404 狀態碼,觸發告警:

count_over_time({app="nginx-pod"} |= "404" [1m])

手動訪問 nginx 404 頁面,可以看到日誌已經產生告警:

關於更多 Loki 和 Promtail 配置,以及日誌的告警,推薦直接看官方文檔,已經很詳細了。這裏不過多介紹。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/qwv_4Q-QvxXBo7Qkt-Mqvw