擎创技术流 | 一文读懂eBPF对kubernetes可观测的重要性

news/2024/7/4 7:47:20 标签: 大数据, kubernetes, 运维, 人工智能, 云原生

一、云原生技术发展的背景与问题

当前,云原生技术主要是以容器技术为基础围绕着 Kubernetes的标准化技术生态,通过标准可扩展的调度、网络、存储、容器运行时接口来提供基础设施,同时通过标准可扩展的声明式资源和控制器来提供运维能力。两层标准化推进了细化的社会分工,各领域进一步提升规模化和专业化,全面达到成本、效率、稳定性的优化。

在这样的背景下,大量公司都使用云原生技术来开发和运维应用。正因为云原生技术带来了更多可能性,当前业务应用出现了微服务众多、多语言开发、多通信协议的特征,同时云原生技术本身将复杂度下移,给可观测性带来了许多挑战。

1.复杂微服务架构的挑战

难以获得系统的整体动态拓扑,难以确定特定服务的上下游服务质量。

2.多语⾔的挑战

传统可观测⽅法需要对不同语⾔使⽤不同的⽅法进行可观测。不同语⾔需要不同埋点⽅法,甚⾄有的语⾔没有现成的埋点⽅法,埋点对应⽤性能影响⽆法简单评估。

3.多通信协议的挑战

基础设施(Kafka, MySQL, Redis等)、微服务套件(Spring, gRPC, Bubbo等)采用了不同的通信协议。传统可观测⽅法通常是在应⽤层特定通信接⼝进⾏埋点。埋点⽅法多种多样,有的通信协议没有现成的埋点⽅法,同理埋点对应⽤性能影响⽆法简单评估。

二、解决方案

通常与可观测性相关联紧密的数据便是“指标”、“⽇志”和“链路追踪”。然⽽,这些数据源中的每⼀项都有不同的收集⽅法。除此,针对这些数据项进行采集可能需要多种不同的产品和代理。

eBPF可以以⼀种⾮侵⼊性、安全且跨系统⼀致的⽅式收集遥测数据以实现可观测性,并且对当前系统性能和资源使⽤影响⼩。

三、什么是eBPF?

eBPF 是⼀种⽆需更改Linux内核代码,便能让程序在内核中运⾏的技术。开发者可以通过执⾏eBPF程序,给运⾏中的操作系统添加额外的能⼒。这催⽣了很多基于eBPF 的项⽬,涵盖了⼴泛⽤例,包括云原⽣⽹络、安全和可观测性。

例如:当下正流⾏的 Cilium ,是基于eBPF 实现数据转发的 CNI ⽹络插件;

Falco 是CNCF 开源孵化的运⾏时安全⼯具,专⻔为 Kubernetes 、Linux 和云原⽣构建;

Pixie 使⽤ eBPF ⾃动收集遥测数据,也已开源应⽤,并进⼊了 CNCF 沙箱的可观测项⽬;同时⼀些服务⽹格产品也在探索使⽤ eBPF。

四、eBPF与可观测性的关系

传统意义上的观测性,是指在外部洞悉应⽤程序运⾏状况的能⼒。⽽ eBPF 是⼀种无需入侵应用代码,直接⾯向操作系统内核层添加黑盒代码的⾰命性技术。这种查看内核中的操作,却不会 “⼲扰” 应⽤程序或内核本身的技术,从⽽使得 eBPF 获得可观测性强⼤能⼒。

因此使⽤ eBPF,即使不依赖操作系统公开的固定指标,我们也能直接从内核中收集和聚合⾃定义指标,并根据各种可能性来源,⽣成可⻅性事件。通过这种⽅式,我们将可见性扩展到内核,甚⾄可以通过仅收集所需的可见性数据,实现整体系统开销的降低。

eBPF 与其他收集遥测数据的⼿段相⽐,有以下优点:

1.低侵入性:它不需要业务系统埋点,也不修改内核源代码,从⽽减⼩了监测系统与业务系统、内核之间的耦合。

2.安全:它不会改变任何内核源代码。eBPF 程序在转换为字节码后会经过验证阶段以防⽌资源泄漏、⽆限循环等意外情况。它运⾏在沙盒环境以访问有限的内核辅助函数。

3.方便:与任何其他 Linux 监控替代⽅案相⽐,您可以获得更精细的细节和内核上下⽂。还可以⾃由导出监控数据并将其摄取到第三⽅可视化⼯具中。

五、基于 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 正在发展成为可观测性的标准基础。


​擎创科技,Gartner连续推荐的AIOps领域标杆供应商。公司致力于协助企业客户提升对运维数据的洞见能力,优化运维效率,充分体现科技运维对业务运营的影响力。

行业龙头客户的共同选择

​了解更多运维干货与技术分享

可以右上角一键关注

我们是深耕智能运维领域近十年的

连续多年获Gartner推荐的AIOps标杆供应商

下期我们不见不散


http://www.niftyadmin.cn/n/358256.html

相关文章

unity根据点生成mesh

生成Mesh的代码 public class SpwanMesh : MonoBehaviour {public Material material;public bool createCube;private GameObject cubeParent;private Transform meshParent;

[Mybatis-plus插件如何根据其他属性值修改数据 /根据其他属性去查询数据]

目录 前言: update update2 查询条数: 前言: 记录一下, mybatis-plus 除了主键去修改数据/或者查询数据 使用其他属性去操作的场景 update 可以使用UpdateWrapper或LambdaUpdateWrapper构建更新条件,然后将条件传入UpdateChainWrapper的update方法中。例如&am…

npm 无法下载 win32-x64-72_binding.node

使用npm安装node-sass时,其依赖了win32-x64-72_binding.node,但是一直提示“cannot download http://xxx/win32-x64-72_binding.node”,有两种方案可以解决,一种是在有私服的情况下,可以通过设置 SASS_BINARY_SITE 环境…

MySQL基础 — 多表查询以及事务管理

文章目录 MySQL基础 — 多表查询以及事务管理一、多表查询1.1 对应关系1.2 准备数据1.3 概述1.4 内连接1.5 外连接1.6 自连接1.7 联合查询 union1.8 子查询1.8.1 标量子查询1.8.2 列子查询1.8.3 行子查询1.8.4 表子查询 二、事务2.1 简介2.2 操作演示2.3 控制事务2.3.1 控制事务…

redis-server源码

1 redis主流程 redis启动流程: 1 加载配置&#xff1b;2 初始化redis master、slave以及sentinel的sri&#xff1b;3 注册事件事件serverCron。 <span style"background-color:#f5f2f0"><span style"color:black"><span style"color:…

JSON数据解析

JSON JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。 Python3中可以使用json模块来对JSON数据进行编码&#xff0c;它包含了两个函数&#xff1a; json.dumps()&#xff1b;对数据进行编码json.loads()&#xff1b;对数据进行解码 Py…

Qt编写视频监控系统75-计算实时码率并显示

一、前言 做监控摄像头的实时视频显示&#xff0c;一般还会要求统计实时码率显示在通道画面上&#xff0c;一个是为了测试下整个软件的性能&#xff0c;同时也看下当前到底是主码流还是子码流&#xff0c;设备到底是不是真的按照设定的码流大小来传输视频数据的。视频码率就是…

遍历 globals() 时必不可少的 RuntimeError

文章目录 参考描述globals() 函数For Loop 过程中产生的迭代变量Runtime Errordictionary changed size during iteration异常产生原因解决方案copy 方法绕过 RuntimeError 产生 RuntimeError 异常的基本要求遍历 locals() 时可能产生的 RuntimeError 参考 项目描述Python 官方…