eBPF 技术是 Linux 内核 3.15 版本中引入的全新设计,自从 2014 年公布以来,始终都备受瞩目。在过来几年中,基于 eBPF 技术的实际和工程落地层出不穷,呈现了爆发式的增长。2015 年微软、Google、Facebook、Netflix 和 Isovalent 也独特发表在 Linux 基金会下成立了一个新的 eBPF 基金会,以帮忙反对该技术的倒退,并促成正在倒退的许多基于 eBPF 的开源我的项目之间的单干。
eBPF 技术未然成为基础设施世界中最有影响力的技术之一。
01 什么是 eBPF?
咱们晓得操作系统分为用户空间和内核空间,内核是操作系统的外围,它独立于惯例的应用程序,能够拜访受爱护的内存空间,也有拜访底层硬件设施的所有权限。为了保障内核的平安,当初的操作系统个别都强制用户过程不能间接操作内核。而应用程序通常是在用户空间中运行,每当这些应用程序想要以任何形式与硬件交互时,都必须向内核发出请求来取得拜访权限,同时,内核还负责调度各个应用程序,以确保多个过程同时运行。
eBPF 的弱小与神奇之处,就是在内核和用户空间之间架起了“桥梁”,扭转了操作系统和基础设施服务的设计形式,将原先的 BPF 倒退成一个指令集更简单、利用范畴更广的“内核虚拟机”,以提供更多的可编程性、可扩展性和敏捷性。
eBPF 程序能在操作系统的内核中运行,并在不更改内核源代码的状况下对内核进行检测。为了防止注入的代码导致内核解体,eBPF 会对注入的代码进行严格查看,回绝不合格的代码的注入,保障 eBPF 程序运行的稳定性和安全性。
02 可观测性体系构建
在云原生可观测体系构建中,业界通常将指标(Metrics)、链路(Tracing)和日志(Logging)称为可观测性的“三大支柱”。而在具体实际中,这三个监测维度与其说是“支柱”,更像是三条相互交织、互相关联的“线”,在各自偏重本身畛域能力建设的根底上又要实现互联——以“链路”能力串起所有利用零碎的依赖拓扑关系,补充“指标”能力实时掌控链路上各个节点的健康状况,兼以“日志”能力实现深度的业务剖析与谬误定位。
针对可观测性体系所须要的这三个方面能力的构建,行业内别离都有比拟成熟的开源我的项目能够间接应用,比方云原生运行指标数据的采集与展现根本采纳 Prometheus + Grafana 来构建,链路追踪有 Skywalking、Zipkin 等 APM 工具,也有基于交换机镜像通过网络旁路进行采集剖析的 NPM 类产品,而日志体系应用的比拟多的有 ELK。
针对这些产品的组合,咱们也能够比拟疾速地搭建一个可观测性零碎,然而从业界实际来看,这样组装的零碎普遍存在几类痛点:
· 不足全局性的零碎和网络拓扑关系。不论是采纳 APM 还是 NPM 来绘制链路,受限于采集形式,无奈残缺笼罩所有利用零碎、主机、负载均衡器等维度的网络调用链路拓扑,无奈构建全面的链路拓扑。
· 数据采集形式不具备普适性。Skywalking 与 Zipkin 等 APM 类产品须要采纳 SDK 集成或 Agent 等形式,随着利用部署运行,采集特定埋点的指标数据,这两类形式都都要依赖利用方进行适配革新,埋点的数据采集又局限于特定语言和技术栈。而在云原生环境中,多语言利用、不同通信协议共存的状况下,存在适配工作量极大、利用感知显著的问题;而 NPM 因为是通过交换机镜像采集网络流量,一方面随着云原生利用在虚构网络上运行,流量不通过物理交换机,单从物理交换机采集流量并不能无效反对上云业务的监测剖析须要,另一方面,未将抓取的网络信息与云资源信息联合,无奈出现利用容器间、网络要害组件的网络拓扑。
03 基于 eBPF 技术的可观测实际摸索
如上文所诉,eBPF 技术在用户空间和内核空间之间架起了“桥梁”,通过将 eBPF 程序加载到 trace points、内核、及用户空间利用,使得咱们能够从内核空间获取应用程序的运行时行为(runtime behavior)和零碎事件(system event)。利用端与零碎端的这种观测能力联合,能在排查零碎性能问题时提供更弱小的能力和独特的信息。
同时,相比于操作系统提供的动态计数器(counters、gauges),eBPF 能在内核中收集和聚合自定义 metric,并能从不同数据源来生成可观测数据,这既扩大了可观测性的深度,也显著缩小了整体零碎开销,因为通过 eBPF 可抉择只收集必要的数据,这也极大地提高了在大规模生产环境中构建可观测性能力的可行性。
相比于传统监测数据采集与剖析技术,基于 eBPF 技术的可观测零碎有着显著的劣势:
· 零侵入式,eBPF 采集端程序与利用零碎运行在不同的过程中,不会对利用零碎运行带来影响;
· 语言无关性,无论待监测的利用零碎采纳的是什么开发语言或技术框架,都可实现笼罩,构建全面的链路拓扑和可观测图谱;
· 多环境适配,不论利用零碎运行的根底环境是采纳 Kubernetes 或 Open Shift 等云原生平台、虚拟机集群、物理机、还是科创环境,都可实现适配,采纳一套采集形式来实现多环境笼罩。