kubernetes事件监控工具--Kube-Event
最近遇到一个很头疼的需求:Kubernetes 集群内部事件的监控与追踪。 在日常使用中,总会碰到容器“不经意间”重启的情况,但我完全不知道上次重启是什么时候。容器一旦重启,旧实例就会被销毁,如果旧容器日志没有被收集或转存,就彻底丢失了。这样一来,想通过历史日志排查问题原因就显得非常棘手。
其实,K8s 本身是有事件存储机制的,但它们存在一个 TTL(默认 1 小时)。这意味着如果容器频繁重启,或者事件过了保留时间,你就无法通过事件追溯过去的重启时间。更糟糕的是,当容器多次崩溃重启时,后续的事件可能会覆盖掉前面的问题线索,大大增加了排查难度。
我开始收集网络上的一些现有解决方案,还真找到一个:k8s-event-exporter。
这是一个 GitHub 开源项目,作者的想法是写一个 exporter,监听集群事件并推送到 Loki 存储,然后在 Grafana 上展示,思路非常棒!不过这个项目最后一次提交还是两年前,时间有点久了,但我还是抱着尝试的心理去试用了一下。
然而意外发生了:exporter 拿到的事件并不完整。 最初我以为是 K8s 本身的事件逻辑导致的,因为 K8s 对短时间内频繁发生的同一逻辑事件会自动合并(这点合理,可以避免 etcd 存储的重复事件)。但奇怪的是,我发现有些事件本不是同一个事件,exporter 却依然没有正确推送。
.pod-flow-card { max-width: 1050px; margin: 40px auto; padding: 30px 20px; background: rgba(255, 255, 255, 1); border-radius: 12px; box-shadow: 0 6px 15px rgba(0, 0, 0, 0.08); border: 1px solid rgba(224, 224, 224, 1) }
.pod-flow-card-title { text-align: center; font-size: 1.5rem; font-weight: bold; margin-bottom: 20px }
.pod-flow-horizontal { font-family: "Segoe UI", Arial, sans-serif; display: flex; justify-content: space-between; align-items: flex-start; padding: 0; list-style: none !important; position: relative; margin: 0 }
.pod-flow-horizontal li { position: relative; text-align: center; flex: 1; list-style: none !important }
.pod-flow-horizontal li .emoji { display: flex; align-items: center; justify-content: center; margin: 0 auto 10px; background: rgba(255, 255, 255, 1); border: 3px solid rgba(76, 175, 80, 1); border-radius: 50%; width: 60px; height: 60px; font-size: 28px; box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); position: relative; z-index: 1 }
.pod-flow-horizontal li .title { display: block; font-weight: bold; font-size: 16px; margin-bottom: 6px; color: rgba(44, 62, 80, 1) }
.pod-flow-horizontal li .desc { font-size: 14px; color: rgba(85, 85, 85, 1) }
.pod-flow-horizontal li::after { content: "➤"; position: absolute; top: 30px; right: -30px; font-size: 28px; font-weight: bold; background: linear-gradient(90deg, rgba(76, 175, 80, 1), rgba(118, 255, 3, 1)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; animation: 1.2s linear infinite slidearrow }
.pod-flow-horizontal li:last-child::after { content: "" }
@keyframes slideArrow { 0% { transform: translateY(-50%) translateX(0) } 50% { transform: translateY(-50%) translateX(10px) } 100% { transform: translateY(-50%) translateX(0) } }
- ️
Scheduled
Pod 被调度到节点 -
Pulled
镜像拉取完成 - ️
Created
容器实例被创建 -
Started
容器启动成功 - ️
Liveness Probe
健康检查开始执行
但实际结果却只有 一个 Pod 事件 成功推送到 Loki,剩下的事件全都丢弃了,提示是“事件过期被丢弃”。最关键的是,我并不知道 exporter 丢弃的到底是不是我想要的事件。所有能调的配置我几乎都试了,可惜还是没能解决,属实出乎我意料 /(ㄒoㄒ)/~~
我的需求其实非常明确: 监听 K8s 集群内的事件,并推送到 Loki。
网上方案里我研究过 k8s-event-exporter、promtail、开启 k8s-auditlog、falco,最后发现只有 exporter 最贴合需求,但它却没能满足我。那怎么办?
不行!那就自己写一个! 我只需要实现一个功能,应该用不了多少脑子……于是,kube-event 就这样横空出世了
.card-container { display: flex; gap: 20px; align-items: stretch; flex-wrap: wrap; overflow: hidden; padding: 10px }
.card-container a { flex: 1; text-decoration: none; color: inherit; min-width: 250px; transition: transform 0.3s ease, box-shadow 0.3s ease }
.card { border-radius: 16px; padding: 20px; height: 100%; box-sizing: border-box; background: linear-gradient(rgba(255, 255, 255, 1), rgba(255, 255, 255, 1)) border-box padding-box, linear-gradient(135deg, rgba(106, 90, 205, 1), rgba(0, 198, 255, 1), rgba(0, 255, 176, 1)) border-box rgba(255, 255, 255, 0.85); backdrop-filter: blur(6px); border: 2px solid rgba(0, 0, 0, 0); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05); transition: all 0.4s ease }
.card-container a:hover .card { transform: translateY(-6px); box-shadow: 0 6px 16px rgba(0, 0, 0, 0.12); background-image: linear-gradient(rgba(255, 255, 255, 1), rgba(255, 255, 255, 1)), linear-gradient(135deg, rgba(255, 110, 199, 1), rgba(106, 90, 205, 1), rgba(0, 198, 255, 1)) }
@media (prefers-color-scheme: dark) { .card { box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3) } .card-container a:hover .card { box-shadow: 0 0 20px rgba(0, 198, 255, 0.25) } }
.card strong { font-size: 2rem; background: linear-gradient(135deg, rgba(106, 90, 205, 1), rgba(0, 198, 255, 1)); -webkit-background-clip: text; -webkit-text-fill-color: transparent }
.card span { display: block; margin-top: 8px; color: rgba(68, 68, 68, 1); font-size: 0.95rem }
.card small { display: block; margin-top: 10px; color: rgba(119, 119, 119, 1); font-size: 0.8rem }
@media (max-width: 600px) { .card-container { flex-direction: column } .card-container a { min-width: unset } }
一、传统部署方式
需在 K8s Master 节点 部署
# 下载并解压软件
tar xf kube-event.tar.gz && cd kube-event
# 修改conf配置文件,主要修改loki的地址,其他几个参数看个人需求吧
vim config.json
# 启动服务
./start.sh
# 停止服务
./stop.sh
二、容器化部署
# 下载镜像
docker pull registry.cn-beijing.aliyuncs.com/nanxi/kube-event:1.0.1
配置清单(kube-event.yaml)参考如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: kube-event-sa
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kube-event-reader
rules:
- apiGroups: [""]
resources: ["events"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kube-event-reader-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kube-event-reader
subjects:
- kind: ServiceAccount
name: kube-event-sa
namespace: default
---
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-event-conf
data:
config.json: |
{
"LOKI_URL": "http://172.21.0.237:32537/loki/api/v1/push",
"DATA_DIR": "../data/",
"DEDUPLICATE": 0,
"PUSH_INTERVAL_SECONDS": 30,
"ENABLE_DETAILED": false
}
logging.yaml: |
version: 1
disable_existing_loggers: False
formatters:
standard:
format: "%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s"
message_only:
format: "%(message)s"
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: standard
stream: ext://sys.stdout
file:
class: logging.handlers.TimedRotatingFileHandler
level: DEBUG
formatter: standard
filename: ../logs/app.log
when: midnight
backupCount: 7
encoding: utf-8
detailed_console:
class: logging.StreamHandler
level: INFO
formatter: message_only
stream: ext://sys.stdout
detailed_file:
class: logging.handlers.TimedRotatingFileHandler
level: DEBUG
formatter: message_only
filename: ../logs/app.log
when: midnight
backupCount: 7
encoding: utf-8
loggers:
detailed:
level: INFO
handlers: [detailed_console,detailed_file]
propagate: false
root:
level: DEBUG
handlers: [console,file]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-event
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: kube-event
template:
metadata:
labels:
app: kube-event
spec:
serviceAccountName: kube-event-sa
containers:
- name: kube-event
image: kube-event:1.0.1
volumeMounts:
- name: conf-volume
mountPath: /app/conf
- name: log-volume
mountPath: /app/logs
- name: catche-data
mountPath: /app/data
volumes:
- name: conf-volume
configMap:
name: kube-event-conf
- name: log-volume
hostPath:
path: /var/log/kube-event/logs
type: DirectoryOrCreate
- name: catche-data
hostPath:
path: /var/log/kube-event/data
type: DirectoryOrCreate
三、效果展示
正常启动后输出如下:

然后我们可以配合grafana进行展示:
这个模板班编号是17882,原k8s-event-exporter的模板,我们可以直接借用,数据展示的时候修改下查询SQL即可,

以下是kube-event运行成功后正常推送的数据展示:




部署前请认真阅读说明,推荐使用容器部署,欢迎试用并反馈问题!
kubernetes事件监控工具--Kube-Event的更多相关文章
- Linux实战教学笔记23:Inotify事件监控工具
第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...
- (转)第二十三节 inotify事件监控工具
第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 原文:http://www.cnblogs.com/chensiqiqi/p/6542268.html 第1 ...
- 阿里云容器Kubernetes监控(九) - Kubernetes事件离线工具kube-eventer正式开源
前言 监控是保障系统稳定性的重要组成部分,在Kubernetes开源生态中,资源类的监控工具与组件百花齐放.除了社区自己孵化的metrics-server,还有从CNCF毕业的Prometheus等等 ...
- SQL Server 事件通知(Event notifications)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...
- Node.js 事件循环(Event Loop)介绍
Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...
- 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)
第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏 ...
- js事件中的event对象
addEvent(oDiv,"click",function(event){ console.log(event.bubbles+"事件是否冒泡"); cons ...
- 深入浅出WPF——附加事件(Attached Event)
3.3 事件也附加——深入浅出附加事件 WPF事件系统中还有一种事件被称为附加事件(Attached Event),简言之,它就是路由事件.“那为什么还要起个新名字呢?”你可能会问. “身无彩凤双飞翼 ...
- (十三)事件分发器——event()函数,事件过滤
事件分发器——event()函数 事件过滤 事件进入窗口之前被拦截 eventFilter #include "mywidget.h" #include "ui_mywi ...
- inotify事件监控工具
inotify事件监控工具 rsync + inotify 组合的起源 inotify优缺点 优点:监控文件系统事件变化,通过同步工具实现实时数据同步 缺点:并发如果大于200个文件(10-1 ...
随机推荐
- .net 文件上传
文件上传(页面端) 1.文件上传必须用post提交 2.必须修改表中提交数据时的组织方式,即enctype="multipart/form-data",数据是以分隔符的方式提交的 ...
- vue的keep-alive,后台播放音乐?
vue的keep-alive,是否能做到后台播放音视乐? 答案当然是不能. 因为处于失活状态的组件,其真实dom已经从页面移除了,只将其存放到了内存中. dom都不存在了,还播放啥. 能做什么? 顶多 ...
- 一文说清楚ETL与Kafka如何实现集成
ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高,很多企业都把实时流数(日志.实时CDC采集数据.设备数据-)先推入到kafka中,再通过ETL对kafka中的数据进行消费通过 ...
- SciTech-Mathmatics-Probability+Statistics: {$\large Data \rightarrow Info. \rightarrow Knowledge \rightarrow Wisdom \rightarrow Power \rightarrow Organization \rightarrow Wealth \rightarrow Power $}
SciTech-Mathmatics-Probability+Statistics: \(\large \begin{array}{rll} \\ Data &: \text{ set } m ...
- SciTech-BigDataAIML-LLM-Transformer Series-Input+Output-Sampling + Vectorize and Matrixize 不同类型的Input数据(Text/Picture/Audio/Video/Graph:如社交网与分子图)
SciTech-BigDataAIML-LLM-Transformer Series Sampling(采样) Sampling Rate(采样速率) 单位时间采集样本的数量, 有单位. 例视频以fr ...
- win10浏览器都打不开怎么回事
有一位雨林木风系统的小伙伴,在win10专业版系统电脑中,想要使用浏览器来打开网站,却发现不管是Edge还是ie11浏览器都不能打开了,这是怎么回事?本文中,雨林木风小编就来处理这个问题,一起来看看解 ...
- GROOVY 面向对象
面向对象: class Student{ private int StudentID; private String StudentName; void setStudentID(int pID){ ...
- LangChain框架入门04:10分钟优雅接入主流大模型
一个 AI 应用的核心就是它所依赖的大语言模型,LangChain 框架本身不内置任何大模型,但它通过定义统一的接口规范,可以将各种第三方大语言模型接入进来.本文将详细介绍如何在 LangChain ...
- P8776 [蓝桥杯 2022 省 A] 最长不下降子序列 (动态规划)
测试链接:https://www.luogu.com.cn/problem/P8776 P8776 [蓝桥杯 2022 省 A] 最长不下降子序列 题目描述 给定一个长度为 \(N\) 的整数序列:\ ...
- PPT(四)-图表
一.顶级的商业图表在哪找 1.麦肯锡中国https://www.mckinsey.com.cn/# 2.第一财经周刊https://www.cbnweek.com/ 3.数读https://data. ...