1.什么是kubernetes事件
Kubernetes Events 是一种 Kubernetes 资源对象,记录了某个组件在某个时间做了某个动作,用于展示集群内发生的情况,当 Kubernetes 集群中资源状态发生变化时,可以产生新的 event 。
Kubernetes 系统中的各个组件会将运行时发生的各种事件(例如调度器做了什么决定,某些 Pod 为什么被从节点中驱逐)上报给 Kubernetes API Server 。Kubernetes API Server 将 event 存储在 Etcd 中,为避免 Etcd 的磁盘空间被填满,默认的保留策略是:在最后一次的事件发生后,删除 1 小时之前发生的事件。
可以通过` kubectl describe $ResourceName
`或 `kubectl get event
`命令查看相关资源的事件信息或查看 Kubernetes 集群中发生了哪些事件,默认情况下只会显示最近 1 小时内发生的事件。
2.为什么监控Kubernetes事件
事件监控可以弥补Kubernetes资源监控在实时性、准确性和场景上的欠缺。您可以通过使用xxx,获取事件,实时监控集群的异常与问题。
Kubernetes平台中可能产生大量事件, kubernetes组件不提供事件相关的指标,而且会自动清理事件(1小时),但有些事件的出现可能预示着对集群或节点可用性产生影响,因此需要对事件进行监控。
当前容器云平台会收集kubernetes事件到elasticsearch中, 但没有相应的告警通知机制。
3.如何采集Kubernetes事件
Kubernetes中的事件最终还是存储在etcd中,默认情况下只保存1个小时,由于etcd并不支持一些复杂的分析操作,默认Kubernetes只提供了非常简单的过滤方式,比如通过Reason、时间、类型等。同时这些事件只是被动的存在etcd中,并不支持主动推送到其他系统,通常只能手动的去查看。
而实际上我们对事件的使用需求非常高,例如:
对系统中的异常事件做实时告警,例如Failed、Evicted、FailedMount、FailedScheduling等。
通常问题排查可能要去查找历史数据,因此需要去查询更长时间范围的事件(几天甚至几个月)。
事件支持归类统计,例如能够计算事件发生的趋势以及与上一时间段(昨天/上周/发布前)对比,以便基于统计指标进行判断和决策。
支持不同的人员按照各种维度去做过滤、筛选。
支持自定义的订阅这些事件去做自定义的监控,以便和公司内部的部署运维平台集成。
为了让大家更便捷的使用Kubernetes事件功能,所以需要进行Kubernetes Event采集。
Eventrouter
正如 Eventrouter 项目的 GitHub 页面所述:“事件路由器充当 Kubernetes 系统中事件资源的活动观察者,它接收这些事件并将它们推送到用户指定的接收器。这对于许多不同的目的很有用,但最值得注意的是对在 Kubernetes 集群上运行的工作负载的长期行为分析。”
详细信息请看 eventrouter[1] GitHub
项目地址: https://github.com/heptiolabs/eventrouter
参考:https://blog.csdn.net/weixin_43855694/article/details/103264930
Kubewatch 是一个 K8s 事件监视工具,用于跟踪 Kubewatch 中的每个资源更改。它支持通知,它将能够在 Slack、Hipchat、Webhook、Flock、SMTP 等中发布通知。
详细信息请看 kubewatch[2] GitHub
项目地址:https://github.com/bitnami-labs/kubewatch
参考:https://blog.csdn.net/tao12345666333/article/details/118214871
Sloop
Sloop 监控 Kubernetes,记录事件和资源状态变化的历史,并提供可视化来帮助调试过去的事件。
详细信息请看 sloop[3] GitHub
项目地址:GitHub - salesforce/sloop: Kubernetes History Visualization
事件导出器允许将经常错过的 Kubernetes 事件导出到各种输出,以便它们可用于可观察性或警报目的。
事件导出器实现起来很简单,但功能非常强大。一旦事件被记录,它利用 Prometheus 客户端以 Prometheus 格式计数和报告事件。
详细信息请看 kubernetes-event-exporter[4] GitHub
项目地址:https://github.com/opsgenie/kubernetes-event-exporter
参考:https://qiankunli.github.io/2020/04/27/kubernetes_event.html
Kspan 是 Weaveworks 创建的一个项目,它将 Kubernetes 事件转换为 OpenTelemetry Spans,通过因果关系将它们连接起来,并将它们组合成 traces。
Kspan 将与 Kubernetes API 交互以收集各种事件并将生成的跟踪转发到 OpenTelemetry 收集器。
kspan配合 Jaeger 利用 tracing 的方式来采集
详细信息请看 kspan[5] GitHub
项目地址:https://github.com/weaveworks-experiments/kspan
参考:https://blog.csdn.net/tao12345666333/article/details/118214871
4.可选的监控实现方案
第一种:通过agent收集kubernetes事件, 然后推送到通知系统。社区实现: https://github.com/opsgenie/kubernetes-event-exporter
第二种:通过exporter将kubernetes事件转换为指标度量, 由prometheus进行收集。社区实现:
https://github.com/caicloud/event_exporter
决定采用第二种实现方案,将event转换为指标度量。
目前event-exporter已在业务集群region-01启用,prometheus访问地址: prom.xxx.com, 指标名kubernetes_events.
5.制定告警规则
接下来制定事件相关告警规则
event_exporter已提交到代码仓库: http://gitlab.xxx.com/xxx/event_exporter
由于event exporter会将所有事件转换为指标度量,因此加入事件类型过滤,允许选择仅输出Warning类型事件(当前Kubernetes支持两种事件: Normal和Warning,前者主要是一些资源Update, Configured之类的事件,且比较频繁)
6.添加监控面板和告警项
已添加事件监控面板和告警项。