Loki - 使用 Prometheus 方法收集日誌

致敬,哈布羅維特人! 預計該課程將開始新的註冊 “DevOps 實踐和工具” 為您準備了有趣材料的翻譯。

本文是對洛基的簡單介紹。 洛基計劃 由格拉法納支持 旨在集中收集日誌(來自服務器或容器)。

洛基的主要靈感是 普羅米修斯 把他的方法應用於日誌管理的想法:

  • 使用標籤來存儲數據
  • 資源消耗低

我們將回到 Prometheus 的原理,並給出一些在 Kubernetes 環境中使用它的示例。

關於普羅米修斯的幾句話

為了充分理解 Loki 的工作原理,退後一步並重新審視一下 Prometheus 非常重要。

Prometheus 的顯著特徵之一是從收集點(通過導出器)提取指標並將其存儲在 TSDB(Time Series Data Base,時間序列數據庫)中,並以標籤形式添加元數據。

你為什麼需要它

最近,Prometheus 已經成為容器和 Kubernetes 領域事實上的標準:它的安裝非常簡單,Kubernetes 集群最初就有 Prometheus 的端點。 Prometheus 還可以從容器中部署的應用程序中提取指標,同時維護特定標籤。 因此,應用程序監控非常容易實現。

不幸的是,日誌管理仍然沒有交鑰匙解決方案,您必須自己找到解決方案:

  • 用於集中日誌的託管雲服務(AWS、Azure 或 Google)
  • 監控服務“監控即服務”(例如,Datadog)
  • 創建您自己的日誌收集服務。

對於第三個選項,我傳統上使用 Elasticsearch,儘管事實上我並不總是對它感到滿意(尤其是它的笨重和設置的複雜性)。

Loki 的設計遵循以下原則,易於實現:

  • 容易上手
  • 消耗很少的資源
  • 獨立工作,無需任何特殊維護
  • 作為 Prometheus 的附加組件來幫助錯誤調查

然而,這種簡單性是以一些妥協為代價的。 其中之一是不對內容建立索引。 因此,文本搜索不是很高效或豐富,並且不允許您對文本內容進行統計。 但由於 Loki 希望成為 grep 的等價物並補充 Prometheus,因此這並不是一個缺點。

事件調查

為了更好地理解為什麼 Loki 不需要索引,讓我們回到 Loki 開發人員使用的事件調查方法:

Loki - 使用 Prometheus 方法收集日誌
1 警報 → 2 儀表板 → 3 即席查詢 → 4 日誌聚合 → 5 分佈式跟踪 → 6 修復!
(1 警告 → 2 儀表板 → 3 即席查詢 → 4 日誌聚合 → 5 分佈式跟踪 → 6 修復!)

我們的想法是,我們收到某種警報(Slack 通知、短信等),然後:

  • 查看 Grafana 儀表板
  • 查看服務指標(例如,在 Prometheus 中)
  • 查看日誌條目(例如,在 Elasticsearch 中)
  • 也許看看分佈式跟踪(Jaeger、Zipkin 等)
  • 並最終解決原來的問題。

在這裡,對於 Grafana + Prometheus + Elasticsearch + Zipkin 堆棧的情況,您將必須使用四種不同的工具。 為了節省時間,最好能夠使用一種工具完成所有這些步驟:Grafana。 值得注意的是,這種研究方法從 Grafana 第 6 版開始就已在 Grafana 中實現。因此,可以直接從 Grafana 訪問 Prometheus 數據。

Loki - 使用 Prometheus 方法收集日誌
資源管理器屏幕分為普羅米修斯和洛基

在此屏幕中,您可以使用分屏概念查看 Loki 中與 Prometheus 指標相關的日誌。 從版本 6.5 開始,Grafana 允許您解析 Loki 日誌條目中的跟踪 ID,以跟踪您最喜歡的分佈式跟踪工具 (Jaeger) 的鏈接。

Loki本地測試

在本地測試 Loki 最簡單的方法是使用 docker-compose。 docker-compose 文件位於 Loki 存儲庫中。 您可以使用以下命令獲取存儲庫 git:

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

然後需要切換到生產目錄:

$ cd production

之後,您可以獲得最新的Docker鏡像:

$ docker-compose pull

最後,使用以下命令啟動 Loki 堆棧:

$ docker-compose up

洛基架構

這是 Loki 架構的小圖:

Loki - 使用 Prometheus 方法收集日誌
Loki 架構原則

Web 客戶端在服務器上運行應用程序,Promtail 收集日誌並將其發送給 Loki,Web 客戶端還將元數據發送給 Loki。 Loki 聚合所有內容並將其傳遞給 Grafana。
洛基正在奔跑。 要查看可用組件,請運行以下命令:

$ docker ps

如果是新安裝的 Docker,該命令應返回以下結果:

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

我們看到以下組件:

  • Promtail:負責集中日誌的代理
  • Grafana:著名的儀表板工具
  • Loki:數據集中守護進程

作為經典基礎架構(例如基於虛擬機)的一部分,Promtail 代理必須部署在每台機器上。 Grafana 和 Loki 可以安裝在同一台機器上。

部署到 Kubernetes

在 Kubernetes 中安裝 Loki 組件如下:

  • daemon設置為在服務器集群中的每台機器上部署Promtail代理
  • 洛基部署
  • 最後一個是Grafana的部署。

幸運的是,Loki 可作為 Helm 包提供,使其易於部署。

通過 Heml 安裝

您應該已經安裝了 Heml。 可以從項目的 GitHub 存儲庫下載它。 它是通過提取適合您的架構的存檔並將 helm 添加到來安裝的 $PATH.

注: Helm 3.0.0 版本最近發布。 由於改動較多,建議讀者稍等片刻後再開始使用。.

添加 Helm 源

第一步是使用以下命令添加“loki”存儲庫:

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

之後,您可以搜索名為“loki”的包:

$ helm search loki

其結果是:

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...

這些軟件包具有以下功能:

  • 洛基 只匹配Loki服務器
  • 洛基/流利位 允許您使用 Fluent-bin 來部署 DaemonSet 來收集日誌而不是 Promtail
  • 洛基/promtail 包含日誌收集代理
  • 洛基/洛基堆棧,讓您可以立即將 Loki 與 Promtail 一起部署。

安裝洛基

要將 Loki 部署到 Kubernetes,請在“monitoring”命名空間中運行以下命令:

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

要保存到磁盤,請添加選項 --set loki.persistence.enabled = true:

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

注: 如果要同時部署Grafana,則添加參數 --set grafana.enabled = true

運行此命令時,您應該得到以下輸出:

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.

查看“monitoring”命名空間中 Pod 的狀態,我們可以看到一切都已部署:

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

其結果是:

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

所有 Pod 都在運行。 現在是時候做一些測試了!

連接到 Grafana

為了連接到 Kubernetes 下的 Grafana,您需要打開一條通往其 pod 的隧道。 以下是為 Grafana Pod 打開端口 3000 的命令:

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

另外重要的一點是需要恢復Grafana管理員密碼。 密碼保密 loki-grafana 在現場 .data.admin-user 以base64 格式。

要恢復它,您需要運行以下命令:

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

將此密碼與默認管理員帳戶 (admin) 結合使用。

Grafana 中的 Loki 數據源定義

首先,確保Loki數據源(配置/數據源)已創建。
這裡是一個例子:

Loki - 使用 Prometheus 方法收集日誌
為 Loki 設置數據源的示例

通過單擊“測試”,您可以測試與 Loki 的連接。

向洛基提出請求

現在轉到 Grafana 並轉到“探索”部分。 當從容器接收日誌時,Loki 會添加來自 Kubernetes 的元數據。 這樣就可以查看特定容器的日誌。

例如,要選擇 promtail 容器日誌,您可以使用以下查詢: {container_name = "promtail"}.
不要忘記在這裡選擇 Loki 數據源。

此查詢將返回容器活動,如下所示:

Loki - 使用 Prometheus 方法收集日誌
Grafana 中的查詢結果

添加到儀表板

從 Grafana 6.4 開始,可以將日誌信息直接放在儀表板上。 之後,用戶將能夠在其站點上的請求數與應用程序跟踪之間快速切換。

下面是實現此交互的示例儀表板:

Loki - 使用 Prometheus 方法收集日誌
包含 Prometheus 指標和 Loki 日誌的示例儀表板

洛基的未來

我早在五月/六月就開始使用 Loki 0.1 版本。 今天已經發布了版本 1,甚至還有 1.1 和 1.2。

必須承認0.1版本還不夠穩定。 但 0.3 已經顯示出真正成熟的跡象,而接下來的版本(0.4,然後是 1.0)只是強化了這種印象。

1.0.0之後,沒有人可以有藉口不使用這個奇妙的工具。

進一步的改進不應該是關於 Loki,而是它與優秀的 Grafana 的集成。 事實上,Grafana 6.4 已經與儀表板有了很好的集成。

最近發布的 Grafana 6.5 通過自動識別 JSON 格式的日誌內容,進一步改進了這種集成。

下面的視頻顯示了此機制的一個小示例:

Loki - 使用 Prometheus 方法收集日誌
使用在 Grafana 中渲染的 Loki 字符串

可以使用 JSON 字段之一,例如:

  • 鏈接到外部工具
  • 日誌內容過濾

例如,您可以單擊traceId 轉到Zipkin 或Jaeger。

像往常一樣,我們期待您的評論並邀請您 開放網絡研討會,我們將談論DevOps行業在2019年的發展情況,並討論2020年可能的發展路徑。

來源: www.habr.com