Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events
前情提要
概述
在分析 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是部署在monitoringNS 中的
️疑难解答
刚开始做的时候,发现的日志输出不对,格式实例如下:

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 编写.
Grafana 系列文章(十三):如何用 Loki 收集查看 Kubernetes Events的更多相关文章
- NHibernate系列文章十三:NHibernate批量更新
		
摘要 对于批量插入和批量修改数据,通过设置NHibernate配置文件的BatchSize属性,可以大量减少NHibernate与数据库交互的次数. 1. Batch属性介绍 设置了BatchSize ...
 - 如何用Android Studio查看build.gradle源码
		
上一篇博客里讲过 build.gradle 里的每一行代码基本都是在调用一个方法,既然是这样,我们就可以用 android studio(下面简称as) 去查看它源码的方法注释说明,这样就可以理解每个 ...
 - Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】
		
<Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
 - 【资料收集】OpenCV入门指南  系列文章
		
<OpenCV入门指南>系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764 目录: 第一篇 安装OpenCV ...
 - 系列文章--Enterprise Library文章总结
		
自Enterprise Library 1.1 推出以来,Terry写了一系列的关于Enterprise Library的文章,其中得到了很多朋友的支持,在这里一并表示感谢.为了方便大家的阅读,这里我 ...
 - .NET Core微服务架构学习与实践系列文章索引目录
		
一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...
 - .NET Core 微服务学习与实践系列文章目录索引(2019版)
		
参考网址: https://archy.blog.csdn.net/article/details/103659692 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各 ...
 - Geotrellis系列文章链接
		
本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...
 - 5、软件架构师要阅读的书籍 - IT软件人员书籍系列文章
		
软件架构师在项目中的地位是不言而喻的,其对于项目的需求要相对比较了解,然后对项目代码的结构需要做到覆盖全面.本文就说说作为一个软件架构师需要阅读的一些书籍. 当然,这些书籍都来源于网络,是笔者收集整理 ...
 - jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章
		
这些天将原来在网上找的jQuery插件进行了下整理,特此将代码分享出来给大家. 见下图结构. 对目录结构进行了分类.这里是插件列表. 这里总共收集了20来个插件.还有下面未进行划分的. 下面是DEMO ...
 
随机推荐
- OS-HACKNOS-2.1靶机之解析
			
靶机名称 HACKNOS: OS-HACKNOS 靶机下载地址 https://download.vulnhub.com/hacknos/Os-hackNos-1.ova 实验环境 : kali 2. ...
 - python列表、元祖
			
#列表创建1 a=['李刚','李白','王维','苏轼','李商隐','苏洵','王安石','司马光'] #列表创建2 b=list(['李刚','李白','王维','苏轼','李商隐','苏洵', ...
 - win11如何双屏幕(1台主机2块显示器)
			
1.买两块大小相宜.刷新率相同的屏幕(如诺刷新率不一样可能后期造成卡顿现象) 2.用数据线将两块屏幕都接主机上(现在买新款屏幕基本上都会送双头HDMI线,老旧款式可能是VGA) HDMI款 VGA款 ...
 - 关于python路径的问题思考
			
我相信你肯定遇到过这样的报错 Traceback (most recent call last): File "main.py", line 549, in <module& ...
 - kettle 链接oracle12c
			
jdbc连接cdb数据库时,url兼容以下2种模式: "jdbc:oracle:thin:@192.168.75.131:1521:oracle12c" "jdbc:or ...
 - 批量删除多个相同格式内容的Excel表格的列
			
Sub Del_Col()Application.DisplayAlerts = FalseDim myFiles As StringDim myExcels As StringWith Applic ...
 - Kafka教程(二)API开发-生产者、消费者、topic
			
一.地址 1.实时更新的思维导图 https://www.mubucm.com/doc/4uqlpedefuj 2.图片 二.具体内容 5.producer生产者 demo 发送pro.s ...
 - Blazor组件自做十二 : Blazor Pdf Reader PDF阅读器 组件 (新版 7.1 移除pdfobject)
			
Blazor Pdf Reader PDF阅读器 组件 示例: https://www.blazor.zone/PdfReaders https://blazor.app1.es/pdfReaders ...
 - go语言的切片特性
			
概述: 在使用切片进行赋值的时候,产生新的数组的指针指向原来的数组,只要修改新数组中的元素时,原来数组的元素也会改变. 测试代码: func TestSliceShareMemory(t *testi ...
 - openEuler 部署Kubernetes(K8s)集群
			
前言 由于工作原因需要使用 openEuler,openEuler官方文档部署K8s集群比较复杂,并且网上相关资料较少,本文是通过实践与测试整理的 openEuler 22.03 部署 Kuberne ...