背景
作为分布式异步声明式 API,与传统的基于 RPC 的服务相比,Kubernetes 的可解释性较低,因为事件之间没有明确的因果关系;一个对象的变化会间接影响其他对象的变化,过去在 Kubernetes 中进行可观测的尝试要么仅限于单个组件,要么过度侵入单个组件。
于是诞生了kelemetry项目,用于对Kubernetes进行全局的观测监控。
原理
kelemetry以对象操作为监控粒度,区别于传统的以请求操作链路为粒度。因为kelemetry以对象操作为粒度进行span的链接,但是对象的一个操作行为涉及到很多分离的事件操作,因此,kelemetry的可观测数据来源当前主要是两个部分:
- apiserver的审计日志:Kubernetes apiserver的审计日志以两种不同的方式暴露:日志文件和webhook。一些云提供商实现了自己的审计日志收集方式。为了简化自助提供的集群的部署过程,Kelemetry提供了一个审计webhook,用于接收原生的审计信息,也暴露了插件API以实现从特定厂商的消息队列中消费审计日志。
- 对象事件:Kelemetry运行一个控制器来监视对象的创建、更新和删除事件,并在接收到审计事件时将其与审计跨度关联起来。
Span链
kelemetry有一个聚合器接受来自数据源的“事件”,其中事件与 K8S 对象关联。递归地调用“链接器”以确定关联对象的“父”对象,从而将跨度放置在与同一祖先对象下的其他事件相同的跟踪下
- 将审计日志数据转换为相应的span
- 将事件数据转换为相应的span
最后会聚合所有跨度链接,并将它们发送到可观测server中。
https://github.com/kubewharf/kelemetry/blob/main/docs/DEV.md