为解决可观察性数据孤岛的问题,Kelemetry以组件无关、非侵入性的方式,收集并连接来自不同组件的信号,并以追踪的形式展示相关数据 。
文章插图
Kelemetry是字节跳动开发的用于Kube.NETes控制平面的追踪系统,它从全局视角串联起多个 Kubernetes 组件的行为,追踪单个 Kubernetes 对象的完整生命周期以及不同对象之间的相互影响 。通过可视化 K8s 系统内的事件链路,它使得 Kubernetes 系统更容易观测、更容易理解、更容易 Debug 。
文章插图
背景在传统的分布式追踪中,“追踪”通常对应于用户请求期间的内部调用 。特别是,当用户请求到达时,追踪会从根跨度开始,然后每个内部RPC调用会启动一个新的子跨度 。由于父跨度的持续时间通常是其子跨度的超集,追踪可以直观地以树形或火焰图的形式观察,其中层次结构表示组件之间的依赖关系 。
与传统的RPC系统相反,Kubernetes API是异步和声明式的 。为了执行操作,组件会更新apiserver上对象的规范(期望状态),然后其他组件会不断尝试自我纠正以达到期望的状态 。例如,当我们将ReplicaSet从3个副本扩展到5个副本时,我们会将spec.replicas字段更新为5,rs controller会观察到此更改,并不断创建新的pod对象,直到总数达到5个 。当kubelet观察到其管理的节点创建了一个pod时,它会在其节点上生成与pod中的规范匹配的容器 。
在此过程中,我们从未直接调用过rs controller,rs controller也从未直接调用过kubelet 。这意味着我们无法观察到组件之间的直接因果关系 。如果在过程中删除了原始的3个pod中的一个,副本集控制器将与两个新的pod一起创建一个不同的pod,我们无法将此创建与ReplicaSet的扩展或pod的删除关联起来 。因此,由于“追踪”或“跨度”的定义模糊不清,传统的基于跨度的分布式追踪模型在Kubernetes中几乎不适用 。
过去,各个组件一直在实现自己的内部追踪,通常每个“reconcile”对应一个追踪(例如,kubelet追踪只追踪处理单个pod创建/更新的同步操作) 。然而,没有单一的追踪能够解释整个流程,这导致了可观察性的孤立岛,因为只有观察多个reconcile才能理解许多面向用户的行为;例如,扩展ReplicaSet的过程只能通过观察副本集控制器处理ReplicaSet更新或pod就绪更新的多个reconcile来推断 。
为解决可观察性数据孤岛的问题,Kelemetry以组件无关、非侵入性的方式,收集并连接来自不同组件的信号,并以追踪的形式展示相关数据 。
设计将对象作为跨度为了连接不同组件的可观察性数据,Kelemetry采用了一种不同的方法,受到kspan项目的启发,与将单个操作作为根跨度的尝试不同,这里为对象本身创建一个跨度,而每个在对象上发生的事件都是一个子跨度 。此外,各个对象通过它们的拥有关系连接在一起,使得子对象的跨度成为父对象的子跨度 。因此,我们得到了两个维度:树形层次结构表示对象层次结构和事件范围,而时间线表示事件顺序,通常与因果关系一致 。
例如,当我们创建一个单pod部署时,deployment controller、rs controller和kubelet之间的交互可以使用审计日志和事件的数据在单个追踪中显示:
文章插图
追踪通常用于追踪持续几秒钟的短暂请求,所以追踪存储实现可能不支持具有长生命周期或包含太多跨度的追踪;包含过多跨度的追踪可能导致某些存储后端的性能问题 。因此,我们通过将每个事件分到其所属的半小时时间段中,将每个追踪的持续时间限制为30分钟 。例如,发生在12:56的事件将被分组到12:30-13:00的对象跨度中 。
我们使用分布式KV存储来存储(集群、资源类型、命名空间、名称、字段、半小时时间戳)到相应对象创建的追踪/跨度ID的映射,以确保每个对象只创建一个追踪 。
审计日志收集Kelemetry的主要数据源之一是apiserver的审计日志 。审计日志提供了关于每个控制器操作的丰富信息,包括发起操作的客户端、涉及的对象、从接收请求到完成的准确持续时间等 。在Kubernetes架构中,每个对象的更改会触发其相关的控制器进行协调,并导致后续对象的更改,因此观察与对象更改相关的审计日志有助于理解一系列事件中控制器之间的交互 。
Kubernetes apiserver的审计日志以两种不同的方式暴露:日志文件和webhook 。一些云提供商实现了自己的审计日志收集方式,而在社区中配置审计日志收集的与厂商无关的方法进展甚微 。为了简化自助提供的集群的部署过程,Kelemetry提供了一个审计webhook,用于接收原生的审计信息,也暴露了插件API以实现从特定厂商的消息队列中消费审计日志 。
推荐阅读
- MetaGPT AI 模型开源:可模拟软件公司开发过程,生成高质量代码
- 国家网信办发布深度合成服务算法备案清单:百度阿里腾讯字节等在列
- Meta 开源 AI 语言模型 MusicGen,可将文本和旋律转化为完整乐曲
- 教师|年入2000万的猎头,正在逃离字节
- ChatGPT路线图曝光:没有GPT-5、识图功能要等到明年、GPT-3或将开源
- Huggingface榜首开源模型惹争议:魔改Apache协议,达到一定门槛要收钱
- 为什么不用Go开发操作系统?
- 谷歌开源 Rust Crate 审查结果:便于 Rust 开发者验证源码安全
- 谷歌开源云端病理学 Python 资料库,加速医疗 AI 场景研发
- 字节跳动开源ByConity:基于ClickHouse的存算分离架构云原生数仓