本文作者:擎创科技某大拿
01 背景与问题
当前,云原生技术主要是以容器技术为基础围绕着 Kubernetes的标准化技术生态,通过标准可扩展的调度、网络、存储、容器运行时接口来提供基础设施,同时通过标准可扩展的声明式资源和控制器来提供运维能力。两层标准化推进了细化的社会分工,各领域进一步提升规模化和专业化,全面达到成本、效率、稳定性的优化。在这样的背景下,大量公司都使用云原生技术来开发和运维应用。正因为云原生技术带来了更多可能性,当前业务应用出现了微服务众多、多语言开发、多通信协议的特征,同时云原生技术本身将复杂度下移,给可观测性带来了许多挑战。
复杂微服务架构的挑战
难以获得系统的整体动态拓扑,难以确定特定服务的上下游服务质量。
多语⾔的挑战
传统可观测⽅法需要对不同语⾔使⽤不同的⽅法进⾏可观测。不同语⾔需要不同埋点⽅法,甚⾄有的语⾔没有现成的埋点⽅法,埋点对应⽤性能影响⽆法简单评估。
多通信协议的挑战
基础设施(Kafka, MySQL, Redis等)、微服务套件(Spring, gRPC, Dubbo等)采⽤了不同的通信协议。传统可观测⽅法通常是在应⽤层特定通信接⼝进⾏埋点。埋点⽅法多种多样,有的通信协议没有现成的埋点⽅法,同理埋点对应⽤性能影响⽆法简单评估。
02 解决方案
通常与可观测性相关联紧密的数据便是“指标”、“⽇志”和“链路追踪”。然⽽,这些数据源中的每⼀项都有不同的收集⽅法。除此,针对这些数据项进⾏采集可能需要多种不同的产品和代理。
eBPF可以以⼀种⾮侵⼊性、安全且跨系统⼀致的⽅式收集遥测数据以实现可观测性,并且对当前系统性能和资源使⽤影响⼩。
03 什么是eBPF?
eBPF 是⼀种⽆需更改Linux内核代码,便能让程序在内核中运⾏的技术。开发者可以通过执⾏eBPF程序,给运⾏中的操作系统添加额外的能⼒。这催⽣了很多基于eBPF 的项⽬,涵盖了⼴泛⽤例,包括云原⽣⽹络、安全和可观测性。例如:当下正流⾏的 Cilium ,是基于eBPF 实现数据转发的 CNI ⽹络插件;Falco 是CNCF 开源孵化的运⾏时安全⼯具,专⻔为 Kubernetes 、Linux 和云原⽣构建;Pixie 使⽤ eBPF ⾃动收集遥测数据,也已开源应⽤,并进⼊了 CNCF 沙箱的可观测项⽬;同时⼀些服务⽹格产品也在探索使⽤ eBPF。
04 eBPF与可观测性的关系
传统意义上的观测性,是指在外部洞悉应⽤程序运⾏状况的能⼒。⽽ eBPF 是⼀种⽆需⼊侵应⽤代码,直接⾯向操作系统内核层添加⿊盒代码的⾰命性技术。这种查看内核中的操作,却不会 “⼲扰” 应⽤程序或内核本身的技术,从⽽使得 eBPF 获得可观测性强⼤能⼒。
因此使⽤ eBPF,即使不依赖操作系统公开的固定指标,我们也能直接从内核中收集和聚合⾃定义指标,并根据各种可能性来源,⽣成可⻅性事件。通过这种⽅式,我们将可⻅性扩展到内核,甚⾄可以通过仅收集所需的可⻅性数据,实现整体系统开销的降低。
eBPF 与其他收集遥测数据的⼿段相⽐,有以下优点:
低侵⼊性
它不需要业务系统埋点,也不修改内核源代码,从⽽减⼩了监测系统与业务系统、内核之间的耦合。
安全
它不会改变任何内核源代码。eBPF 程序在转换为字节码后会经过验证阶段以防⽌资源泄漏、⽆限循环等意外情况。它运⾏在沙盒环境以访问有限的内核辅助函数。
方便
与任何其他 Linux 监控替代⽅案相⽐,您可以获得更精细的细节和内核上下⽂。还可以⾃由导出监控数据并将其摄取到第三⽅可视化⼯具中。
05 基于 eBPF 技术的可观测⽅案实践
主机、服务、POD 级别的动态⽹络性能监控
在每个被监测 kubernetes 节点上都部署⼀个探针。这个探针通过 hook 内核的 accept, connect, send, recv 等L4(TCP、UDP)相关的系统调⽤,可以获取进程与绑定地址的关系、通信双⽅的地址、各连接收发的流量统计(字节数、RTT等)。探针会去获取当前 k8s 集群的 metadata 数据(pid, container, pod, service, node等)并把它们保存在内存中,⽤来实现原始 eBPF 数据的丰富。
服务端在收集到通信双⽅的 ebpf 数据后可以进⼀步丰富数据,例如将对端 ip:port 对应的k8s metadata 丰富到本端 ebpf 数据中,并存⼊数据库。查询时,根据指定的时间范围、主机/服务/pod等筛选条件查询数据库,从⽽构造出该时段的各级别的动态拓扑图。
微服务监控
探针在 hook 点获得⽹络报⽂之后,可以进⼀步解析 L7 内容,包括 HTTP、HTTPS、gRPC 等。探针将微服务的各个会话(⼀次请求和响应)的 URL、latency、错误码关联到 ip:port 或者特定 pid。探针定期将会话聚合信息推送到服务端进⼀步丰富数据。如此可以构造出特定时段的微服务的动态拓扑图、服务质量⻩⾦指标等。
Profiling
借助 eBPF 可以获得系统级别或者特定进程的 oncpu 和 offcpu 事件。oncpu 是指定时采样(⼀般100Hz),⽤于分析程序的 cpu 热点,为减少占⽤ CPU 指明⽅向。offcpu 是指内核调度线程的事件,⽤于分析线程由于锁、IO等原因被剥夺 CPU,为充分利⽤ CPU、减少锁抢占指明⽅向。
基于 oncpu 事件可以绘制⽕焰图,直观地展示各个调⽤栈所占时间⽐例。
结论
eBPF 是⼀个令⼈印象深刻的可观测性⼯具,与传统的可观测性解决⽅案相⽐,它可以提供更深⼊的洞察⼒。
其收集整个系统遥测数据的安全、⾮侵⼊性等优势是过去没有许多产品、应⽤程序级代理和⾮常复杂的操作所⽆法获得的。eBPF 正在发展成为可观测性的标准基础。