APP下载

基于操作系统eBPF在云原生环境下的技术研究

2022-11-12高巍

电子技术与软件工程 2022年17期
关键词:内核调用数据包

高巍

(麒麟软件有限公司 北京市 100081)

下一个技术时代发展的是基于容器的应用程序,它们横跨多云和混合云环境,包括物理平台、虚拟平台、私有云平台和公有云平台。Kubernetes、容器和Linux是这次变革的核心,操作系统内核能力已经成为云计算技术发展和演进的重要支撑。面对业务多且复杂、建设规模庞大、架构分布式化、异构资源纳管等新机遇新挑战,应用开发人员开始从用户视角关注云原生环境下服务网格、集群调度等性能优化,开始关注Linux内核,随着eBPF等技术的快速发展,操作系统在容器编码、持久化管理、服务网格等方面提供了新思路新技术,实现数字时代操作系统面向多云架构、无处不在、智能自治的基础软件。

1 相关知识

1.1 Linux内核

传统操作系统Linux内核是硬件与软件之间的一个中间层,从技术层面讲是将应用层的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址;从应用程序层面讲,应用程序与硬件没有联系,只与内核有联系,应用程序使用系统调用(syscall)接口发出请求,要求内核代表它行事;内核是一个资源管理程序,负责将共享资源(CPU时间、磁盘空间、网络连接等)分配到各个系统进程,支撑设备管理、进程管理、文件系统和包管理等。随着云原生技术发展,新一代Linux内核需要支撑分布式调度、容器管理、编排管理等新功能。

1.2 什么是eBPF?

eBPF起源于Linux内核,可以运行沙箱程序,安全有效地扩展内核功能,无需更改内核源代码或加载内核模块。eBPF全称“扩展的伯克利数据包过滤器(Extended Berkeley Packet Filter)”,是一种数据包过滤技术,从BPF(Berkeley Packet Filter)技术扩展而来。BPF提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。随着Linux内核的发展,BPF逐步从最初的数据包过滤扩展到网络、内核、安全、跟踪等,而且它的功能特性还在快速发展之中,这种扩展后的BPF被简称为eBPF。

1.3 云原生

云原生概念最早由Pivotal的MattStine于2013年首次提出。2015年谷歌公司牵头成立了云原生计算基金会(CNCF,Cloud Native Computing Foundation),致力于推动云原生技术的普及和可持续发展。2018年,随着服务网格(Service Mesh)的加入,CNCF对云原生的定义发生了改变:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生技术主要包括容器、服务网格、微服务、不可变基础设施和声明式API。

1.4 可观测性

可观测性(Observability)一词源于控制论,最早是由匈牙利裔工程师Rudolf E. Kálmán提出,指系统可以由其外部输出推断其内部状态的程度。对软件架构来说,监控(Monitoring)与可观测性(Observability)是两个不同的概念,监控旨在识别系统是否正常运行,可观测性探究运行不畅的原因(Monitoring tells you whether the system works. Observability lets you ask why it’s not working.)。

2 eBPF关键技术

2.1 跟踪和分析

通过附加eBPF程序来跟踪点位以及内核与用户应用调查点位的能力,允许实现应用程序和系统程序本身运行时行为的不可预见条件下的可视性。通过向应用程序端和系统端都提供内省功能,两种视图均能够被结合,从而向故障排解系统性能问题提供强大且独特的见解。高级统计数据结构允许以有效方式提取有意义的可视性数据,而无需如相似系统般普遍采用导出大量抽样数据的方式。

2.2 可观测性

eBPF能够对基于广泛的可能来源的可视化事件的定制指标进行收集和核内聚合,而非依赖于操作系统所呈现的静态计数器和仪表。通过仅收集所需的可视化数据,并在事件源生成直方图和类似数据结构,而非依赖于导出样本,这样可以拓展可实现的可视性的深度,并且显著缩减整体系统费用。

2.3 安全

基于识别和理解所有系统调用而创建,而且与所有网络操作的数据包和套接层视图相整合,使得安全系统具备革新性的创新方法。当系统调用过滤、网络层过滤和进程上下文语境跟踪等方面已经逐一被完全独立的系统妥善处理,eBPF能够有效地整合可视性、资源可控性,从而在更广泛的上下文语境中以更佳的控制水准来创建安全系统操作。

2.4 服务网格

可编程性与运行效率的组合使得eBPF成为服务网格解决方案中所有数据包处理需求的一个自然适配器。eBPF的可编程性使得在无需脱离Linux内核数据包处理上下文语境的情形下,即可添加额外的协议解析器,并且能够便捷地对任何前向推进逻辑编程以满足与时俱进的需求。由JIT编译器供给的效率提供了近乎内核代码层级的自然编译的执行性能。

3 eBPF设计思想

eBPF程序并不像常规的线程那样,启动后就一直保持运行,它需要由事件触发后才会执行。这些事件包括系统调用、内核跟踪点、内核函数和用户态函数的调用退出、网络事件等。借助于强大的内核态插桩(kprobe)和用户态插桩(uprobe),eBPF程序的运行流程,如图1所示。

图1:eBPF程序的运行流程

(1)用户态编写eBPF程序;

(2)使用LLVM编译成bytecode的ELF文件;

(3)使用bpf系统调用,把程序加载进入内核;

(4)内核的verifier会验证eBPF程序的合法性,确保其能够安全、合规地在内核中运行;

(5)内核会使用JIT compiler把eBPF字节码编译成本地机器码;

(6)eBPF程序在内核中以VM方式安全运行。

确保内核安全和稳定一直都是eBPF的首要任务,不安全的eBPF程序根本就不会提交到内核虚拟机中执行。通常借助LLVM把编写的eBPF程序转换为BPF字节码,然后再通过BPF系统调用提交给内核执行,如图1所示。内核在接受BPF字节码之前,会首先通过验证器verifier对字节码进行校验,只有校验通过的BPF字节码才会提交到即时编译器执行。

如果BPF字节码中包含不安全的操作,验证器verifier会直接拒绝BPF程序的执行。一些典型的验证过程如下所示:

(1)只有特权进程才可以执行BPF系统调用;

(2)BPF程序不能包含无限循环;

(3)BPF程序不能导致内核崩溃;

(4)BPF程序必须在有限的时间段内完成。

eBPF程序的开发方式:涵盖bpftrace、BCC和libbpf这三种方式:

(1)bpftrace通常用在快速排查和定位系统上,它支持用单行脚本的方式来快速开发并执行一个eBPF程序。bpftrace的功能略显有限,不支持特别复杂的eBPF程序,也依赖于BCC和LLVM动态编译执行;

(2)BCC通常运用在开发复杂的eBPF程序中,其内置的各种小工具也是目前应用最为广泛的eBPF小程序。BCC也存在提升的空间,它依赖于LLVM和内核头文件才可以动态编译和加载eBPF程序;

(3)libbpf是从内核中抽离出来的标准库,用它开发的eBPF程序可以直接并行执行,这样就不需要每台计算机都安装LLVM和内核头文件了。不过,它要求内核开启BPF特性,需要最新的发行版才会默认开启。

简单代码示意基于eBPF丢弃网卡收到的任意数据包:

基于eBPF技术可以追踪到Linux操作系统栈,如图2所示,展示了一个Linux操作系统软件堆栈。这些工具提供了对整个系统的性能分析,为可观测性和监控提供了能力支撑。

图2:eBPF性能及可观测性分析工具

4 基于eBPF在云原生环境下技术研究与实践

4.1 研究与实践内容1:可观测性

可观测性技术由日志、指标和追踪三根支柱来构建。

(1)Logging:日志展现的是应用运行而产生的事件或者程序在执行的过程中间产生的一些记录,可以详细解释系统的运行状态。但是,存储和查询需要消耗大量的资源,往往使用过滤器减少数据量。

(2)Metrics:指标是一种聚合数值,存储空间很小,可以观察系统的状态和趋势,但对于问题定位缺乏细节展示,可以使用等高线指标等多维数据结构来增强对于细节的表现力。例如,统计一个服务TBS的正确率、成功率、流量等,这是常见的针对单个指标或者某一个数据库的度量方法。

(3)Tracing:追踪面向的是请求,可以轻松分析出请求中的异常点,但是与Logging日志存在相同的问题就是资源消耗量较大。通常也需要通过采样的方式减少数据量。比如一次数据调用请求的范围,也就是从浏览器或者手机客户端发起的任何一次调用,这是一个流程化的进度,需要轨迹去追踪。

目前以Prometheus、Fluentd、Jaeger等监控工具存在监控粒度不够细致、资源消耗量大、外部代码侵入等问题。基于操作系统eBPF技术可以提供更优的支撑,eBPF在可观测性和监控方面的优势是:

(1)能够提取最全面的数据,包括内核、网络、磁盘、用户态等;

(2)资源开销比例小;基于内核进行采样,对应用范例零侵入、零改造;

(3)应用程序零代码改造,只要Linux内核版本符合要求,eBPF能够观测任意数据;

(4)能够轻松应对容器启动、停止等动态特点,不需要任何的sideCar侵入,直接通过内核来观测任意的容器行为。

在云原生环境中每台机器(或虚拟机)只有一个内核,所有运行在该机器上的容器都共享同一个内核,内核了解主机上运行的所有应用代码。通过对内核的检测,基于eBPF可以同时检测在该机器上运行的所有应用程序代码。当将eBPF程序加载到内核并将其附加到事件上时,它就会被触发,而不考虑哪个进程与该事件有关。

依赖eBPF技术可以有效补充可观测性和监控盲区,意即关于云原生基础设施层以及应用层面的调用问题,自顶向下端到端串联解决问题。利用eBPF增强底层K8s资源使用能力,主要是增强指标力度,让其能够更加细腻地分析问题。基于eBPF的可观测性架构,如图3所示。

图3:基于eBPF的可观测性架构

基于eBPF提升系统可观测性和监控具备以下特点:

(1)观测数据层次广、粒度细。eBPF代码本身就相当于一部分内核,能够让内核更贴近于容器,更加云原生化;

(2)可编程性。eBPF代码在用户态编写,能够实时编译验证后导入内核,这种可编程性使得可以动态地修改相关代码,使eBPF能够轻松应对规模的增长;

(3)面向系统和应用透明。eBPF技术在内核层面执行,对于系统及应用透明,完全无侵入式运行并实现功能;

(4)快速灵活。eBPF代码在经过JIT编译完进入内核执行时获得近乎内核代码执行的速度,对于任何系统调用几乎都能够高效追踪,十分灵活。

4.2 研究与实践内容2:服务网格加速

随着微服务架构的发展,以Linkerd/Istio/NGINXMesh为代表的sidecar代理模式应运而生,这就是第一代ServiceMesh,它作为一个基础设施层,与业务进程完全解耦,和业务一起部署,接管业务件之间的通信,将网络数据收发单独抽象出一层,在这层集中处理服务发现、负载均衡、授权认证等分布式系统所需要的功能,实现网络拓扑中请求的可靠传输。ServiceMesh带来如此多便利的同时,也不可避免地存在着一些问题。传统方式如图4所示,客户端到服务端的消息仅需进出一次内核协议栈即可完成消息传递,但在sidecar模式中,一般选择使用内核的iptables能力掌控业务流量,这就造成了业务数据需要多次进出内核协议栈,导致业务时延增大,吞吐量变低。

图4:基于iptables的sidecar模式

基于eBPF能力短接socket之间数据包传输来提高传输效率,如图5所示,实现ServiceMesh网络加速,为实现短接内核网络协议栈目标,需要使用eBPF提供的两种能力,分别是sockops与socket redirection:

图5:基于eBPF的sidecar模式

(1) sockops提供了在tcp socket创建连接时将socket使用当前连接的唯一key标识后将socket信息保存在sockmap数据结构中的能力;

类似的,代码实现如:

(2) socket redirection在传输tcp数据时支持使用key去sockmap中查找socket,命中后可直接将数据转发到此socket中。

类似的,代码实现如:

对于未在sockmap中找到的socket,正常将数据包通过内核网络协议栈发送出去。将这些能力结合在一起,就可以在不经过内核网络协议栈的前提下直接将数据包转发到对应的socket上,完成数据的一次传输,降低在内核网络协议栈上的时间消耗,这在服务网格这种需要多次转发流量的场景下,能够显著提高服务网格的QPS,降低网络时延。

5 未来展望

不难看出,云计算数字化基础设施是数字经济时代的必然产物,基于云原生构建一个高性能分布式调度系统,更灵活有效地满足不断发展的用户需求,操作系统发展无论在数据中心、云端还是边缘计算环境同样需要有新思路新技术新模式。以基于操作系统eBPF可观测性技术发展为例:

(1)分布式网络问题诊断虽然有效解决了较大规模的网络链路性能诊断定位问题,但是这些设计和研究都是从容器网络层面来考虑设计,面对其他应用场景和不同系统架构也会面临一定的局限性,未来可继续基于操作系统eBPF技术从系统的其他层面,如从算力和存储视角提升系统的可观测性。

(2)与其他分析技术融合进一步拓宽eBPF可观测性应用空间。在《面向政务领域的拟人化人机交互关键技术研究与应用》项目中eBPF技术应用于创建开放式智能客服平台,暨创建面向实际问题求解的开放共享式智能客服云化、微服务平台,eBPF技术与深度学习和监督学习等技术一起部署并实现自主反馈的平台学习能力,达到全领域的快速部署和应用可观测。

6 结语

随着应用的不断发展,对标RedHat(OpenShift)和SUSE(RANCHER)国外操作系统厂商,国产操作系统厂商和云原生厂商越来越意识到操作系统技术与云原生技术紧密关联!基于操作系统eBPF技术已成为Linux内核中发展最快的子模块,eBPF为操作系统内核赋予新的能力,在云原生服务编码、集群调度、执行系统、运行环境中发挥重要作用,起到传统操作系统(Operating System)与云操作系统(Orchestration System)之间的技术纽带作用。

猜你喜欢

内核调用数据包
强化『高新』内核 打造农业『硅谷』
核电项目物项调用管理的应用研究
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
LabWindows/CVI下基于ActiveX技术的Excel调用
SmartSniff
基于系统调用的恶意软件检测技术研究
视觉注意的数据包优先级排序策略研究
利用RFC技术实现SAP系统接口通信
移动IPV6在改进数据包发送路径模型下性能分析