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

東風微鳴發表於2023-02-10

前情提要

  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, 如下圖:

來自 emqx NameSpace 的 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 編寫.

相關文章