0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

聊聊eBPF的超能力

Linux愛好者 ? 來源:云原生技術(shù)愛好者社區(qū) ? 作者:云原生技術(shù)愛好者 ? 2022-11-18 15:34 ? 次閱讀


什么是 eBPF

在開始之前,讓我們先談?wù)勈裁词?eBPF。該首字母縮寫詞代表可擴(kuò)展伯克利包過濾器。我不認(rèn)為這很有幫助。您真正需要知道的是,eBPF 允許您在內(nèi)核中運行自定義代碼。它使內(nèi)核可編程。讓我們稍作停頓,確保我們都在同一個頁面上了解內(nèi)核是什么。

內(nèi)核是操作系統(tǒng)的核心部分,分為用戶空間和內(nèi)核。我們通常編寫在用戶空間中運行的應(yīng)用程序。每當(dāng)這些應(yīng)用程序想要以任何方式與硬件交互時,無論是讀取還是寫入文件、發(fā)送或接收網(wǎng)絡(luò)數(shù)據(jù)包、訪問內(nèi)存,所有這些都需要只有內(nèi)核才能擁有的特權(quán)訪問權(quán)限。用戶空間應(yīng)用程序必須在想要做任何這些事情時向內(nèi)核發(fā)出請求。內(nèi)核還負(fù)責(zé)諸如調(diào)度這些不同的應(yīng)用程序之類的事情,以確保多個進(jìn)程可以同時運行。

通常,我們只能編寫在用戶空間中運行的應(yīng)用程序。eBPF 允許我們編寫在內(nèi)核中運行的內(nèi)核。我們將 eBPF 程序加載到內(nèi)核中,并將其附加到一個事件中。每當(dāng)該事件發(fā)生時,它將觸發(fā) eBPF 程序運行。事件可以是各種不同的事物。這可能是網(wǎng)絡(luò)數(shù)據(jù)包的到來。它可能是在內(nèi)核或用戶空間中進(jìn)行的函數(shù)調(diào)用。它可能是一個跟蹤點。我們可以在很多不同的地方附加 eBPF 程序,這看起來是一個完美的事件。

一個eBPF示例

為了更具體一點,我將在這里展示一個示例。這將是 eBPF 的 Hello World。這是我的 eBPF 程序。實際的 eBPF 程序就是這里的這幾行代碼。它們是用 C 編寫的,我的程序的其余部分是用 Python 編寫的。我的 Python 代碼實際上將我的 C 程序編譯成 BPF 格式。我所有的 eBPF 程序要做的就是在這里寫一些跟蹤,它會輸出 QCon。我將把它附加到執(zhí)行系統(tǒng)調(diào)用的事件中。

Execve 用于運行新的可執(zhí)行文件。每當(dāng)一個新的可執(zhí)行文件運行時,execve 就是它運行的原因。每次在我的虛擬機(jī)上啟動一個新的可執(zhí)行文件時,都會導(dǎo)致我的跟蹤被打印出來。

如果我運行這個程序,首先,我們應(yīng)該看到我們不允許加載 BPF,除非我們有一個特權(quán)調(diào)用 CAP BPF,它通常只保留給 root。我們需要超級用戶權(quán)限才能運行。讓我們用 sudo 試試。我們開始看到很多這些跟蹤事件被寫出。我正在使用云虛擬機(jī),使用 VS Code 遠(yuǎn)程訪問它。事實證明正在運行相當(dāng)多的可執(zhí)行文件。

在不同的 shell 中,讓我們運行一些東西,讓我們運行 ps。我們可以看到進(jìn)程 ID 1063059。這是我運行該 ps 可執(zhí)行文件觸發(fā)的跟蹤行。我們可以在跟蹤輸出中看到,我們不僅獲得了文本,還獲得了一些有關(guān)觸發(fā)該程序運行的事件的上下文信息。我認(rèn)為這是 eBPF 提供給我們的重要部分。

d59fddee-66f4-11ed-8abf-dac502259ad0.png

eBPF代碼必須是安全的

當(dāng)我們將 eBPF 程序加載到內(nèi)核中時,它的安全運行至關(guān)重要。如果它崩潰,那將導(dǎo)致整臺機(jī)器癱瘓。為了確保它是安全的,有一個稱為驗證的過程。當(dāng)我們將程序加載到內(nèi)核中時,eBPF 驗證器會檢查程序是否將運行完成。它永遠(yuǎn)不會取消引用空指針。它將執(zhí)行的所有內(nèi)存訪問都是安全且正確的。

這確保了我們正在運行的 eBPF 程序不會讓我們的機(jī)器宕機(jī),并且它們可以正確地訪問內(nèi)存。由于這個驗證過程,有時 eBPF 被描述為一個沙箱。例如,我確實想明確一點,這是一種與容器化不同的沙盒。

動態(tài)改變內(nèi)核行為

eBPF 允許我們在內(nèi)核中運行自定義程序。這是我們改變內(nèi)核的行為方式。這是一個真正的游戲規(guī)則改變者。過去,如果要更改 Linux 內(nèi)核,需要很長時間。它需要內(nèi)核編程方面的專業(yè)知識。如果您對內(nèi)核進(jìn)行更改,通常需要幾年時間才能從內(nèi)核進(jìn)入我們在生產(chǎn)中使用的不同 Linux 發(fā)行版。內(nèi)核中的新功能到達(dá)您的生產(chǎn)部署通常需要五年時間。這就是為什么 eBPF 突然成為如此流行的技術(shù)的原因。

大約在去年左右,幾乎所有生產(chǎn)環(huán)境都在運行 Linux 內(nèi)核,這些內(nèi)核足夠新,可以在其中包含 eBPF 功能。這意味著幾乎每個人現(xiàn)在都可以利用 eBPF 并且“ 這就是為什么你突然看到這么多工具在使用它。當(dāng)然,使用 eBPF,我們不必等待 Linux 內(nèi)核推出。如果我們可以在 eBPF 程序中創(chuàng)建新的內(nèi)核功能,我們可以將其加載到機(jī)器中。我們不必重新啟動機(jī)器。我們可以動態(tài)地改變機(jī)器的行為方式。我們甚至不必停止并重新啟動正在運行的應(yīng)用程序,這些更改會立即影響內(nèi)核。

動態(tài)漏洞修補(bǔ)

我們可以將其用于多種不同的目的,其中之一是動態(tài)修補(bǔ)漏洞。我們可以使用 eBPF 讓自己對漏洞利用更具彈性。我喜歡這種動態(tài)漏洞修補(bǔ)的一個例子是對死亡數(shù)據(jù)包的彈性。死亡數(shù)據(jù)包是利用內(nèi)核漏洞的數(shù)據(jù)包。隨著時間的推移,其中一些內(nèi)核無法正確處理數(shù)據(jù)包。

例如,如果您將一個不正確的長度字段放入該網(wǎng)絡(luò)數(shù)據(jù)包中,則隧道可能無法正確處理它,并且可能會崩潰或發(fā)生壞事。這很容易通過 eBPF 緩解,因為我們可以將 eBPF 程序附加到網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)的事件上。我們可以看一下包,看看它是否以利用此漏洞的方式形成,即有問題的數(shù)據(jù)包。難道是死亡之包?如果是,我們可以丟棄該數(shù)據(jù)包。

eBPF丟包

作為一個簡單的例子,我將展示另一個程序示例,該程序?qū)G棄特定形式的網(wǎng)絡(luò)數(shù)據(jù)包。在此示例中,我將查找 ping 數(shù)據(jù)包。這就是 ICMP 協(xié)議。我可以放下它們。這是我的程序。這里的細(xì)節(jié)不用太擔(dān)心,我基本上只是在看網(wǎng)絡(luò)數(shù)據(jù)包的結(jié)構(gòu)。我確定我找到了一個 ping 數(shù)據(jù)包。現(xiàn)在,我只允許他們繼續(xù)。XDP_PASS 意味著繼續(xù)做你對這個數(shù)據(jù)包所做的任何事情。這應(yīng)該發(fā)出你得到的任何追蹤。這實際上是一個名為 pingbox 的容器。

我將開始向該地址發(fā)送 ping,并且他們正在得到響應(yīng)。我們可以看到這里的序列號很好。眼下,我的 eBPF 程序沒有加載。我將運行一個 makefile 來編譯我的程序,清理之前連接到這個網(wǎng)絡(luò)接口的所有程序,然后加載我的程序。有make運行編譯,然后在這里附加到網(wǎng)絡(luò)接口eth0。您立即看到它開始追蹤,得到 ICMP 數(shù)據(jù)包。這并沒有影響行為,我的序列號仍然像以前一樣滴答作響。

d61e15f6-66f4-11ed-8abf-dac502259ad0.png

讓我們把它改成,丟棄。我們應(yīng)該看到的是這里的跟蹤仍在生成中。它繼續(xù)接收那些 ping 數(shù)據(jù)包。這些數(shù)據(jù)包正在被丟棄,因此它們永遠(yuǎn)不會得到響應(yīng)。在這邊,序列號已經(jīng)停止上升,因為我們沒有收到回復(fù)。讓我們把它改回PASS,然后再做一次。

我們應(yīng)該看到,有我的序列號,有 40 個左右的數(shù)據(jù)包丟失了,但現(xiàn)在它又可以工作了。我首先想說明的是,如何連接到網(wǎng)絡(luò)接口并處理網(wǎng)絡(luò)數(shù)據(jù)包。此外,我們可以動態(tài)地改變這種行為。我們不必停下來開始 ping。我們不必停下來開始任何事情。我們所做的只是改變內(nèi)核的行為。我正在說明這一點,以說明如何處理死亡場景包。

抵御漏洞利用

d656d13e-66f4-11ed-8abf-dac502259ad0.png

使用 BPF Linux 安全模塊,我們可以對許多其他不同的漏洞利用具有彈性。您可能遇到過 Linux 安全模塊,例如 AppArmor 或 SELinux。內(nèi)核中有一個 Linux 安全模塊 API,它為我們提供了許多不同的事件,例如 AppArmor 可以查看并確定該事件是否符合策略,并允許或禁止該特定行為繼續(xù)進(jìn)行。例如,允許或禁止文件訪問。

我們可以編寫附加到同一個 LSM API 的 BPF 程序。這給了我們更多的靈活性,更多的動態(tài)安全策略。例如,有一個名為 Tracee 的應(yīng)用程序,它是由我在 Aqua 的前同事編寫的,它將附加到 LSM 事件并決定它們是否符合策略。

故障恢復(fù)能力 - 負(fù)載均衡

d6778ab4-66f4-11ed-8abf-dac502259ad0.png

我們可也可以通過 eBPF 實現(xiàn)哪些其他類型的彈性?另一個例子是負(fù)載均衡。負(fù)載均衡可用于跨多個不同后端實例擴(kuò)展請求。我們經(jīng)常這樣做不僅是為了擴(kuò)展,而且是為了實現(xiàn)故障恢復(fù)和高可用性。我們可能有多個實例,因此如果其中一個實例以某種方式失敗,我們?nèi)匀挥凶銐虻钠渌麑嵗齺砝^續(xù)處理該流量。

在前面的示例中,我向您展示了一個連接到網(wǎng)絡(luò)接口的 eBPF 程序,或者更確切地說,它連接到稱為網(wǎng)絡(luò)接口的 eXpress 數(shù)據(jù)路徑的東西。在我看來,eXpress 數(shù)據(jù)路徑非???。您可能有 也可能沒有允許您實際運行 XDP 程序的網(wǎng)卡,所以在網(wǎng)絡(luò)接口卡的硬件上運行 eBPF 程序。XDP 盡可能接近網(wǎng)絡(luò)數(shù)據(jù)包的物理到達(dá)運行。如果你的網(wǎng)卡支持,可以直接在網(wǎng)卡上運行。在這種情況下,內(nèi)核的網(wǎng)絡(luò)堆棧甚至永遠(yuǎn)不會看到該數(shù)據(jù)包。它的處理速度非常快。

如果網(wǎng)卡不支持它,內(nèi)核可以再次運行您的 eBPF 程序,在收到該網(wǎng)絡(luò)數(shù)據(jù)包后盡可能早地運行。仍然超快,因為數(shù)據(jù)包不需要遍歷網(wǎng)絡(luò)堆棧,肯定永遠(yuǎn)不會被復(fù)制到用戶空間內(nèi)存中。

我們可以使用 XDP 非常快速地處理我們的數(shù)據(jù)包。我們可以做出決定,比如我們是否應(yīng)該重定向那個數(shù)據(jù)包。我們可以非常快地在內(nèi)核中進(jìn)行第 3 層、第 4 層負(fù)載平衡,甚至可能在內(nèi)核中,也可能在網(wǎng)卡上決定我們是否應(yīng)該將此數(shù)據(jù)包向上傳遞到網(wǎng)絡(luò)堆棧并傳遞給用戶這臺機(jī)器上的空間。也許我們應(yīng)該將負(fù)載均衡到完全不同的物理機(jī)器上。我們可以重定向數(shù)據(jù)包。我們可以非??斓刈龅竭@一點。所以可以將其用于負(fù)載平衡。

Kube proxy代理

d6a7bc84-66f4-11ed-8abf-dac502259ad0.png

讓我們簡單地把我們的想法轉(zhuǎn)向 Kubernetes。在 Kubernetes 中,我們有一個稱為 kube-proxy 的負(fù)載均衡器。kube-proxy 允許負(fù)載均衡或告訴 pod 流量如何到達(dá)其他 pod。來自一個 pod 的消息如何到達(dá)另一個 pod?它充當(dāng)代理服務(wù)。如果本質(zhì)上不是負(fù)載均衡器,什么是代理?使用 eBPF,我們不僅可以選擇附加到盡可能靠近物理接口的 XDP 接口。我們也有機(jī)會附加到套接字接口上,以便盡可能靠近應(yīng)用程序。

應(yīng)用程序通過套接字接口與網(wǎng)絡(luò)通信。我們可以附加到來自 pod 的消息,并且可能繞過網(wǎng)絡(luò)堆棧,因為我們想將它發(fā)送到不同機(jī)器上的 pod,或者我們可以繞過網(wǎng)絡(luò)堆棧并直接循環(huán)回到在同一物理機(jī)或同一虛擬機(jī)上運行的應(yīng)用程序。通過盡早攔截數(shù)據(jù)包,我們可以做出這些決策。我們可以避免遍歷整個內(nèi)核的網(wǎng)絡(luò)堆棧,它給我們帶來了一些令人難以置信的性能改進(jìn)。與基于 iptables 的 Kube-proxy 相比,Kube-proxy 的替換性能可以顯著提高。

高效支持K8S的感知網(wǎng)絡(luò)

d6fbfaba-66f4-11ed-8abf-dac502259ad0.png

我現(xiàn)在想更深入地探討一下為什么 eBPF 可以啟用這種真正高效的網(wǎng)絡(luò),尤其是在 Kubernetes 中。通常,網(wǎng)絡(luò)堆棧非常復(fù)雜。通過內(nèi)核網(wǎng)絡(luò)堆棧的數(shù)據(jù)包會經(jīng)歷一大堆不同的步驟和階段,因為內(nèi)核決定如何處理它。在 Kubernetes 中,我們不僅在主機(jī)上擁有網(wǎng)絡(luò)堆棧,而且我們通常為每個 pod 運行一個網(wǎng)絡(luò)命名空間。通過擁有自己的網(wǎng)絡(luò)命名空間,每個 pod 都必須運行自己的網(wǎng)絡(luò)堆棧。

想象一個到達(dá)物理 eth0 接口的數(shù)據(jù)包。它遍歷整個內(nèi)核的網(wǎng)絡(luò)堆棧,以到達(dá)它注定要去的 pod 的虛擬以太網(wǎng)連接。然后它穿過 POD 網(wǎng)絡(luò)堆棧通過套接字訪問應(yīng)用程序。如果我們使用 eBPF,特別是如果我們知道 Kubernetes 身份和地址,我們可以繞過主機(jī)上的那個堆棧。

當(dāng)我們在那個 eth0 接口上接收到一個數(shù)據(jù)包時,如果我們已經(jīng)知道該 IP 地址是否與特定的 pod 相關(guān)聯(lián),我們基本上可以進(jìn)行查找并將該數(shù)據(jù)包直接傳遞給 pod,然后通過 pod 的網(wǎng)絡(luò)堆棧,但不必經(jīng)歷主機(jī)網(wǎng)絡(luò)堆棧上發(fā)生的所有復(fù)雜性。

d728f92a-66f4-11ed-8abf-dac502259ad0.png

使用像 Cilium 這樣為 Kubernetes 啟用 eBPF 的網(wǎng)絡(luò)接口,我們可以啟用此網(wǎng)絡(luò)堆棧快捷方式,因為我們知道 Kubernetes 身份。我們知道哪些 IP 地址與哪些 pod 相關(guān)聯(lián),也知道哪些 pod 與哪些服務(wù)相關(guān)聯(lián),以及命名空間。有了這些知識,我們就可以構(gòu)建這些服務(wù)地圖,顯示集群內(nèi)不同組件之間的流量是如何流動的。eBPF 讓我們可以看到數(shù)據(jù)包。我們可以看到,不僅僅是目標(biāo) IP 地址和端口,我們還可以通過代理路由來找出它是什么 HTTP 請求類型。我們可以將該數(shù)據(jù)流與 Kubernetes 身份相關(guān)聯(lián)。

在 Kubernetes 網(wǎng)絡(luò)中,IP 地址一直在變化,Pod 來來去去。IP 地址一分鐘可能意味著一件事,兩分鐘后,它意味著完全不同的事情。IP 地址對于理解 Kubernetes 集群中的流量并沒有太大幫助。Cilium 可以將這些 IP 地址映射到正確的 pod、任何給定時間點的正確服務(wù),并為您提供更多可讀信息。它明顯更快。無論您是使用 Cilium 還是其他 eBPF 網(wǎng)絡(luò)實現(xiàn),在主機(jī)上獲取網(wǎng)絡(luò)堆棧的能力都為我們帶來了可衡量的性能改進(jìn)。

我們可以在這里看到,左邊的藍(lán)線是每秒請求數(shù)的請求-響應(yīng)率,我們可以在沒有任何容器的情況下實現(xiàn),只是直接在節(jié)點之間發(fā)送和接收流量。我們可以獲得幾乎與使用 eBPF 一樣快的性能。中間的黃色和綠色下方的條向我們展示了如果我們不使用 eBPF 會發(fā)生什么,并且我們使用通過主機(jī)網(wǎng)絡(luò)堆棧的傳統(tǒng)主機(jī)路由方法,它明顯變慢了。

eBPF網(wǎng)絡(luò)決策

我們還可以利用 Kubernetes 身份和丟棄數(shù)據(jù)包的能力來構(gòu)建非常有效的網(wǎng)絡(luò)策略實施。你看到丟包是多么容易。與其只是檢查數(shù)據(jù)包并確定它是 ping 數(shù)據(jù)包,不如將數(shù)據(jù)包與策略規(guī)則進(jìn)行比較并決定是否應(yīng)該轉(zhuǎn)發(fā)它們。這是我們擁有的非常好的工具。

你可以在 networkpolicy.io 上找到它來可視化 Kubernetes 網(wǎng)絡(luò)策略。我們討論了負(fù)載均衡,以及如何在 Kubernetes 集群中以 kube-proxy 的形式使用負(fù)載均衡。畢竟,Kubernetes 為我們提供了巨大的彈性。如果pod中的應(yīng)用程序崩潰,它可以在沒有任何操作員干預(yù)的情況下動態(tài)重新創(chuàng)建。我們可以自動擴(kuò)展而無需操作員干預(yù)。

故障恢復(fù)能力 ClusterMesh

如果您的集群在特定數(shù)據(jù)中心運行并且您失去與該數(shù)據(jù)中心的連接,那么集群作為一個整體的彈性會怎樣?通常,我們可以使用多個集群。我想展示 eBPF 如何使多個集群之間的連接變得非常簡單。在 Cilium 中,我們使用一個稱為 ClusterMesh 的功能來做到這一點。使用 ClusterMesh,我們有兩個 Kubernetes 集群。

每個集群中運行的 Cilium 代理會讀取一定量的關(guān)于該 ClusterMesh 中其他集群狀態(tài)的信息。每個集群都有自己的配置和狀態(tài)數(shù)據(jù)庫存儲在 etcd 中。我們運行一些 etcd 代理組件,使我們能夠找出我們需要的多集群特定信息,以便所有集群上的 Cilium 代理可以共享該多集群狀態(tài)。

多集群狀態(tài)是什么意思?通常,這將是關(guān)于創(chuàng)建高度可用的服務(wù)。我們可能會在多個集群上運行一個服務(wù)的多個實例,以使它們具有高可用性。使用 ClusterMesh,我們只需將服務(wù)標(biāo)記為全局,并將它們連接在一起,以便訪問該全局服務(wù)的 pod 可以在其自己的集群上訪問它,或者在需要時在不同的集群上訪問它。

我認(rèn)為這是 Cilium 的一個非常好的功能,并且非常容易設(shè)置。如果一個集群上的后端 pod 因某種原因被破壞,或者整個集群出現(xiàn)故障,我們?nèi)匀豢梢詫碜栽摷荷掀渌?pod 的請求路由到另一個集群上的后端 pod。它們可以被視為一項分布式集群服務(wù)。

我想我有一個例子。我有兩個集群。我的第一個集群啟動了,我們可以看到 cm-1(代表 ClusterMesh 1)和第二個集群 cm-2。他們都在運行一些 pod。我們經(jīng)常在 Cilium 做一些星球大戰(zhàn)主題的演示。在這種情況下,我們有一些希望能夠與 Rebel 基地通信的X-wings戰(zhàn)斗機(jī)。我們在第二個集群上也有一些類似的 X-wings 和 Rebel 基地。

讓我們看一下服務(wù)。實際上,我們來描述一下 Rebel base,service rebel-base。你可以看到它被 Cilium 注釋為一項全球服務(wù)。作為配置的一部分,我已對其進(jìn)行了注釋,說我希望這是一項全球服務(wù)。如果我查看那里的第二個集群,情況也是如此。它們都被描述為全球性的。這意味著,我可以從任一集群上的 X-wing 發(fā)出請求,它會收到來自這兩個不同集群、這兩個不同集群后端的負(fù)載平衡的響應(yīng)。

讓我們試試看。讓我們循環(huán)運行它。讓我們執(zhí)行 X-wings。不過哪個 X-wings并不重要。我們想向 Rebel 基地發(fā)送消息。希望我們應(yīng)該看到的是,我們有時會從集群 1 中隨機(jī)獲得響應(yīng),有時是集群 2。

如果其中一個集群上的 Rebel 基地 pod 發(fā)生了不好的事情怎么辦?讓我們看看代碼上有哪些節(jié)點。讓我們刪除集群 2 上的 Pod。實際上,我將刪除 Rebel 基于第二個集群的整個部署。我們應(yīng)該看到的是,所有請求現(xiàn)在都由集群 1 處理。確實,您可以看到,集群 1 已經(jīng)有一段時間了。我們實際上只需將我們的服務(wù)標(biāo)記為全球性的彈性,它是實現(xiàn)多集群高可用性的一種非常強(qiáng)大的方式。

故障的可見性

以免我給你留下 eBPF 只是關(guān)于網(wǎng)絡(luò)的印象,以及網(wǎng)絡(luò)的優(yōu)勢,讓我也談?wù)勎覀內(nèi)绾问褂?eBPF 來實現(xiàn)可觀察性。畢竟,如果確實出現(xiàn)問題,這非常重要。我們需要可觀察性,以便我們了解發(fā)生了什么。在 Kubernetes 集群中,我們有許多主機(jī),而每臺主機(jī)只有一個內(nèi)核。

無論我們運行多少用戶空間應(yīng)用程序,無論我們運行多少容器,它們都在每臺主機(jī)共享一個內(nèi)核。如果它們在POD中,無論POD有多少,仍然只有一個內(nèi)核。每當(dāng) pod 中的應(yīng)用程序想要做任何有趣的事情時,比如讀取或?qū)懭胛募?,或者發(fā)送或接收網(wǎng)絡(luò)流量,每當(dāng) Kubernetes 想要創(chuàng)建一個容器時。任何復(fù)雜的事情都涉及內(nèi)核。

內(nèi)核對整個主機(jī)上發(fā)生的所有有趣的事情都有可見性。這意味著如果我們使用 eBPF 程序來檢測內(nèi)核,我們可以了解整個主機(jī)上發(fā)生的一切。因為我們幾乎可以檢測內(nèi)核中發(fā)生的任何事情,我們可以將它用于各種不同的指標(biāo)和可觀察性工具、不同類型的跟蹤,它們都可以使用 eBPF 構(gòu)建。

例如,這是一個名為 Pixie 的工具,它是一個 CNCF 沙盒項目。它為我們提供了這個火焰圖,關(guān)于整個集群中運行的信息。它聚合來自集群中每個節(jié)點上運行的 eBPF 程序的信息,以生成整個集群如何使用 CPU 時間的概覽,并詳細(xì)介紹這些應(yīng)用程序正在調(diào)用的特定函數(shù)。

真正有趣的是,您無需對應(yīng)用程序進(jìn)行任何更改,甚至無需更改配置即可獲得此工具。因為正如我們所看到的,當(dāng)您對內(nèi)核進(jìn)行更改時,它會立即影響在該內(nèi)核上運行的任何內(nèi)容。我們不必重新啟動這些進(jìn)程或任何東西。

這對于我們所說的邊車模型也有一個有趣的含義。在很多方面,與 sidecar 模型相比,eBPF 為我們提供了更多的簡單性。在 sidecar 模型中,我們必須將一個容器注入到我們想要檢測的每個 pod 中。它必須在 pod 內(nèi),因為這是一個用戶空間應(yīng)用程序可以了解該 pod 中發(fā)生的其他事情的方式。它必須與該 pod 共享命名空間。我們必須將那個邊車注入到每個 pod 中。

為此,需要在該 pod 的定義中引入一些 YAML。您可能不會手動編寫該 YAML 來注入 sidecar。它可能是在準(zhǔn)入控制中完成的,或者作為 CI/CD 過程的一部分,可能會自動執(zhí)行注入該 sidecar 的過程。然而它必須注入。

另一方面,如果我們使用 eBPF,我們在內(nèi)核中運行我們的工具,那么我們不需要更改 pod 定義。我們會自動從內(nèi)核的角度獲得這種可見性,因為內(nèi)核可以看到該主機(jī)上發(fā)生的一切。只要我們將 eBPF 程序添加到每個主機(jī)上,我們就會獲得全面的可見性。這也意味著我們可以抵御攻擊。

如果我們的主機(jī)以某種方式受到威脅,如果有人設(shè)法逃離容器并進(jìn)入主機(jī),或者即使他們以某種方式運行單獨的 pod,您的攻擊者可能不會費心使用您的可觀察性工具來檢測他們的進(jìn)程和他們的 pod。如果您的可觀察性工具在內(nèi)核中運行,那么無論如何都會看到它們。你無法躲避那些' s 在內(nèi)核中運行。這種在沒有 sidecar 的情況下運行檢測的能力正在創(chuàng)建一些非常強(qiáng)大的可觀察性工具。

彈性、安全、可觀察性、無sidercar部署

d752b54e-66f4-11ed-8abf-dac502259ad0.png

它還讓我們想到了無邊服務(wù)網(wǎng)格的想法。服務(wù)網(wǎng)格具有彈性、可觀察性和安全性?,F(xiàn)在有了 eBPF,我們可以在不使用 sidecar 的情況下實現(xiàn)服務(wù)網(wǎng)格。我在圖表之前展示了我們?nèi)绾问褂?eBPF 繞過主機(jī)上的網(wǎng)絡(luò)堆棧。對于服務(wù)網(wǎng)格,我們可以更進(jìn)一步。 在傳統(tǒng)的 sidecar 模型中,我們在希望成為服務(wù)網(wǎng)格一部分的每個 pod 中運行一個代理,也許是 Envoy。該代理的每個實例都有路由信息,每個數(shù)據(jù)包都必須通過該代理。您可以在此圖的左側(cè)看到,網(wǎng)絡(luò)數(shù)據(jù)包的路徑非常曲折。它基本上經(jīng)歷了五個網(wǎng)絡(luò)堆棧實例。我們可以用 eBPF 大大縮短它。我們不能總是避免代理。 如果我們在第 7 層做某事,我們需要那個代理,但我們可以避免在每個 pod 中都有一個代理實例。我們可以通過少得多的路由信息和配置信息副本來提高可擴(kuò)展性。我們可以通過網(wǎng)絡(luò)堆棧內(nèi) XDP 層或套接字層的 eBPF 連接繞過許多這些網(wǎng)絡(luò)步驟。 eBPF 將為我們提供資源消耗更少、效率更高的服務(wù)網(wǎng)格。我希望這能體現(xiàn)出我認(rèn)為 eBPF 圍繞網(wǎng)絡(luò)、可觀察性和安全性實現(xiàn)的一些東西,這將為我們提供更具彈性和可擴(kuò)展性的部署。我們可以通過少得多的路由信息和配置信息副本來提高可擴(kuò)展性。我們可以通過網(wǎng)絡(luò)堆棧內(nèi) XDP 層或套接字層的 eBPF 連接繞過許多這些網(wǎng)絡(luò)步驟。eBPF 將為我們提供資源消耗更少、效率更高的服務(wù)網(wǎng)格。 我希望這能體現(xiàn)出我認(rèn)為 eBPF 圍繞網(wǎng)絡(luò)、可觀察性和安全性實現(xiàn)的一些東西,這將為我們提供更具彈性和可擴(kuò)展性的部署。我們可以通過少得多的路由信息和配置信息副本來提高可擴(kuò)展性。我們可以通過網(wǎng)絡(luò)堆棧內(nèi) XDP 層或套接字層的 eBPF 連接繞過許多這些網(wǎng)絡(luò)步驟。eBPF 將為我們提供資源消耗更少、效率更高的服務(wù)網(wǎng)格。我希望這能體現(xiàn)出我認(rèn)為 eBPF 圍繞網(wǎng)絡(luò)、可觀察性和安全性實現(xiàn)的一些東西,這將為我們提供更具彈性和可擴(kuò)展性的部署。

總結(jié)

到目前為止,我?guī)缀跻恢痹谡務(wù)?Linux。它也將出現(xiàn)在 Windows 中。微軟一直致力于 Windows 上的 eBPF。他們與 Isovalent 和許多其他對大規(guī)??蓴U(kuò)展網(wǎng)絡(luò)感興趣的公司一起參與其中。我們共同組建了 eBPF 基金會,它是 Linux 基金會下的一個基金會,真正負(fù)責(zé)跨不同操作系統(tǒng)的 eBPF 技術(shù)。

我希望這能說明為什么 eBPF 如此重要,它對于軟件的彈性部署如此具有革命性,尤其是在云原生空間中,但不一定限于此。無論您運行的是 Linux 還是 Windows,都有 eBPF 工具可幫助您優(yōu)化這些部署并使其更具彈性。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11314

    瀏覽量

    209777
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4797

    瀏覽量

    68707
  • 網(wǎng)格
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    16024

原文標(biāo)題:說說 eBPF 的超能力

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    eBPF技術(shù)實踐之virtio-net網(wǎng)卡隊列可觀測

    時,這一路徑難以進(jìn)行觀測。一些復(fù)雜的網(wǎng)絡(luò)抖動問題很可能是由于網(wǎng)卡隊列不正常工作引起的。為了解決這類問題,我們基于eBPF技術(shù)擴(kuò)展了網(wǎng)卡隊列的可觀測能力,使得virtio網(wǎng)卡前后端的定界問題不再困擾。 virtio-net 前后端驅(qū)動簡介 virtio-net (后面稱為
    的頭像 發(fā)表于 11-14 11:18 ?227次閱讀
    <b class='flag-5'>eBPF</b>技術(shù)實踐之virtio-net網(wǎng)卡隊列可觀測

    傳感器助力物流自動化設(shè)備火力全開,就是這么Passion!

    、智能的特性,為這場年度盛宴保駕護(hù)航,讓Passion與效率并飛,共同書寫智慧物流的新篇章!智能倉儲精準(zhǔn)快速,暢通無阻在雙十一的倉儲戰(zhàn)場上,智能傳感器如同擁有超能力
    的頭像 發(fā)表于 11-12 11:04 ?182次閱讀
    傳感器助力物流自動化設(shè)備火力全開,就是這么Passion!

    聊聊std::move函數(shù)和std::forward函數(shù)

    今天我們聊聊Modern cpp的兩個非常重要的概念移動語義和轉(zhuǎn)發(fā)引用。
    的頭像 發(fā)表于 11-05 16:58 ?313次閱讀

    事件視覺技術(shù):解鎖邊緣AI新視野,賦能工業(yè)制造釋放革新生產(chǎn)力

    在智能工廠的璀璨圖景中,AGV/ARM機(jī)器人憑借先進(jìn)的三維視覺感知技術(shù),精準(zhǔn)捕捉貨架上的細(xì)微之物,與人類伙伴默契配合,安全高效地將貨物送達(dá)生產(chǎn)核心。生產(chǎn)線上,智能攝像頭如同擁有超能力的眼睛,輕松解讀
    的頭像 發(fā)表于 07-18 14:44 ?540次閱讀

    算力系列基礎(chǔ)篇——算力與計算機(jī)性能:解鎖超能力的神秘力量!

    在《算力系列基礎(chǔ)篇——算力101:從零開始了解算力》中,相信各位粉絲初步了解到人工智能的“發(fā)動機(jī)”和核心驅(qū)動力:算力!算力!算力?。ㄖ匾氖虑檎f三遍)今天,一起學(xué)習(xí)一下計算機(jī)性能是如何影響算力的?要想提高算力,都有哪些方法?一、算力的關(guān)鍵因素從算力的常見計量單位FPOPS(FloatingPointOperationsPerSecond,浮點運算次數(shù)/秒)、
    的頭像 發(fā)表于 07-11 08:04 ?104次閱讀
    算力系列基礎(chǔ)篇——算力與計算機(jī)性能:解鎖<b class='flag-5'>超能力</b>的神秘力量!

    本源超導(dǎo)量子計算機(jī)項目獲2023全球“未來產(chǎn)業(yè)之星”大賽超能

    近日,在2024年上海市產(chǎn)業(yè)技術(shù)創(chuàng)新大會上,本源量子64比特超導(dǎo)量子計算機(jī)研發(fā)與產(chǎn)業(yè)化項目榮獲2023全球“未來產(chǎn)業(yè)之星”大賽未來產(chǎn)業(yè)超能獎,本源量子總經(jīng)理張輝受邀參加大會并出席頒獎儀式。圖為未來
    的頭像 發(fā)表于 03-26 08:21 ?438次閱讀
    本源超導(dǎo)量子計算機(jī)項目獲2023全球“未來產(chǎn)業(yè)之星”大賽<b class='flag-5'>超能</b>獎

    機(jī)房升級必備神器:模塊化精密空調(diào)的五大超能力!

    模塊化機(jī)房精密空調(diào)是一種專門為現(xiàn)代數(shù)據(jù)中心和機(jī)房設(shè)計的空調(diào)系統(tǒng),具有以下特點和優(yōu)勢: 靈活性:模塊化機(jī)房精密空調(diào)采用模塊化設(shè)計,可以根據(jù)機(jī)房的規(guī)模和需求,自由組合不同數(shù)量的空調(diào)模塊,從而實現(xiàn)靈活的配置和管理。 高效性:模塊化機(jī)房精密空調(diào)采用先進(jìn)的技術(shù)和高效的換熱器,能夠快速降溫、均勻送風(fēng),保證機(jī)房內(nèi)的溫度和濕度穩(wěn)定在適宜的范圍內(nèi),提高機(jī)房的運行效率。
    的頭像 發(fā)表于 03-19 18:24 ?1257次閱讀
    機(jī)房升級必備神器:模塊化精密空調(diào)的五大<b class='flag-5'>超能力</b>!

    eBPF動手實踐系列三:基于原生libbpf庫的eBPF編程改進(jìn)方案簡析

    在上一篇文章《eBPF動手實踐系列二:構(gòu)建基于純C語言的eBPF項目》中,我們初步實現(xiàn)了脫離內(nèi)核源碼進(jìn)行純C語言eBPF項目的構(gòu)建。libbpf庫在早期和內(nèi)核源碼結(jié)合的比較緊密,如今的libbpf庫更加成熟,已經(jīng)完全脫離內(nèi)核源碼
    的頭像 發(fā)表于 03-19 14:19 ?867次閱讀
    <b class='flag-5'>eBPF</b>動手實踐系列三:基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進(jìn)方案簡析

    基于原生libbpf庫的eBPF編程改進(jìn)方案

    為了簡化 eBPF程序的開發(fā)流程,降低開發(fā)者在使用 libbpf 庫時的入門難度,libbpf-bootstrap 框架應(yīng)運而生?;趌ibbpf-bootstrap框架的編程方案是目前網(wǎng)絡(luò)上看到的最主流編程方案。
    發(fā)表于 03-19 14:19 ?677次閱讀
    基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進(jìn)方案

    電梯數(shù)智監(jiān)控攝像頭,電梯有了“超能力”#電梯監(jiān)控 #電梯安全 #電梯物聯(lián)網(wǎng)

    物聯(lián)網(wǎng)監(jiān)控攝像頭
    jf_69150321
    發(fā)布于 :2024年02月27日 09:28:31

    聊聊半導(dǎo)體產(chǎn)品的8大封裝工藝

    今天我們聊聊半導(dǎo)體產(chǎn)品的封裝工藝,一提到“封裝”,大家不難就會想到“包裝”,但是,封裝可不能簡單的就認(rèn)為等同于包裝的哦
    的頭像 發(fā)表于 02-23 14:42 ?3273次閱讀
    <b class='flag-5'>聊聊</b>半導(dǎo)體產(chǎn)品的8大封裝工藝

    聊聊什么是IGBT的膝電壓?

    聊聊什么是IGBT的膝電壓? IGBT是一種半導(dǎo)體器件,常用于功率放大和電流控制應(yīng)用。作為一種開關(guān)器件,IGBT能夠在低驅(qū)動電壓下實現(xiàn)較高的電流和電壓控制能力。膝電壓是其關(guān)鍵的特性之一,本文將對膝
    的頭像 發(fā)表于 02-03 16:23 ?1891次閱讀

    臺鈴超能S電動車搭載鴻蒙智聯(lián),提供智能化駕乘體驗

    此款車型——臺鈴超能S長續(xù)航高級系列鴻蒙版,可支持App操作、NFC解鎖,手機(jī)尋車及里程預(yù)測等多重功能。據(jù)悉,很可能即為今年年初臺鈴官網(wǎng)上展示的超能S蒼穹電動摩托車。
    的頭像 發(fā)表于 02-01 14:18 ?2436次閱讀

    【先楫HPM5361EVK開發(fā)板試用體驗】4手把手實戰(zhàn)EXIP在線解密引擎

    的起始地址和結(jié)尾地址。這意味著我們可以把需要加密的數(shù)據(jù)分塊管理,更加靈活方便。而且,EXIP的密鑰和計數(shù)器也都有獨特的設(shè)計,確保了數(shù)據(jù)的安全性。 今天我們接著再來聊聊EXIP這個超級英雄的另一項超能力
    發(fā)表于 01-26 11:08

    聊聊AMBA協(xié)議的evolution過程

    作為一名新時代的ICer,一定必定肯定聽說過AMBA協(xié)議,但是卻少有人知道AMBA協(xié)議的evolution過程,本文將大致聊聊Evolution of the ARM AMBA Specifications!
    的頭像 發(fā)表于 01-19 09:50 ?1253次閱讀
    <b class='flag-5'>聊聊</b>AMBA協(xié)議的evolution過程