1.基于 Kubernetes Events 的告警通知实现[1]
在分析 K8S 集群问题时,Kubernetes Events 是超级有用的。
Kubernetes Events 可以被当做是日志来处理,格式也和日志很像,都包括:
1.时间
2.组件
3.原因
4....
但是,Kubernetes 默认只持久化了一个小时的事件,以减少 etcd 的负载。所以,考虑利用 Loki 存储和查询这些 Events。
看过 我之前的文章[2] 的可以知道,kubernetes-event-exporter[3] 可以实现对 Kubernetes Events 的收集。
那我们就利用 kubernetes-event-exporter, 通过最简单的 stdout
方式来输出 json 格式的 event.
另外,再利用 Promtail 的 管道配置[4],将 NameSpace 作为附加标签添加到导出到 Loki 的日志中。
如下:
logLevel: error
logFormat: json
trottlePeriod: 5
route:
routes:
- match:
- receiver: "dump"
receivers:
- name: "dump"
stdout: { }
如下:
...
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
•How Grafana Labs Effectively Pairs Loki and Kubernetes Events | Grafana Labs[5]
•Configuration | Grafana Labs[6]
•What is the correct way to parse json logs in loki, promtail - Grafana Loki - Grafana Labs Community Forums[7]
Grafana 系列文章[8]
[1]
基于 Kubernetes Events 的告警通知实现: https://ewhisper.cn/posts/48832/
[2]
我之前的文章: https://ewhisper.cn/posts/48832/
[3]
kubernetes-event-exporter: https://github.com/opsgenie/kubernetes-event-exporter
[4]
管道配置: https://grafana.com/docs/loki/latest/clients/promtail/pipelines
[5]
How Grafana Labs Effectively Pairs Loki and Kubernetes Events | Grafana Labs: https://grafana.com/blog/2019/08/21/how-grafana-labs-effectively-pairs-loki-and-kubernetes-events/
[6]
Configuration | Grafana Labs: https://grafana.com/docs/loki/latest/clients/promtail/configuration/
[7]
What is the correct way to parse json logs in loki, promtail - Grafana Loki - Grafana Labs Community Forums: https://community.grafana.com/t/what-is-the-correct-way-to-parse-json-logs-in-loki-promtail/51974
[8]
Grafana 系列文章: https://ewhisper.cn/tags/Grafana/