首页 > 其他分享 >基于eBPF是云原生可观测实践

基于eBPF是云原生可观测实践

时间:2023-11-01 16:31:31浏览次数:34  
标签:原生 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等云原生平台、虚拟机集群、物理机、还是科创环境,都可实现适配,采用一套采集方式来实现多环境覆盖。

标签:原生,eBPF,观测,采集,内核,应用,链路
From: https://blog.51cto.com/u_13431807/8129562

相关文章

  • 详细讲解原生js拖拽
    场景描述今天遇见一个问题,那就是产品希望在弹出来的窗口。可以移动这个弹窗的位置增加用户体验,我们直接使用的element-ui中的Dialog对话框我们现在需要拖拽标题,移动元素位置元素拖拽的思路要让元素按下移动,我们需要实现以下几个步骤:1.鼠标按下元素跟随光标移动2.鼠标抬起元......
  • 使用原生js 写的picker 效果
    classPicker{ DEFAULT_DURATION=200; MIN_DISTANCE=10; DEMO_DATA=[]; //demo数据 //惯性滑动思路: //在手指离开屏幕时,如果和上一次move时的间隔小于`MOMENTUM_LIMIT_TIME`且move //距离大于`MOMENTUM_LIMIT_DISTANCE`时,执行惯性滑动......
  • android ebpf中的CO-RE学习
    CO-RE原理因为不同的内核版本的系统内部结构体会有差异,例如structuser_arg_ptr,当内核编译配置中存在CONFIG_COMPAT=y的时候,会在native成员之前增加一个布尔变量is_compat,这样native的偏移就发生的变化。如果编写的ebpf内核程序需要访问structuser_arg_ptr类型的变量就需要考......
  • APP开发选原生开发还是混合开发?
    最近也有不少用户留言,问一些基础的内容,例如:App采用怎样的开发方式更好?便有感而发,希望通过这篇文章再做一下小结。先亮结果,是采用原生还是混合的开发方式,需要先了解业务规划,然后根据业务的实际需求再制定研发技术选型及研发计划。为什么只能一事一议?这个还得从技术架构的优劣势开始......
  • 云原生架构实战04 kubeSphere 平台安装
    一、Kubernetes上安装KubeSpherehttps://kubesphere.com.cn/安装步骤选择4核8G(master)、8核16G(node1)、8核16G(node2)三台机器,按量付费进行实验,CentOS7.9安装Docker安装Kubernetes安装KubeSphere前置环境安装KubeSphere1、安装Dockersudoyumremovedocker*sudoyuminstall-yyum......
  • 单像素成像中观测矩阵的设计
    1.2022-DeepLearningOptimizedTerahertzSingle-PixelImaging创新点:However,allthesereportsfocusonreducingthesamplingrateorthenumberofpatternsM,butleavethesamplingtimeperpatternt0untouched.观测矩阵:However,thesecompressedsensingalgor......
  • 原生分页接口
    packagemainimport( "encoding/json" "gorm.io/driver/mysql" "gorm.io/gorm" "math" "net/http" "strconv")//封装接口返回的三要素:1状态2提示3数据typeApiResponsestruct{ Codeint`json:&......
  • 原生微信小程序有什么好的ui框架?
    对于原生微信小程序的UI框架,以下是一些常见的选择:1.WeUI:WeUI是一套详尽且易于扩展的UI组件库,它提供了丰富的组件,如按钮、表单、导航等,适合快速开发小程序。2.VantWeapp:VantWeapp是有赞前端团队推出的一款优秀的小程序UI框架,它提供了丰富的组件和工具,支持九宫格、导航、表单、弹......
  • http-template实现原生分页
     packagemainimport( "gorm.io/driver/mysql" "gorm.io/gorm" "html/template" "io" "math" "net/http" "os" "strconv")//商品结构体typeGoodsstruct{ Idint......
  • C#winform软件实现一次编译,跨平台windows和linux兼容运行,兼容Visual Studio原生界面Fo
    一、背景:微软的.netcore开发工具,目前来看,winform界面软件还没有打算要支持linux系统下运行的意思,要想让c#桌面软件在linux系统上运行,开发起来还比较麻烦。微软只让c#的控制台软件支持在linux运行。二、解决方案:我想到的一个方案是自定义封装软件的System.Windows.Forms组件,把......