前情提要
概述
在分析 K8S 叢集問題時,Kubernetes Events 是超級有用的。
Kubernetes Events 可以被當做是日誌來處理,格式也和日誌很像,都包括:
- 時間
- 元件
- 原因
- ...
但是,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
?️參考文件
- How Grafana Labs Effectively Pairs Loki and Kubernetes Events | Grafana Labs
- Configuration | Grafana Labs
- What is the correct way to parse json logs in loki, promtail - Grafana Loki - Grafana Labs Community Forums
Grafana 系列文章
三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.