基于 eBPF 的云原生可观测实践
eBPF 技术是 Linux 内核 3.15 版本中引入的全新设计,自从 2014 年发布以来,一直都备受瞩目。在过去几年中,基于 eBPF 技术的实践和工程落地层出不穷,出现了爆发式的增长。2015 年微软、Google、Facebook、Netflix 和 Isovalent 也共同宣布在 Linux 基金会下成立了一个新的 eBPF 基金会,以帮助支持该技术的发展,并促进正在发展的许多基于 eBPF 的开源项目之间的合作。
eBPF 技术已然成为基础设施世界中最有影响力的技术之一。
| 什么是 eBPF?
我们知道操作系统分为用户空间和内核空间,内核是操作系统的核心,它独立于常规的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。而应用程序通常是在用户空间中运行,每当这些应用程序想要以任何方式与硬件交互时,都必须向内核发出请求来获得访问权限,同时,内核还负责调度各个应用程序,以确保多个进程同时运行。
eBPF 的强大与神奇之处,就是在内核和用户空间之间架起了“桥梁”,改变了操作系统和基础设施服务的设计方式,将原先的 BPF 发展成一个指令集更复杂、应用范围更广的“内核虚拟机”,以提供更多的可编程性、可扩展性和敏捷性。
eBPF 程序能在操作系统的内核中运行,并在不更改内核源代码的情况下对内核进行检测。为了避免注入的代码导致内核崩溃,eBPF 会对注入的代码进行严格检查,拒绝不合格的代码的注入,保证 eBPF 程序运行的稳定性和安全性。
| 可观测性体系构建
在云原生可观测体系构建中,业界通常将指标(Metrics)、链路(Tracing)和日志(Logging)称为可观测性的“三大支柱”。而在具体实践中,这三个监测维度与其说是“支柱”,更像是三条相互交织、相互关联的“线”,在各自侧重自身领域能力建设的基础上又要实现互联——以“链路”能力串起所有应用系统的依赖拓扑关系,补充“指标”能力实时掌控链路上各个节点的健康状况,兼以“日志”能力实现深度的业务分析与错误定位。
针对可观测性体系所需要的这三个方面能力的构建,行业内分别都有比较成熟的开源项目可以直接使用,比如云原生运行指标数据的采集与展示基本采用 Prometheus + Grafana 来构建,链路追踪有 Skywalking、Zipkin 等 APM 工具,也有基于交换机镜像通过网络旁路进行采集分析的 NPM 类产品,而日志体系使用的比较多的有 ELK。
针对这些产品的组合,我们也可以比较快速地搭建一个可观测性系统,但是从业界实践来看,这样组装的系统普遍存在几类痛点。
- 缺乏全局性的系统和网络拓扑关系。不管是采用 APM 还是 NPM 来绘制链路,受限于采集方式,无法完整覆盖所有应用系统、主机、负载均衡器等维度的网络调用链路拓扑,无法构建全面的链路拓扑。
- 数据采集方式不具备普适性。Skywalking 与 Zipkin 等 APM 类产品需要采用 SDK 集成或 Agent 等方式,随着应用部署运行,采集特定埋点的指标数据,这两类方式都都要依赖应用方进行适配改造,埋点的数据采集又局限于特定语言和技术栈。而在云原生环境中,多语言应用、不同通信协议共存的情况下,存在适配工作量极大、应用感知明显的问题;而 NPM 由于是通过交换机镜像采集网络流量,一方面随着云原生应用在虚拟网络上运行,流量不经过物理交换机,单从物理交换机采集流量并不能有效支持上云业务的监测分析需要,另一方面,未将抓取的网络信息与云资源信息结合,无法呈现应用容器间、网络关键组件的网络拓扑。
| 基于 eBPF 技术的可观测实践探索
如上文所诉,eBPF 技术在用户空间和内核空间之间架起了“桥梁”,通过将 eBPF 程序加载到 trace points、内核、及用户空间应用,使得我们可以从内核空间获取应用程序的运行时行为(runtime behavior)和系统事件(system event)。应用端与系统端的这种观测能力结合,能在排查系统性能问题时提供更强大的能力和独特的信息。
同时,相比于操作系统提供的静态计数器(counters、gauges),eBPF 能在内核中收集和聚合自定义 metric,并能从不同数据源来生成可观测数据,这既扩展了可观测性的深度,也显著减少了整体系统开销,因为通过 eBPF 可选择只收集必要的数据,这也极大地提高了在大规模生产环境中构建可观测性能力的可行性。
相比于传统监测数据采集与分析技术,基于 eBPF 技术的可观测系统有着显著的优势。
- 零侵入式,eBPF 采集端程序与应用系统运行在不同的进程中,不会对应用系统运行带来影响;
- 语言无关性,无论待监测的应用系统采用的是什么开发语言或技术框架,都可实现覆盖,构建全面的链路拓扑和可观测图谱;
- 多环境适配,不管应用系统运行的基础环境是采用 Kubernetes 或 Open Shift 等云原生平台、虚拟机集群、物理机、还是科创环境,都可实现适配,采用一套采集方式来实现多环境覆盖。
评论