基于eBPF技术的云原生可观测实践

**

基于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等云原生平台、虚拟机集群、物理机、还是科创环境,都可实现适配,采用一套采集方式来实现多环境覆盖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9857.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++案例

目录 一、while循环猜数组 二、 水仙花数 三、for循环敲桌子游戏 四、99乘法表 五、一维数组--元素逆置 六、冒泡排序 七、封装一个函数--利用冒泡排序,实现对整型数组的升序排序 八、结构体嵌套结构体 九、结构体排序 一、while循环猜数组 说明&#x…

【vue3中使用swiper组件】

【vue3中使用swiper组件】超详细保姆级教程 效果展示简介版本安装Swiper用法完整代码展示html静态展示js逻辑展示(vue3 --- ts)官方文档导入模块 css样式展示 (自行更改所需)官方文档样式 效果展示 简介版本 安装Swiper 项目终端中…

国产自研开源大数据管理平台DataSophon

【背景】 几天在朋友圈看到开源社区Datavane发布了一个新开源项目DataSophon;一个致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台,帮助快速构建起稳定、高效、可弹性伸缩的大数据云原生平台;从介绍内容来看非常优秀&#xff…

golang Redis的新数据类型github.com/go-redis/redis/v8实践

Redis的新数据类型# 在redis中,后面添加了几个比较高级的数据类型 hyperloglog基数统计、GEO存储地理位置、bitmap位图、stream为消息队列设计的数据类型 这 4 种数据类型。 HyperLogLog类型# HyperLogLog简介# HyperLogLog 是一种用于数据统计的集合类型&#x…

计算机网络_ 1.3 网络核心 (数据交换_电路交换)

计算机网络_数据交换_电路交换 计算机网络_数据交换_电路交换 计算机网络_数据交换_电路交换 最典型电路交换网络:电话网络电路交换的三个阶段 建立连接(呼叫/电路建立)通信释放连接(拆除电路) 独占资源 电路交换网络…

RNN LSTM

参考资料: 《机器学习2022》李宏毅史上最详细循环神经网络讲解(RNN/LSTM/GRU) - 知乎 (zhihu.com) LSTM如何来避免梯度弥散和梯度爆炸? - 知乎 (zhihu.com) 1 RNN 的结构 首先考虑这样一个 slot filling 问题: 注意…

postgresql内核分析 spinlock与lwlock原理与实现机制

​专栏内容: postgresql内核源码分析 手写数据库toadb 并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 概述 在postgresql 中,有大量的并发同步&#xff0…

硬件速攻-激光测距传感器VL530L0X

介绍 VL53L0X是一种时间飞行(Time-of-Flight,TOF)技术的激光测距传感器芯片。TOF技术利用红外激光发射器发送短脉冲光束,并通过测量光束从传感器到目标物体返回的时间来计算距离。 外观 现象 串口打印数据 接线 VCC 3.3V G…

MFC 单文档模式

Doc类利用自带框架存数据 void CCADDoc::Serialize(CArchive& ar) {if (ar.IsStoring()){// TODO: 在此添加存储代码//保存数据到文件ar << m_nShapeCount;for (int i 0; i < m_arrShapes.GetSize(); i){CShape* pShape NULL;pShape (CShape*)m_arrShapes[i];…

Prometheus 时序数据

一 时序索引 Prometheus 存储的是时序数据&#xff0c;时间戳&#xff08;timestamp&#xff09;来源于服务端本地的系 统时间。Prometheus 使用 Unix 时间戳&#xff08;即自 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数&#xff09;表示时间。 数 据 格 式 &#xff1a; …

C++—异常与类型转换、大小端存储、不使用额外空间的情况下交换两个数

异常 常见的异常包括&#xff1a;数组下标越界&#xff0c;除法计算的时候除数为0&#xff0c;动态分配空间时空间不足。 try&#xff0c;throw&#xff0c;catch #include <iostream> using namespace std; int main() {double m 1, n 0;try {cout << "b…

基于 RK3399+fpga 的 VME 总线控制器设计(一)总体设计

2.1 需求分析及技术指标 2.1.1 需求分析 VME 总线控制器需要实现数据传输、中断处理、测量显示等功能。同时还需 要具有操作系统、底层驱动程序以及功能接口等&#xff0c;以方便用户进行上层应用软件开 发及使用。 本课题需要实现 VME 控制器的国产化开发&#xff0…