Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events

前情提要

  1. IoT 邊緣集羣基於 Kubernetes Events 的告警通知實現
  2. IoT 邊緣集羣基於 Kubernetes Events 的告警通知實現(二):進一步配置

概述

在分析 K8S 集羣問題時,Kubernetes Events 是超級有用的。

Kubernetes Events 可以被當做是日誌來處理,格式也和日誌很像,都包括:

  1. 時間
  2. 組件
  3. 原因
  4. ...

但是,Kubernetes 默認只持久化了一個小時的事件,以減少 etcd 的負載。所以,考慮利用 Loki 存儲和查詢這些 Events。

實現

看過 我之前的文章 的可以知道,kubernetes-event-exporter 可以實現對 Kubernetes Events 的收集。

那我們就利用 kubernetes-event-exporter, 通過最簡單的 stdout 方式來輸出 json 格式的 event.

另外,再利用 Promtail 的 管道配置,將 NameSpace 作爲附加標籤添加到導出到 Loki 的日誌中。

kubernetes-event-exporter 配置

如下:

logLevel: error
logFormat: json
trottlePeriod: 5
route:
  routes:
    - match:
        - receiver: "dump"
receivers:
  - name: "dump"
    stdout: { }

Promtail 配置

如下:

...
scrape_configs:
- job_name: kubernetes-pods-app
  pipeline_stages:
    - cri: {}
    - match:
        selector: '{app="event-exporter"}'
        stages:
        - json:
            expressions:
              namespace: involvedObject.namespace
        - labels:
            namespace: ""  
...        

上面的配置會從 Events 的 JSONPath involvedObject.namespace 中獲取 NameSpace ,並將其作爲一個標籤 - namespace 添加。

至此,我可以只查看特定 NameSpace(如emqx) 的 Events, 如下圖:

🎉🎉🎉

📝Notes:

我的event-exporter 是部署在 monitoring NS 中的

❓️疑難解答

剛開始做的時候,發現的日誌輸出不對,格式實例如下:

2022-04-20T22:26:19.526448119+08:00 stderr F I0420 {...json...}

這是因爲我用的 container runtime 是 CRI, 而非 Docker.

但是默認安裝 Loki 的時候,配置文件裏卻用的是 docker 的 stage parser, 導致日誌格式異常。初始的配置如下:

...
- job_name: kubernetes-pods-name
  pipeline_stages:
    - docker: {}
...    

Docker 的日誌格式如下:

`{"log":"level=info ts=2019-04-30T02:12:41.844179Z caller=filetargetmanager.go:180 msg=\"Adding target\"\n","stream":"stderr","time":"2019-04-30T02:12:41.8443515Z"}`

CRI 的日誌格式如下:

2019-01-01T01:00:00.000000001Z stderr P some log message

所以如上文所示,要根據自己的 container runtime 選擇合適的 stage parser.

對於 CRI, cri: {} 其實就是如下細節的一個"語法糖":

- regex:
    expression: "^(?s)(?P<time>\\S+?) (?P<stream>stdout|stderr) (?P<flags>\\S+?) (?P<content>.*)$"
- labels:
    stream:
- timestamp:
    source: time
    format: RFC3339Nano
- output:
    source: content

📚️參考文檔

Grafana 系列文章

Grafana 系列文章

三人行, 必有我師; 知識共享, 天下爲公. 本文由東風微鳴技術博客 EWhisper.cn 編寫.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章