eBPF給Linux內(nèi)核帶來了可編程性,由于其安全湾盗、靈活、對(duì)應(yīng)用無侵入的特點(diǎn)立轧,在云原生網(wǎng)絡(luò)格粪、安全、可觀測(cè)性方面帶來了很多創(chuàng)造性的應(yīng)用氛改。本文基于Cilium項(xiàng)目的首席開源官Liz Rice在InfoQ Live上的分享整理帐萎。原文:eBPF - Superpowers for Cloud Native Operations[1]
Liz Rice是Isovalent的首席開源官,Isovalent是云原生網(wǎng)絡(luò)和安全專家胜卤,是基于eBPF的Cilium項(xiàng)目的創(chuàng)建者疆导。她是CNCF技術(shù)監(jiān)督委員會(huì)主席,并于2018年擔(dān)任KubeCon + CloudNativeCon聯(lián)合主席葛躏。她是O'Reilly出版的《容器安全(Container Security)》一書的作者澈段。
我叫Liz Rice,是Isovalent的首席開源官舰攒,這家公司是Cilium網(wǎng)絡(luò)項(xiàng)目的幕后推手败富。我也是CNCF技術(shù)監(jiān)督委員會(huì)主席。今天我想和你們談?wù)別BPF摩窃,這是一項(xiàng)讓我興奮了一段時(shí)間的技術(shù)兽叮。我想和大家分享的是,為什么它真正革命性的改變了為網(wǎng)絡(luò)猾愿、可觀察性和安全性而構(gòu)建工具的方式鹦聪,尤其是在云原生的世界中。
什么是eBPF蒂秘?
讓我們從了解eBPF開始椎麦。我們一般會(huì)完整拼出這個(gè)縮寫,它代表了擴(kuò)展的伯克利包過濾器(Extended Berkeley Packet Filter)材彪。作為一個(gè)名字观挎,它并不是非常有用,提供不了多少信息段化,你真正需要知道的是嘁捷,eBPF允許你編寫在內(nèi)核中運(yùn)行的自定義代碼。你不再需要編寫新的內(nèi)核模塊,可以根據(jù)需要?jiǎng)討B(tài)加載和卸載eBPF程序。你可能知道蜈块,我們編寫的應(yīng)用程序通常是在用戶空間中運(yùn)行贮预,用戶空間應(yīng)用程序能做的事情很有限,需要通過系統(tǒng)調(diào)用接口來請(qǐng)求內(nèi)核幫它做一些事情仗考。實(shí)際上,只要應(yīng)用程序想做什么有意思的事情,內(nèi)核就會(huì)參與進(jìn)來港谊。例如每次你想在屏幕上顯式字符或打開一個(gè)文件或發(fā)送一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包,都將涉及到內(nèi)核橙弱。
在內(nèi)核中運(yùn)行用戶代碼
對(duì)于eBPF程序歧寺,我們必須編寫兩個(gè)部分,eBPF程序本身通過C語言編寫棘脐,另外需要編寫一個(gè)用戶空間應(yīng)用程序斜筐,它將通過系統(tǒng)調(diào)用接口來加載eBPF程序,并將其附加到某個(gè)將觸發(fā)我們eBPF程序運(yùn)行的事件上蛀缝。我們可以將eBPF程序附加到許多不同類型的事件上顷链。最早實(shí)現(xiàn)的事件是收到網(wǎng)絡(luò)數(shù)據(jù)包的時(shí)候,這就是包過濾這個(gè)名字的由來屈梁。此外還可以附加到其他事件上嗤练,例如kprobe,它是內(nèi)核中函數(shù)的入口俘闯,kretprobe潭苞,它是內(nèi)核中函數(shù)的返回值。它們?cè)谟脩艨臻g中也有等價(jià)的接口真朗,uprobe和uretprobe此疹。你還可以將eBPF程序附加在跟蹤點(diǎn)(trace point)上。幾乎可以將eBPF程序插入內(nèi)核中的任何位置遮婶,只要你知道事件發(fā)生時(shí)涉及到的內(nèi)核函數(shù)蝗碎,這樣就可以將eBPF程序附加到代碼中的正確位置。
按照傳統(tǒng)旗扑,我們要寫一個(gè)Hello World蹦骑,這是我的Hello World。我們很快過一下makefile臀防,可以看到我們要構(gòu)建一個(gè)應(yīng)用程序和一個(gè)object文件眠菇。有許多不同的方法可以組合eBPF對(duì)象程序和eBPF用戶空間應(yīng)用程序边败。在這個(gè)例子中使用的框架允許我單獨(dú)構(gòu)建對(duì)象文件,然后加載它捎废,并在用戶空間應(yīng)用程序中運(yùn)行它笑窜。實(shí)際上我構(gòu)建了兩個(gè)目標(biāo),可執(zhí)行文件本身和作為目標(biāo)文件的eBPF代碼登疗。eBPF代碼非常簡單排截,只是Hello World。bpf_printk這個(gè)函數(shù)很方便辐益,可以輸出消息以及相關(guān)的上下文信息断傲。這個(gè)程序?qū)⒂上到y(tǒng)調(diào)用execve觸發(fā),每次運(yùn)行新程序智政,這個(gè)系統(tǒng)調(diào)用都會(huì)被觸發(fā)或調(diào)用认罩,任何新程序都會(huì)觸達(dá)調(diào)用點(diǎn)(kprobe),從而觸發(fā)eBPF程序運(yùn)行女仰。
上面的C代碼運(yùn)行在內(nèi)核中猜年,Go代碼運(yùn)行在用戶空間。用戶空間程序主要是將目標(biāo)文件加載到內(nèi)核中疾忍,從對(duì)象文件中獲取Hello World程序乔外,并將其附加到系統(tǒng)調(diào)用,然后還將負(fù)責(zé)實(shí)際獲取輸出并打印到屏幕上一罩。
如果執(zhí)行make杨幼,編譯系統(tǒng)會(huì)分別編譯C代碼和Go代碼。
如果以非特權(quán)用戶身份運(yùn)行程序聂渊,系統(tǒng)會(huì)報(bào)錯(cuò)差购,因?yàn)樾枰粋€(gè)叫做CAP_BPF的功能,這是一個(gè)特權(quán)功能汉嗽,需要作為root用戶執(zhí)行欲逃,或者也可以給個(gè)別用戶權(quán)限,但作為普通無特權(quán)的用戶沒有權(quán)限執(zhí)行饼暑。
以root用戶身份運(yùn)行稳析,可以看到一些跟蹤消息。這臺(tái)機(jī)器上正在進(jìn)行很多操作弓叛,有很多node和shell在運(yùn)行彰居。
我在另一個(gè)bash shell中運(yùn)行ps,可以看到我的bash-22005撰筷,對(duì)應(yīng)于運(yùn)行ps的進(jìn)程ID陈惰。指出這一點(diǎn)的原因是這個(gè)非常簡單的eBPF Hello World可以看到所有這些不同的進(jìn)程調(diào)用的執(zhí)行。誰執(zhí)行的毕籽,從哪發(fā)起的執(zhí)行抬闯,都不重要井辆,只要它們是發(fā)生在這個(gè)虛擬機(jī)上,發(fā)生在這個(gè)內(nèi)核中画髓,那么我的eBPF程序就會(huì)被觸發(fā)掘剪。這是eBPF的強(qiáng)大功能之一,它連接到內(nèi)核奈虾,而虛擬機(jī)上只有一個(gè)內(nèi)核。這個(gè)Hello World非常簡單廉赔,如果你想深入了解肉微,我在GitHub上提供了一些更高級(jí)的例子:github.com/lizrice/ebpf-beginners。
Kubernetes的可編程內(nèi)核
讓我們來看看Kubernetes的世界蜡塌,想想當(dāng)我們?cè)谌萜骱蚿od中運(yùn)行應(yīng)用程序代碼時(shí)碉纳,能夠?qū)BPF程序附加到內(nèi)核中意味著什么。我們的容器化應(yīng)用程序主要在用戶空間中運(yùn)行馏艾,像任何其他應(yīng)用程序一樣劳曹,如果它想做一些有用的事情,不得不請(qǐng)求內(nèi)核代表它去做琅摩。在Kubernetes中铁孵,這些容器被包含在稱為pod的抽象中,但它們?nèi)匀还蚕硪粋€(gè)內(nèi)核房资。每個(gè)主機(jī)(Kubernetes節(jié)點(diǎn))只有一個(gè)內(nèi)核蜕劝,可以是物理機(jī),也可以是虛擬機(jī)轰异。
如果運(yùn)行在pod中的應(yīng)用程序嘗試做一些有趣的事情岖沛,比如讀寫文件,或發(fā)送/接收網(wǎng)絡(luò)流量搭独,或者創(chuàng)建一個(gè)新的容器婴削,都會(huì)涉及到內(nèi)核,內(nèi)核知道機(jī)器上運(yùn)行的所有應(yīng)用程序中發(fā)生的所有事情牙肝。這意味著唉俗,如果我們將eBPF程序連接到內(nèi)核中適當(dāng)?shù)狞c(diǎn)上,就可以知道在用戶空間中運(yùn)行的所有pod惊奇、所有應(yīng)用程序中發(fā)生的所有事情互躬。
Kubernetes可識(shí)別的網(wǎng)絡(luò)流量
讓我們特別考慮一下網(wǎng)絡(luò),以及Kubernetes對(duì)網(wǎng)絡(luò)的感知能力颂郎。當(dāng)我們?cè)贙ubernetes運(yùn)行pod時(shí)吼渡,每個(gè)pod都有一個(gè)唯一的IP地址。pod的生命周期非常短暫乓序,可以動(dòng)態(tài)的創(chuàng)建銷毀寺酪,根據(jù)需求動(dòng)態(tài)縮放pod是很常見的坎背。每次創(chuàng)建pod時(shí),都要給它分配一個(gè)IP地址寄雀,這意味著IP地址的生命周期也是短暫的得滤。傳統(tǒng)上,我們會(huì)監(jiān)控網(wǎng)絡(luò)流量盒犹,看到它們從一個(gè)IP地址流向另一個(gè)IP地址懂更,這是很有用的。但在Kubernetes的世界里急膀,這會(huì)很難處理沮协,因?yàn)檫@些pod的地址一直在變化。
下面我想快速演示一下Cilium是如何跟蹤endpoint的卓嫂。每次創(chuàng)建pod時(shí)慷暂,Kubernetes都會(huì)向網(wǎng)絡(luò)插件請(qǐng)求一個(gè)IP地址。我們把Kubernetes集群里的所有pod都顯示出來晨雳,有許多不同的應(yīng)用pod行瑞,網(wǎng)絡(luò)是通過Cilium建立的。
這個(gè)集群有兩個(gè)node餐禁,每個(gè)node上都有一個(gè)Cilium代理血久。Cilium代理負(fù)責(zé)獲取每個(gè)pod在節(jié)點(diǎn)上創(chuàng)建時(shí)的IP地址。如果訪問其中一個(gè)pod (hqk94)坠宴,可以獲取該代理知道的endpoint列表洋魂,可以看到標(biāo)簽信息和endpoint信息。
對(duì)于每個(gè)endpoint喜鼓,我們都知道與之相關(guān)的Kubernetes標(biāo)簽副砍、命名空間,知道它在哪個(gè)服務(wù)帳戶下運(yùn)行庄岖。對(duì)于代理知道的每個(gè)endpoint豁翎,可以將IP地址與pod和在該pod中運(yùn)行的應(yīng)用程序關(guān)聯(lián)起來。把這些信息放在一起隅忿,就可以提取出與這些應(yīng)用程序相關(guān)的網(wǎng)絡(luò)信息心剥。這是Cilium用戶界面的截圖,顯示了不同服務(wù)之間的流量背桐。因?yàn)橛蠭P地址和pod之間的映射优烧,所以它知道每個(gè)消息涉及哪個(gè)pod。
這是監(jiān)控Kubernetes網(wǎng)絡(luò)流量的一種非常強(qiáng)大的方法链峭。這種方式之所以可能畦娄,是因?yàn)榘–ilium在內(nèi)的eBPF應(yīng)用程序可以知道整個(gè)節(jié)點(diǎn)上發(fā)生的所有事情。需要注意,eBPF可以看到在其他pod中運(yùn)行的所有應(yīng)用程序熙卡,而無需更改這些應(yīng)用程序杖刷。這不涉及任何指令,不需要更改應(yīng)用程序配置驳癌,eBPF代碼可以自動(dòng)識(shí)別它們滑燃。
Sidecar模式
Nathan LeClaire最近在Twitter上發(fā)了這個(gè)非常棒的保險(xiǎn)杠貼紙?jiān)停艺J(rèn)為它很好的包裝了使用eBPF的可觀察性和安全工具的強(qiáng)大能力(到目前為止颓鲜,通常被實(shí)現(xiàn)為sidecar模型)表窘。在sidecar模型中,可觀察性或安全工具作為sidercar容器注入到每個(gè)pod中灾杰。sidecar也是一個(gè)容器蚊丐,pod中的所有容器都可以共享網(wǎng)絡(luò)命名空間和卷信息等內(nèi)容,所以sidecar可以看到pod中其他容器中發(fā)生的事情艳吠。為了在pod里部署sidecar,必須在YAML中進(jìn)行配置孽椰。這項(xiàng)操作可能是手動(dòng)的昭娩,也可能是自動(dòng)的。你可以將sidecar定義注入應(yīng)用程序YAML黍匾,從而實(shí)現(xiàn)自動(dòng)化部署栏渺。它可以在部署之前定義,或者是通過接入控制webhook動(dòng)態(tài)完成锐涯。無論如何磕诊,sidecar模式要求將sidecar容器注入到每個(gè)pod中。如果sidecar沒有得到正確的配置纹腌,就無法在pod中運(yùn)行霎终。這是sidecar脆弱的一點(diǎn),如果惡意用戶設(shè)法運(yùn)行了一個(gè)pod升薯,并避免了sidecar的注入莱褒,那就無法看到該pod中發(fā)生了什么。
eBPF的真正好處之一是我們不需要做任何更改涎劈,就可以讓程序在內(nèi)核中運(yùn)行广凸,知道所有的容器和pod中發(fā)生的所有事情,不需要在任何地方修改任何YAML蛛枚,也不需要在應(yīng)用程序中添加任何工具谅海。這就是為什么有許多新項(xiàng)目基于eBPF以及這種技術(shù)令人興奮的原因之一,使用eBPF來實(shí)現(xiàn)可觀察性和安全性工具蹦浦,當(dāng)然還有孕育了這種技術(shù)的網(wǎng)絡(luò)場(chǎng)景扭吁。
云原生中的eBPF
接下來我們快速瀏覽一下云原生環(huán)境中的一些eBPF項(xiàng)目。我已經(jīng)講了一些關(guān)于Cilium的內(nèi)容,它是基于eBPF的網(wǎng)絡(luò)智末。實(shí)際上谅摄,我們可以使用eBPF使網(wǎng)絡(luò)中的某些部分更加高效。Falco是CNCF醞釀的一個(gè)安全工具項(xiàng)目系馆,用來監(jiān)視安全事件送漠,并在這些事件發(fā)生時(shí)發(fā)出警報(bào)。Tracee是另一個(gè)類似Falco的項(xiàng)目由蘑,但可能更容易安裝和配置闽寡。比Falco更輕量,但也更不成熟尼酿。最后是Pixie爷狈,這是一個(gè)新產(chǎn)品,最近被New Relic收購后提出將其貢獻(xiàn)給CNCF沙箱裳擎。Cilium的孵化申請(qǐng)也在進(jìn)行中涎永。所有這些項(xiàng)目都在利用eBPF在云原生上做一些非常有趣和強(qiáng)大的事情。
進(jìn)程可視化
我想展示一些我們?cè)贑ilium中進(jìn)行的實(shí)驗(yàn)鹿响,結(jié)合了之前展示的兩個(gè)概念羡微。在Hello World演示中,可以看到進(jìn)程ID和調(diào)用進(jìn)程的名稱惶我。eBPF可以訪問有關(guān)進(jìn)程和在這些進(jìn)程中運(yùn)行的程序的信息妈倔,也有關(guān)于Cilium的網(wǎng)絡(luò)流量的信息。如果我們將這兩種類型的信息結(jié)合在一起绸贡,就會(huì)得到這樣的信息:我們可以確切的看到哪個(gè)進(jìn)程盯蝴、在哪個(gè)節(jié)點(diǎn)上、在哪個(gè)pod中听怕、在哪個(gè)命名空間捧挺、正在運(yùn)行什么可執(zhí)行文件、在處理哪個(gè)特定的網(wǎng)絡(luò)連接叉跛。
在這個(gè)例子中松忍,有Twitter和Elasticsearch的網(wǎng)絡(luò)連接,這看起來完全合理筷厘。假設(shè)還存在與加密貨幣礦機(jī)的連接鸣峭,或某個(gè)惡意應(yīng)用程序的已知命令和控制中心。有了這些信息酥艳,就能夠準(zhǔn)確的追蹤到哪個(gè)可執(zhí)行文件負(fù)責(zé)打開該連接摊溶,以及是從哪個(gè)pod打開的。這將給你提供所有可能需要的證據(jù)來追溯漏洞是在哪里發(fā)生的或者攻擊是如何發(fā)生的充石。
總結(jié)
希望這能讓你對(duì)eBPF的強(qiáng)大功能有所了解莫换。eBPF不是魔法,需要我們編寫代碼。為了有效的訪問信息拉岁,其中一些代碼將需要大量的內(nèi)核數(shù)據(jù)結(jié)構(gòu)知識(shí)坷剧。編寫eBPF代碼不是一件容易的事,但它確實(shí)提供了非常強(qiáng)大的好處喊暖。到目前為止惫企,我已經(jīng)討論了如何使Linux內(nèi)核可編程。但eBPF不僅限于Linux陵叽,微軟最近宣布了Windows上的eBPF狞尔,采用相同的概念和相同的通用抽象,但不會(huì)是一模一樣的巩掺。你沒法將一個(gè)在Linux上運(yùn)行的eBPF應(yīng)用程序直接在Windows上運(yùn)行偏序,因?yàn)樗鼈冊(cè)趦?nèi)核中查看的數(shù)據(jù)結(jié)構(gòu)并不相同,只是盡量保持概念的一致胖替。不僅僅適用于Linux研儒,我認(rèn)為這是eBPF生態(tài)系統(tǒng)真正令人興奮的事情。
資源
希望上面的介紹能讓你了解為什么我對(duì)eBPF如此興奮独令。如果你想了解更多殉摔,在eBPF網(wǎng)站[2]上有一些很棒的資源。當(dāng)然记焊,如果你想了解更多關(guān)于Cilium網(wǎng)絡(luò)的知識(shí),可以訪問Cilium[3]和Isovalent[4]的官網(wǎng)栓撞。Slack上還有一個(gè)非常有用的關(guān)于Cilium和eBPF的頻道遍膜。
Q&A
Ruckle:我在云原生領(lǐng)域工作已經(jīng)有一段時(shí)間了。Linux內(nèi)核并不總是能讓人想到創(chuàng)新的地方瓤湘。正如你所描述的瓢颅,有許多非常聰明的工程師試圖找到提高內(nèi)核可編程性的方法,并最終打開了巨大的可能性弛说。從你最后描述的使用這種技術(shù)的開源項(xiàng)目和事物的成熟度來看挽懦,這種技術(shù)可能會(huì)比人們想象的更快的進(jìn)入Kubernetes生產(chǎn)集群。eBPF進(jìn)展如何木人?我知道Netflix最近有一篇關(guān)于他們?nèi)绾问褂盟牟┛臀恼滦攀痢D阍趺纯次覀儸F(xiàn)在的狀況?這是創(chuàng)新者的事情嗎醒第?還是已經(jīng)進(jìn)入早期使用者階段了渔嚷?你認(rèn)為這項(xiàng)技術(shù)在成熟度范圍內(nèi)屬于哪個(gè)位置?
Rice:由于Linux內(nèi)核支持的成熟稠曼,對(duì)于eBPF來說形病,這是一個(gè)非常有趣和令人興奮的時(shí)刻。當(dāng)某些東西第一次進(jìn)入Linux內(nèi)核時(shí),一切都很好漠吻,只是沒人用它量瓜。實(shí)際上,人們傾向于使用已經(jīng)發(fā)布幾年的內(nèi)核途乃。內(nèi)核需要一段時(shí)間才能進(jìn)入所有不同的Linux發(fā)行版绍傲。如果你運(yùn)行的是Red Hat Linux,或者是長期支持的Ubuntu發(fā)行版欺劳,那么它可能使用的是幾個(gè)月前唧取,甚至是一兩年前的內(nèi)核。現(xiàn)在划提,eBPF的支持在內(nèi)核中已經(jīng)存在了很長時(shí)間枫弟,已經(jīng)相當(dāng)成熟了,大多數(shù)人在生產(chǎn)環(huán)境中使用的內(nèi)核都具有運(yùn)行eBPF的能力鹏往。這就意味著我們突然從一個(gè)有趣的實(shí)驗(yàn)變成了一個(gè)潛在的框架淡诗。平臺(tái)實(shí)際上存在于每個(gè)人的生產(chǎn)環(huán)境中,對(duì)于基于eBPF的工具來說伊履,當(dāng)前是一個(gè)非常好的時(shí)機(jī)韩容。
其中一些工具已經(jīng)存在一段時(shí)間了。你提到的Netflix唐瀑,來自Netflix的Brendan Gregg是eBPF領(lǐng)域的真正創(chuàng)新者之一群凶。多年來,他一直在談?wù)摵謇薄⒄故竞褪褂胑BPF请梢,特別是在性能測(cè)量和調(diào)優(yōu)方面。Netflix已經(jīng)在生產(chǎn)環(huán)境中用了很長時(shí)間了力穗。Facebook也參與了eBPF的創(chuàng)新毅弧,并且一直在使用并公開談?wù)撍麄円呀?jīng)使用了很長時(shí)間的一些事情。如果我們考慮采用曲線(在CNCF中被稱為跨越鴻溝曲線)当窗,我們很喜歡把不同項(xiàng)目的成熟度階段映射到這條曲線上够坐。也許沙盒是為創(chuàng)新者準(zhǔn)備的,孵化是為早期采用者準(zhǔn)備的崖面,畢業(yè)是為早期的大多數(shù)準(zhǔn)備的≡現(xiàn)在我們開始看到處于孵化階段的eBPF項(xiàng)目。事實(shí)上嘶朱,如果你現(xiàn)在正在使用這些工具蛾坯,其實(shí)你并沒有完全處于前沿位置。希望這能夠說明關(guān)于成熟度的問題疏遏。
Ruckle:我認(rèn)為你說得很有道理脉课,比如Netflix和Facebook救军,所有這些和云有關(guān)的變化,都傾向于從符合這種類型的公司開始倘零。如果這些公司在生產(chǎn)環(huán)境上自信的使用這種技術(shù)唱遭,這可能意味著成熟度和工具開始發(fā)揮作用,其他類型的工程組織也會(huì)開始利用這種技術(shù)呈驶。
然后拷泽,如果你有一個(gè)水晶球,你認(rèn)為eBPF在五年內(nèi)會(huì)如何發(fā)展袖瞻?你對(duì)這項(xiàng)技術(shù)的目標(biāo)和期望是什么司致?我知道你在幾個(gè)月前將eBPF和Docker進(jìn)行了比較,思考它如何真正改變了一些事情聋迎。如果可以的話脂矫,請(qǐng)告訴我們你對(duì)未來五年的看法。
Rice:即使是最謹(jǐn)慎的估計(jì)霉晕,我也認(rèn)為我們將看到基于eBPF的工具被非常廣泛的采用庭再,正如我試圖傳達(dá)的那樣,它們不需要以任何方式修改應(yīng)用程序牺堰,甚至不需要改變應(yīng)用的配置方式拄轻,更不用說添加任何工具了。我認(rèn)為這使得它在所有這些可觀察性工具中非常強(qiáng)大伟葫,我們?cè)诨谖⒎?wù)的環(huán)境中更需要這些工具恨搓,需要大規(guī)模的工具筏养。在我看來,我們很可能看到這些工具逐漸成熟并被廣泛采用撼玄。我們最終會(huì)看到eBPF被大規(guī)模的用于許多基于網(wǎng)絡(luò)的功能。例如掌猛,F(xiàn)acebook和Cloudflare,都發(fā)表過關(guān)于他們?nèi)绾问褂胑BPF來幫助解決拒絕服務(wù)攻擊等問題眉睹。如果使用eBPF,可以在一個(gè)數(shù)據(jù)包實(shí)際出現(xiàn)在你的機(jī)器上的時(shí)候竹海,很早就把它鉤住,實(shí)際上斋配,當(dāng)它還在網(wǎng)卡中的時(shí)候灌闺,如果你能看到這個(gè)數(shù)據(jù)包并說"我不喜歡這個(gè)樣子。這是惡意的"坏瞄,然后就可以直接丟棄。對(duì)于某些類型的攻擊鸠匀,這是一個(gè)非常強(qiáng)大的保護(hù)機(jī)制。
另一方面缀棍,我們會(huì)在五年內(nèi)看到什么宅此?我們會(huì)看到很多內(nèi)核功能在eBPF中被重寫嗎?我們是否可以看到內(nèi)核的一些特性被更高效或更可定制的eBPF實(shí)現(xiàn)所取代爬范?這是我們開始看到的一些東西父腕。例如,在網(wǎng)絡(luò)數(shù)據(jù)路徑中坦敌,如果有一個(gè)確切知道往哪里發(fā)送網(wǎng)絡(luò)數(shù)據(jù)包的eBPF程序侣诵,那就不必遍歷整個(gè)IP協(xié)議棧以及內(nèi)核中的所有IP表。我不認(rèn)為我們會(huì)用eBPF取代整個(gè)Linux內(nèi)核狱窘,但我們可能會(huì)看到內(nèi)核的很多領(lǐng)域都有這些替代實(shí)現(xiàn)杜顺。看到這些發(fā)展將會(huì)非常有趣蘸炸。
最后躬络,我對(duì)eBPF在Windows上所發(fā)生的事情感到興奮。如果我們有可以跨操作系統(tǒng)使用的eBPF功能搭儒,會(huì)發(fā)生什么穷当?這可能是非常強(qiáng)大和有趣的。
Ruckle:我認(rèn)為這個(gè)問題的答案總是視情況而定淹禾。我很欣賞你對(duì)不同情況分別進(jìn)行了謹(jǐn)慎馁菜、樂觀的分析。從成本優(yōu)化铃岔,彈性以及其他方面汪疮,都可以從eBPF中得到很多好處,因此似乎不可避免會(huì)在接下來的幾年里在所有場(chǎng)景中扮演某種角色毁习。那么幾個(gè)監(jiān)聽相同事件的eBPF程序是否會(huì)相互沖突智嚷?
Rice:在某些情況下,不可能纺且,因?yàn)楦鶕?jù)正在運(yùn)行的程序的類型盏道,可能只能觀察信息,不一定能改變狀態(tài)载碌。例如猜嘱,如果你連接到一個(gè)系統(tǒng)調(diào)用,可以看到該系統(tǒng)調(diào)用的參數(shù)泉坐,但不能更改它們。從這個(gè)意義上說腕让,不同程序中哪個(gè)最先出現(xiàn)并不重要,他們不應(yīng)該互相影響偏形。如果你正在處理網(wǎng)絡(luò)數(shù)據(jù)包,并且可能會(huì)將它們丟棄俊扭,這顯然會(huì)產(chǎn)生影響坠陈,你肯定需要能夠?qū)λ鼈冞M(jìn)行優(yōu)先級(jí)排序,我不太確定怎么決定順序仇矾。
Ruckle:我們可以說eBPF是服務(wù)網(wǎng)格的進(jìn)化嗎?
Rice:我不能說它本身就是服務(wù)網(wǎng)格的進(jìn)化贮匕。我確實(shí)認(rèn)為有一些有趣的東西,一些服務(wù)網(wǎng)格的功能可以在eBPF中實(shí)現(xiàn)刻盐,其中一個(gè)例子就是加密。你可以用服務(wù)網(wǎng)格在這兩個(gè)服務(wù)之間設(shè)置mTLS敦锌,確保不同服務(wù)之間的流量是加密的。通過使用網(wǎng)絡(luò)層加密可以獲得相同的效果行冰,Cilium支持這一功能,我相信其他的網(wǎng)絡(luò)層也一樣。如果你能感知服務(wù)疯特,知道兩端都可以加密和解密,就可以使用IPsec或WireGuard之類的東西在網(wǎng)絡(luò)層加密漓雅,盡管并不完全相同朽色,但都可以實(shí)現(xiàn)加密通信的目的组题。還有一些與服務(wù)網(wǎng)格相關(guān)的其他功能,也可以在eBPF中實(shí)現(xiàn)崔列。我想說的是,將eBPF更多的看作是一個(gè)可以構(gòu)建工具的環(huán)境盈咳,而不是工具本身。我不會(huì)說它是服務(wù)網(wǎng)格鱼响,但它使你能夠構(gòu)建服務(wù)網(wǎng)格功能组底。
Ruckle:我認(rèn)為看看社區(qū)如何利用這一點(diǎn),以及其他一些服務(wù)網(wǎng)格社區(qū)如何開始使用eBPF债鸡,如何聚合,隨著時(shí)間的推移有一些真正有趣的eBPF應(yīng)用娘锁,這將是一件很酷的事情。
Rice:完全正確间雀。
Ruckle:除了網(wǎng)絡(luò)、安全性和可觀察性惹挟,我們還看到eBPF可以用在哪些場(chǎng)景缝驳?
Rice:還有什么?
Ruckle:研發(fā)用狱,研發(fā)人員會(huì)在這方面亂作一團(tuán)。
Rice:我不認(rèn)為會(huì)看到用戶空間應(yīng)用程序進(jìn)入內(nèi)核領(lǐng)域夏伊。也許我錯(cuò)了,但我傾向于認(rèn)為咏连,我們更有可能看到在eBPF中實(shí)現(xiàn)內(nèi)核中現(xiàn)有的功能盯孙。我在想振惰,一定還有其他一些有趣的方面,并不是網(wǎng)絡(luò)骑晶、安全性和可觀察性的一部分埠偿。網(wǎng)絡(luò)、安全性和可觀察性涵蓋了相當(dāng)多的內(nèi)容冠蒋。
Ruckle:內(nèi)核的范圍很大,都可以考慮可編程性抖剿。其中有大量的技術(shù),以及可能被技術(shù)改進(jìn)或顛覆的東西脑融。讓我們繼續(xù)關(guān)注,看看社區(qū)會(huì)出現(xiàn)什么肘迎。
您認(rèn)為用C編寫eBPF代碼的抽象層對(duì)新程序員有幫助嗎?這方面有什么想法或動(dòng)力嗎妓布?
Rice:現(xiàn)在,我們用一個(gè)受限的C版本編寫eBPF程序匣沼。雖然是C代碼捂龄,但有些事情是不被允許的。比如倦沧,在解引用指針之前,必須檢查指針是否為空展融,因?yàn)椴幌胱寖?nèi)核崩潰。現(xiàn)在,我們還是用C寫這些代碼暂雹。我在這里展示了一個(gè)Hello World,我認(rèn)為它很有趣仙逻,可以解釋正在發(fā)生的事情。我真的不認(rèn)為會(huì)有一個(gè)應(yīng)用程序開發(fā)人員突然編寫大量eBPF代碼的世界系奉,就像我不認(rèn)為會(huì)看到人們對(duì)內(nèi)核做出貢獻(xiàn)一樣姑廉。大多數(shù)時(shí)候,我們依靠內(nèi)核維護(hù)者來代表我們完成這些工作桥言。我想對(duì)于eBPF來說也是一樣的,我們可能會(huì)看到一些eBPF功能庫并鸵,人們可以將其用作構(gòu)建塊。
我們已經(jīng)有了一個(gè)抽象园担,即bpftrace,這是一種更高級(jí)別的工具弯汰,允許你表示希望在何處掛鉤eBPF程序卤档,還提供了一些基本功能,如事件計(jì)數(shù)劝枣。最近發(fā)生的另一件事是Rust編譯器,它合并了一個(gè)PR來支持BPF作為編譯目標(biāo)舔腾,這樣就可以在Rust中編寫eBPF代碼,將其編譯并加載到內(nèi)核中哗脖。這將是一個(gè)有趣的嘗試。
Ruckle:有沒有號(hào)召所有人采取行動(dòng)才避?他們應(yīng)該用eBPF做什么?跟他們信任的供應(yīng)商談一談桑逝?對(duì)社區(qū)做出貢獻(xiàn)?在你分享了這些信息后茬暇,你會(huì)建議人們做什么?
Rice:我認(rèn)為糙俗,從運(yùn)維角度來看预鬓,eBPF是一種新的平臺(tái)技術(shù),一種新的做事方式珊皿,對(duì)大多數(shù)Kubernetes集群的運(yùn)維人員來說可能非常有用。我100%鼓勵(lì)有興趣的人參與進(jìn)來蟋定,嘗試一下,看看eBPF初學(xué)者指南扼仲。對(duì)大多數(shù)人來說,我們不需要真正深入細(xì)節(jié)屠凶。也許一個(gè)新的可觀察性工具是用Rust編寫的,或者一個(gè)新的安全工具是用Rust編寫的矗愧,我們可能會(huì)想郑原,“這真是一種很酷的語言。我對(duì)這個(gè)工具感興趣是因?yàn)樗怯肦ust編寫的”犯犁,因?yàn)橐苍S我們意識(shí)到Rust具有安全優(yōu)勢(shì)。我只是以Rust為例酸役。我想我們可能會(huì)以同樣的方式對(duì)待eBPF驾胆,eBPF作為一個(gè)平臺(tái)有一些優(yōu)勢(shì)贱呐,當(dāng)我們考慮在環(huán)境中需要什么工具時(shí),不要因?yàn)樗皇怯胑BPF編寫的而忽略任何東西锅必。就像你不會(huì)說我使用的每個(gè)工具都必須用Rust編寫一樣。你可能會(huì)說,我想研究一些基于eBPF的工具驹愚,因?yàn)樗鼈兲峁┝艘恍﹥?yōu)勢(shì)。我們可以一起來探索逢捺。
References:
[1] https://www.infoq.com/presentations/ebpf-cloud-native/
[2] https://ebpf.io/
[3] https://cilium.io/
[4] https://www.isovalent.com/
你好,我是俞凡倘潜,在Motorola做過研發(fā),現(xiàn)在在Mavenir做技術(shù)工作涮因,對(duì)通信、網(wǎng)絡(luò)养泡、后端架構(gòu)奈应、云原生、DevOps杖挣、CICD、區(qū)塊鏈惩妇、AI等技術(shù)始終保持著濃厚的興趣,平時(shí)喜歡閱讀屿附、思考,相信持續(xù)學(xué)習(xí)褒翰、終身成長,歡迎一起交流學(xué)習(xí)优训。
微信公眾號(hào):DeepNoMind