技术流 | 使用eBPF增强kubernetes可观测性的实践分享

news2024/11/14 0:48:33

本文作者:擎创科技某大拿

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

narak靶机详解

narak靶机复盘 首先对靶机进行扫描,找到靶机的真实ip地址。 然后dirb进行目录扫描,扫描到一个目录,我们打开发现是一个登陆界面。 并没有用户名和密码,我们就用cewl扫描这个网站,扫出一个字典,用来暴力破…

2、JDk、JRE、JVM三者区别和联系

JDK JRE JVM 含义 JDK: Java Develpment Kit java 开发工具 JRE: Java Runtime Environment java 运行时环境 JVM: java Virtual Machine java 虚拟机 一张图来解释: 联系: JVM不能单独搞定class的执行,解释class的时候JVM需要调用解…

Openlayers实战:非4326,3857的投影

Proj4js 是一个 JavaScript 库,用于将点坐标从一个坐标系转换到另一个坐标系,包括基准转换。Openlayers地图上,除了默认的4326和3857投影方式外,可以通过Proj4js的拓展,可以显示其他的投影。 本实战中,将ESRI:53009投射到Openlayers地图上。 安装依赖 npm install proj4…

java高级语法笔记

Java ArrayList java泛型语法介绍 https://www.runoob.com/java/java-generics.html 匿名函数->(Lambda 表达式 ,java8的新特性)

使用openKylin操作系统下载VMware Tools教程(超详细图文教程)

目录 前言操作步骤验证使用 前言 VMware Tools作为一个VMware十分有用的工具,下载它也经常作为配置VMware的一个常有环节。本篇文章,我将用国产操作系统openKylin为大家演示如何下载安装VMware Tools。 操作步骤 1.点击 虚拟机----安装VMware Tools…

Kubernets与Docker的故事

在 2016 年底的 1.5 版里,Kubernetes 引入了一个新的接口标准:CRI ,Container Runtime Interface。 CRI 采用了 ProtoBuffer 和 gPRC,规定 kubelet 该如何调用容器运行时去管理容器和镜像,但这是一套全新的接口&#…

diffusion model(四)文生图diffusion model(classifier-free guided)

文章目录 系列阅读 文生图diffusion model(classifier-free guided)背景方法大意模型如何融入类别信息(或语义信息)采用交叉注意力机制融入基于channel-wise attention融入 如何训练 ϵ θ ( x t , y , t ) \epsilon_{\theta}(x_t…

P2 第一章 电路模型与电路定律

1、电源为什么可以等效为负值电阻? 当然电源可以等效为负值电阻,但是它不是真实电阻。 思考:阻碍反义词有推动,电动势:即电子运动的趋势,能够克服导体电阻对电流的阻力,使电荷在闭合的导体回路…

【Linux后端服务器开发】信号量与信号

目录 一、信号量概述 二、信号概述 三、信号产生 1、终端按键产生信号 2、调用系统函数产生信号 3、硬件异常产生信号 4、软件条件 四、信号保存 1、信号阻塞 2、信号捕捉流程 五、信号递达 一、信号量概述 信号量:一个计数器,通常用来表示公…

【档案专题】二、电子档案管理

导读:主要针对电子档案管理相关内容介绍。对从事电子档案管理信息化的职业而言,不断夯实电子档案管理相关理论基础是十分重要。只有通过不断梳理相关知识体系和在实际工作当中应用实践,才能走出一条专业化加职业化的道路,从而增强…

《黑马头条》 ElectricSearch 分词器 联想词 MangoDB day08-平台管理[实战]作业

07 app端文章搜索 1) 今日内容介绍 1.1)App端搜索-效果图 1.2)今日内容 2) 搭建ElasticSearch环境 2.1) 拉取镜像 docker pull elasticsearch:7.4.0 2.2) 创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticse…

Android 查看ANR和Crash日志(adb bugreport)

今天测试那儿出了个ANR,我自己手机没问题,很烦,定位不了位置。 于是还是得用ADB连接来看一下,之前用,但是老是会忘记,今天总结一下。 ADB命令查看应用包名_adb查看包名命令_&岁月不待人&的博客-C…

基于matlab使用部分或较低分辨率图像快速处理阻塞图像(附源码)

一、前言 此示例展示了如何使用两种策略快速处理阻塞图像,这两种策略可以对高分辨率图像的较小代表性样本进行计算。 处理被阻止的图像可能非常耗时,这使得算法的迭代开发成本过高。有两种常见的方法可以缩短反馈周期:迭代较低分辨率的图像…

【Tensorflow2.x】tensorflow-gpu 在 Ubuntu 上的安装

好几次遇到问为什么安装的 tensorflow 不能调用GPU,之前搞定过几次,前两天又有人问,又捣鼓了很久才搞定,这里简单记录一下我遇到的问题,以及解决方案。 一、安装方法 (一)安装并更新 conda 1…

C++STL:顺序容器之list

文章目录 1. 概述2. 成员函数3. list容器的创建4. 迭代器5. 访问元素6. 添加/插入元素list insert()成员方法list splice()成员方法 7. 删除元素 1. 概述 STL list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着&#xff0c…

RTOS学习笔记

前言 进程?线程?并发?并行?主线程?子线程?主线程中创建子线程?每个线程就是一个死循环? 进程 多个线程,每个线程可以写一个死循环处理一个需要循环执行的代码块&#x…

leetcode-203.移除链表元素

leetcode-203.移除链表元素 文章目录 leetcode-203.移除链表元素题目描述代码提交 题目描述 代码提交 代码 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode *dummyhead new ListNode(0); // 设置一个虚拟头结点,堆上dummyhead->ne…

SOLIDWORKS、UG、Proe三款三维绘图软件哪个好?

提到制图,很多人可能会先想到AutoCAD,但它现在主要会被用来进行二维的平面制图。3DMAX是一款被广泛应用的三维制图软件。Proe也是一种比较好用的三维建模软件。而SW也就是SolidWorks更为知名,它是世界上第一个专为Windows系统开发的三维CAD建…

解决小程序 scroll-view 里面的image有间距、小程序里面的图片之间有空隙的问题。

1)小程序 image跟view标签上下会有间隙,解决方法如下: 在image那里设置vertical-align:top/bottom/text-top/text-bottom 原因:图片文字等inline元素默许是跟父级元素的baseline对齐,而baseline又和父级底边有必定间距…

web 前端 Day 3

伪类选择器 <title>伪类选择器</title> </head> <style>a:link {color: beige;} a:visited {color: aquamarine; } a:hover { 鼠标悬停cursor: cell; 鼠标样式font-size: 80px; } a:active {font-size: 70px; } div{width: 300px;height: 400…