强烈建议先看我的这篇博文,对BPF相关社区和生态有所了解。

声明:下文提到的BPF字样没有特别说明的话,是泛指cBPF和eBPF。

第一个专属于BPF技术的技术大会

第一次在Thomas的Twitter上看到要办eBPF技术大会的时候,兴奋不已,作为一个已经学习BPF技术大半年并且还在持续学习中的爱好者,就像粉丝看到偶像要办演唱会一样,迫不及待地要买票入场,一睹偶像们的音容笑貌。这次是Thomas所在的公司Isovalent作为主办方,说是邀请了一众BPF圈内大咖,看到会议日程出来后,直呼简直是神仙阵容,然后我就连续熬了两个通宵,在线看完了这场技术盛宴的直播,下面是我从个人角度出发的对大会的回顾文字。

Day 1 Keynote演讲概要

Liz女神手把手教你写BPF程序

开场的是Liz Rice,容器圈闻名遐迩的技术女神,有着极为深厚的技术功底,YouTube上有很多她播放量很高的talk视频,建议大家都找来看看,她的talk特点就是讲技术深入浅出,配合live coding,让你感觉醍醐灌顶。之前就有过如何徒手用go语言实现一个container,这次也不例外,手写了一个通过attach kprobe钩子,观测clone这个syscall的BPF程序,随后又把它完善成基于BPF map存储当前触发系统调用的UID和相关次数,最后借助BCC,用Python写了读取BPF map的运行在用户空间的BPF程序。

Liz本家是Aqua Security,我大概两年前使用过他们家的容器安全平台,支持容器镜像扫描和容器运行时监测,应该算是当时业界首家,当时肯定没用上BPF作为产品基础,现在肯定是了。

Cilium大佬Daniel秀BPF肌肉

第二个上场是Daniel Borkmann,Linux内核BPF圈的「红人」,也是Cilium背后的技术大拿,因此他的大多数talk是关于BPF实现网络优化的,这次的talk题目很大:BPF as a Fundamentally Better Dataplane(个人翻译:BPF是一个作为基础数据平面的更好选择),主要还是讲了BPF作为网络管理基有着哪些优势,如相比DPDK在某些场景下性能表现更优异,相比传统防火墙,BPF作安全策略更适合等。

DataDog高工们的野望达成史

第三个是来自DataDog的两位Laurent和Tabitha,一男一女,都是技术大拿。Laurent讲述了Datadog自己如何使用Cilium作为网络方案来改善k8s集群的网络问题,内容上突出了Cilium最大的特点——替换了kube-proxy。接着Tabitha讲述了基于BPF技术重构了他们的产品——DataDog-Agent,增强了安全性监测能力。

Google瑞士小哥主打KRSI安全牌

第四个是来自Google的瑞士小哥,他的主题是如何通过eBPF技术加强系统级别的安全审计能力。这个小哥的PPT很有意思,对谈式演讲,或者称之为自问自答式。他提到了KRSI(Kernel Runtime Security Instrumentation),是一种基于Linux Security Module(LSM)钩子编写eBPF程序,实现高级的安全审计的能力。最后他提到了几个刚刚merged到内核代码的eBPF功能,其中在系统启动时自动加载BPF程序,我觉得很cool。后来发现他之前在LPC 2020 – Networking and BPF Summit也讲过这个topic。

Day 1 Lightning talks概要

Lightning talk定位是一个5分钟的talk,快速简洁地表达你的idea。Day 1有大概十几个Lightning talk,下面主要选取了两个我个人觉得印象深刻的,展开讲讲。

第一个是来自Datadog大胡子老哥Bryce Kahle,他的主题是How and When You Should Measure CPU Overhead of eBPF Programs,本质上就是如何Profile eBPF程序,一旦开始大量写程序,Profile这件事情一定会提上日程。他提到一个系统参数kernel.bpf_stats_enabled,是用来开启收集eBPF程序的状态信息,主要是run_time_nsrun_cnt这两个参数,前者代表内核累计花了多少时间运行这个BPF程序,后者是这个BPF程序累计运行了多少次:

开启了这个参数后,可以通过以下几种方式获取BPF程序的运行信息:

  • 使用bpftool prog show命令,执行后直接显示结果
  • 使用cat /proc/<pid>/fdinfo/<bpf_prog_fd>命令,执行后直接显示结果
  • 使用BPF_OBJ_GET_INFO_BY_FD的BPF系统调用方法,编程获取结果

最后,他提到了DataDog刚开源的ebpfbench,通过写Go程序来profile eBPF程序,主要是利用了Go原生的benchmark能力,配合ebpf的Go SDK加载eBPF程序,实现Profile目的。
期间,除了如何对eBPF程序进行Profile有所理解,还注意到了内核代码中bpf_prog_info结构,存储了很多BPF程序的metadata,有空得研究下。

第二个是来自Cilium母公司Isovalent的女性工程师Beatriz Martinez,她的主题是Zero Instrumentation Monitoring with Your First Steps in eBPF,这位女高工设计了2个Demo:

第一个Demo,事先写了一个简单http服务,想要不修改源代码来记录访问请求的IP地址,并定位统计它们来自世界哪些地方的。她给出的实现也很容易理解:首先写了一个BPF网络程序attach到TC ingress钩子上,实现收集访问请求的IP地址,并保存到BPF Map中;然后用Go语言写了哥用户程序,读取BPF Map中的IP地址信息,结合GeoIP库,确认IP地址来自哪个地方,最后通过网页将访问请求来自哪里,可视化展示出来。

第二个Demo,同样是事先写了一个简单Go语言http服务,这个服务接受一些用户输入,想要不修改源代码来记录用户输入的值有哪些。她给出的实现方案是tracing go functions with uprobes。具体是用Go语言写了一个追踪程序,其中配合gobpf库,inline编写了一个eBPF程序,attach到uprobe事件的钩子上,并把追踪目标配置为原先Go http服务中处理用户输入的那个方法。

两个示例都是非常好的BPF入门教程,推荐大家可以自己编译运行试试,示例的github仓库在这里

Day 1 小结

Day 1内容非常翔实,有些简单看一眼无法马上理解,需要通过深度消化,一定能受益匪浅。另外,这种Keynote+Lightning talk时长一长一短的配合形式,个人觉得对于观看在线播放技术大会的观众,体验上更好,相比全是时长近半小时形式,可能会感觉疲倦。

Day 2 Keynote演讲概要

之前看到了Day 2的keynote schedule,就非常期待,大佬大神云集,因此我又来熬夜充值信仰了。

Alexei大佬打头阵,主张安全第一

Day 2开场的是eBPF创造者——Alexei Starovoitov大佬,他现在就职于Facebook,这次带来的主题是Safe programs. The foundation of BPF,翻译过来是,「安全编程是BPF的立根之本」。他强调了为什么eBPF能成为现在用来扩展内核功能的流行技术,居功至伟的就是BPF自身的验证器,程序加载到内核之前,验证器会检查程序是否安全,确保它们不会使内核崩溃,否则就不允许加载到内核中去。大家看我之前的博文里BPF程序的例子,出现频率最高的代码段就是内存访问边界的检查,你在普通C程序里基本看不到类似的,而在BPF程序里却是必要的。

整体讲的内容比较偏向low level,果然大神的风格,他最后用很有深意的一句话结束他的talk:

Maximum attention to safety in all aspects of BPF programming that’s what makes it unique and that’s why BPF is an undoubted choice today for kernel extensions and kernel programming.

之后大佬的Q&A环节非常火爆,大家可以去slack thread观瞻。由于时间问题,大佬回答了两个提问,内容挺有意思,我给大家翻译看看:

  • 提问:BPF是否需要开创一门专属的开发语言,而不是使用限制版的C语言?Alexei回答 C语言是BPF的发家之地,BPF在多年的发展演进中已经扩展很多C语言的功能,比如bpftrace使用的语法就是独立的,跟C语言很不一样。还比如我们开发了5-6个内置扩展功能,它们被LLVM支持,并能实现一次编译到处运行。所以BPF的现状是,它虽然在某些方面比传统C语言语法要求更严格,但是也提供很多功能是传统C语言无法实现的,因此BPF已经是一种“全新C语言风味”的新语言了。
  • 提问:是否可以将BPF 验证器的限制边界可配置化,实现更灵活的使用场景?Alexei表示BPF验证器是保障内核安全的关键,当然安全性是多维度的,现在看起来不允许的事情,将来当然也有可能会发生,我们希望做到安全地把它实现出来,而不是搬起石头砸用户的脚。

Falco女神Kris直播手撕内核模块

来自Sysdig Kris Nova,是CNCF唯一一个关注云原生运行时安全的Project——Falco的Core Maintainer之一,Live Coding党之一,也是我见过的最cool最活泼的技术女神,之前介绍Falco的博文特别介绍过她,也有她以往的talk视频,值得一看。这次talk一开始女神就皮了一下,说是特别感谢Thomas的耐心,因为她前前后后换了好多次主题,临近大会了还没定下来,最终给了一个听上去很大也很笼统的主题——Falco with prodution eBPF,肯定还是安利Falco,毕竟是基于BPF技术作系统追踪的集大成者。还有一个亮点,她是整场summit是唯一一个直播讲Keynote(其他人貌似都是放之前录好的keynote录像,也有可能是因为主题没提前定下来导致的),忍不住上一张女神字符化PPT的靓图。

整个talk从Falco的诞生、工作原理开头,再讲到如何在无法加载内核模块的GKE(谷歌K8S公有云平台)环境下,通过eBPF技术创建了一个模拟设备(emulation device),从而使加载新的功能模块到内核变成可能。

其中学到一个新词汇——Kernel Instrumentation,直译是为「给内核装上测量仪器」,非常形象地描绘了Falco之于系统内核的意义,它还有个副标题——Rebuilding the state at runtime,正面反映了BPF技术的超能力。

Demo环节主要讲了她如何基于几种不同的系统环境,快速编译出对应的可以使用的Falco可执行文件,包括作为没有使用BPF技术直接作为内核模块,以及使用BPF技术并在支持clang 9和clang 10两个不同版本的环境。

最后有个插曲,由于Kris太会边coding边讲了,Thomas不得打断了她的Demo,直接进入Q&A环境。

最强布道师Brendan教你如何像sysadmin思考

来了来了,第三个是千呼万唤始出来的最强BPF布道师Brendan Gregg,带来他最强的话题——Performance wins with BPF: Getting started ,熟悉Brendan的人都知道,他是Linux系统的性能优化大师,他的talk都在手把手教你如何性能调试,而他使用的最顺手的武器也就是基于BPF技术的BCC套件,这次也不例外,内容上就是围绕着他那张最著名的图,告诉大家已经提供了好多好多基于BPF的命令行工具,通过它们敲一行命令,就可以帮助你快速提升系统性能。

他给出takeway总结就是「Find some quick wins with bpf tools」,意思就是「人生苦短,我用BPF」,最后义正言辞地告诉我们他的观点——「Think like a sysadmin,not a programmer」,个人觉得最理想的状态是:

Think like a sysadmin,not only a programmer

才知道Brendan也是Dtrace的开发者,Dtrace好比是那个时代的Solaris系统下的bpftrace。

Google华人之光,玩转k8s网络策略

第四个是来自Google的华人女生Zang Li,看上去很年轻,真是年少有为。她带来的主题是Kubernetes Network Policy Logging with eBPF,即如何基于eBPF实现k8s网络策略的追踪日志,主要讲的GKE上如何实现可视化网络策略,通过记录每次网络策略的验证log,形成policy verdict event,再吐到下游平台产生观测价值。其中内核空间使用了bpf_skb_event_output()函数,将event信息发送给Perf Ring Buffer,再配合用户空间的Cilium Monitor技术栈,拉取数据,进而二次处理,由于会查看每个网络数据包,期间会有聚合多个网络数据包结果后再发送的操作。更多Google和Cilium合作的信息可以看这里

发现她讲PPT逻辑清晰,先讲需求,再讲已有方案的问题,再讲新的解决方案,适合做销售。

Cilium创始人Thomas压轴到来,献上未来蓝图

大会压轴讲Keynote的当然是主持人Thomas,他带来的主题是The Future of eBPF-based Networking and Security,看着就要发大招。上来介绍了Networking网络发展史,从上世纪90年代iptables的诞生到近十年最火的网络虚拟化。然后讲了eBPF发展演进史(我自己整理一版BPF技术发展史),提到eBPF技术的设计基础发生了变化,从原始的裸金属,到传统虚拟机,再到目前的由Kubernetes技术引领的云原生时代。

Thomas发布了Cilium项目2021年的RoadMap,包括具有socket-based load-balancing技术和Intra-pod k8s网络策略功能,这些对于sidecar模式很重要。他提出未来的网络基础会是基于eBPF技术的Service Mesh,因为它能带来更高效、更透明、更低成本、更容易集成到操作系统的完美体验,他表示最好的佐证例子是谷歌在GKE和Anthos中采用基于eBPF的Cilium项目,说明eBPF在Kubernetes和云原生环境的网络和安全方面发挥了核心作用。

所以Thomas是以史为镜,做了一次Cilium RoadMap发布会,干得漂亮。

Day 2 Lighting Talks概要

Day 2的Lighting Talk也不少,看到了不少熟悉的面孔,见识到了很多有趣新奇的idea,快速挑我印象深刻的recap一下:

  • 一个外国女生说是ebpf能拯救数据洪水,感兴趣的看她的项目仓库
  • DigitalOcean高工带来了使用Cilium 1年半的实战经验(大型user case现场),他们经历了从vxlan到direct routing的迁移,希望Cilium能有tracking connections in specific TCP states(like SYN/FIN)的功能,这个功能还蛮实用的。
  • Pixie Labs CEO Zain带来Debugging Go with eBPF,最近看过了他们的文章,并且试了一把,可行,可能是个新的工程效能提升点。
  • 来自Cloudflare的高工演示了如何使用bpf2go工具嵌入已经编译好的eBPF程序到Go项目中去,实现更方便地分发项目。Demo仓库在这里,很有意思,后面自己尝试下再来深聊。
  • 来自微软的印度老哥带来了Building a Behavioral Knowledge Graph using eBPF,他利用ebpf能capture 所有的syscall,来生成知识图谱,从中发现不同程序在运行状态下的关联,在Demo的时候,模拟了mirai botnet现象——物联网下的DDoS攻击,很有意思。
  • Cilium本家的口音小哥Martynas又来了,好像还是老话题讲Cilium基于eBPF的网络负载均衡原理,貌似连ppt都跟之前差不多。放一张他和Daniel Borkmann(拍照要记得插袋的那个)的靓图,他俩上除了Thomas之外,是最经常露脸的高工了。

会后有感

作为第一届BPF技术专属大会,请来了圈内一众技术大牌做talk,整体keynote质量还是能保证的,而且lightning talk中也不乏有惊喜的idea和工程实践,着实让我欣喜。再看BPF这项技术的生态发展,越来越多的技术人员开始优先使用它来进行系统优化、网络优化、安全防护、调用追踪等,可以预见的是,现在那些使用一个强大agent秀肌肉的厂商,都会投入BPF阵营,即基于BPF技术之上重构自家的agent,提供各种高阶功能,就看谁的前端可视化做得更得民心了。

大会彩蛋

大会在刚开始的时候,搞了一个为吉祥物取名的活动,这个吉祥物长这样:

我也去参与了下,本来想叫FastPowerBeeEpic,后来还是改为RockBee了,最终投票选出它得名叫eBee,算是个朗朗上口的名字吧。

6 对 “首届eBPF.io Summit 2020见闻”的想法;

发表评论

电子邮件地址不会被公开。 必填项已用*标注