在過去的兩年里,云原生社區一直在熱烈討論eBPF。eBPF曾是KubeCon、eBPF Days和eBPF Summit的主題,并且越來越受歡迎。像Google和Netflix這樣的公司多年來一直在使用eBPF,新的用例也不斷涌現。特別是在觀測性方面,eBPF被認為將是一個重大改變。JgR28資訊網——每日最新資訊28at.com
所以讓我們來看看eBPF——這項技術到底是什么,它如何影響觀測性,它與現有的觀測性實踐有什么區別,未來可能會發生什么變化?JgR28資訊網——每日最新資訊28at.com
JgR28資訊網——每日最新資訊28at.com
什么是eBPF?
eBPF是一種編程框架,允許我們在Linux內核中安全地運行沙盒化的程序,而無需更改內核代碼。JgR28資訊網——每日最新資訊28at.com
它最初是為Linux開發的(而且直到今天,這項技術在Linux上最成熟),但微軟正在迅速發展eBPF在Windows上的實現[1]。JgR28資訊網——每日最新資訊28at.com
eBPF程序從設計上來說非常高效和安全——內核會對其進行驗證,以確保它們不會危及操作系統的穩定性或安全性。JgR28資訊網——每日最新資訊28at.com
為什么eBPF如此重要?
要理解這一點,我們需要了解用戶空間和內核空間。JgR28資訊網——每日最新資訊28at.com
用戶空間是所有應用程序運行的地方。內核空間位于用戶空間和物理硬件之間。用戶空間中的應用程序無法直接訪問硬件。相反,它們通過系統調用與內核通信,然后內核再訪問硬件。JgR28資訊網——每日最新資訊28at.com
所有內存訪問、文件讀寫和網絡流量都經過內核。內核還管理并發進程。JgR28資訊網——每日最新資訊28at.com
基本上,所有操作都通過內核進行(見下圖)。JgR28資訊網——每日最新資訊28at.com
而eBPF提供了一種安全的、高效的擴展內核功能的方式。JgR28資訊網——每日最新資訊28at.com
JgR28資訊網——每日最新資訊28at.com
用戶空間和內核空間JgR28資訊網——每日最新資訊28at.com
從歷史上看,出于顯而易見的原因,更改內核源代碼或操作系統層的任何內容一直都非常困難。JgR28資訊網——每日最新資訊28at.com
Linux內核有3000萬行代碼[2],任何更改要從一個想法變成廣泛可用的東西需要數年時間。首先,Linux社區必須同意它。然后,它必須成為官方Linux發布的一部分。然后,在幾個月后,它會被Red Hat和Ubuntu等發行版采用,然后傳播到更廣泛的用戶。JgR28資訊網——每日最新資訊28at.com
從技術上講,一個人可以將內核模塊加載到內核中,直接進行更改,但這是非常高風險的,涉及復雜的內核級編程,因此幾乎普遍不建議這樣做。JgR28資訊網——每日最新資訊28at.com
eBPF出現并解決了這個問題,提供了一種在內核中附加和運行程序的安全和高效機制。JgR28資訊網——每日最新資訊28at.com
讓我們看看eBPF如何確保安全性和性能。JgR28資訊網——每日最新資訊28at.com
高度安全
- 嚴格的驗證 — 在任何eBPF程序加載到內核之前,它都會由eBPF驗證器進行驗證,以確保代碼絕對安全——例如,沒有硬循環、無效的內存訪問、不安全的操作。
- 沙盒化 — eBPF程序在內核內部的內存隔離沙盒中運行,與其他內核組件分開。這可以防止未經授權的訪問內核內存、數據結構和內核源代碼。
- 有限的操作 — eBPF程序通常必須使用C語言的一個小子集來編寫,即受限指令集。這限制了eBPF程序可以執行的操作,降低了安全漏洞的風險。
高性能 / 輕量級
- 以本機機器碼運行 — eBPF程序在CPU上以本機機器指令的形式運行。這導致更快的執行和更好的性能。?沒有上下文切換 — 常規應用程序會在用戶空間和內核空間之間定期切換上下文,這會消耗資源。eBPF程序,因為它們在內核層運行,可以直接訪問內核數據結構和資源。
- 事件驅動 — eBPF程序通常僅在特定內核事件發生時運行,而不是一直運行。這最小化了開銷。
- 針對硬件進行優化 — eBPF程序在執行之前由內核的即時編譯器(JIT)編譯為機器代碼,因此代碼針對特定的硬件進行了優化。
因此,eBPF為內核編程提供了一種安全且高效的鉤子??紤]到一切都通過內核,這為我們帶來了以前無法實現的新可能性。JgR28資訊網——每日最新資訊28at.com
為什么現在才如此重要?
eBPF周圍的技術在很長一段時間內得以發展,已經有大約30年了。JgR28資訊網——每日最新資訊28at.com
在過去的7-8年中,eBPF已被一些大型公司大規模使用,現在我們正在進入一個使用eBPF變得更加主JgR28資訊網——每日最新資訊28at.com
流的時代。請參閱eBPF的共同創作者之一、Linux的共同維護者Alexei Starovoitov的這個視頻[3],了解eBPF的發展歷程。JgR28資訊網——每日最新資訊28at.com
eBPF — 簡要歷史
- 1993年-來自勞倫斯伯克利國家實驗室的一篇論文[4]探討了使用內核代理進行數據包過濾。這就是BPF(“伯克利數據包過濾器”)這個名字的由來。
- 1997年 — BPF正式作為Linux內核的一部分引入(版本2.1.75)。
- 1997–2014年 — 添加了一些功能,以改進、穩定和擴展BPF的功能。
- 2014年 — 引入了重要的更新,稱為“擴展伯克利數據包過濾器”(eBPF)。這個版本對BPF技術進行了重大改進,使其更廣泛可用,因此稱之為“擴展”。
之所以說這個發布很重要,是因為它使得擴展內核功能變得容易。JgR28資訊網——每日最新資訊28at.com
程序員可以更多或更少地像編寫常規應用程序一樣編寫代碼,而周圍的eBPF基礎設施會處理低級驗證、安全性和效率問題。JgR28資訊網——每日最新資訊28at.com
eBPF的周圍支持生態系統和腳手架使這成為可能(見下圖)。JgR28資訊網——每日最新資訊28at.com
JgR28資訊網——每日最新資訊28at.com
來源:https://ebpf.io/what-is-ebpf/JgR28資訊網——每日最新資訊28at.com
更好的是,eBPF程序可以在不重新啟動的情況下加載到內核中,并且可以隨時卸載。JgR28資訊網——每日最新資訊28at.com
所有這些突然使得廣泛采用和應用成為可能。JgR28資訊網——每日最新資訊28at.com
在生產系統中的廣泛應用
eBPF的受歡迎程度在過去的7-8年中迅速增長,許多大型公司在規模生產系統中使用它。JgR28資訊網——每日最新資訊28at.com
- 到2016年,Netflix廣泛使用eBPF進行跟蹤。Brendan Gregg[5]實現了它,他在基礎設施和運維領域被廣泛認為是eBPF的權威人士。
- 2017年 — Facebook開源了他們基于eBPF的負載均衡器Katran[6]。自2017年以來,每個訪問Facebook.com[7]的數據包都經過了eBPF。
- 2020年- Google將eBPF納入其Kubernetes提供的一部分。eBPF現在驅動著GKE的網絡、安全和可觀測性層[8]。到目前為止,企業中也有廣泛的采用,如Capital One[9]和Adobe[10]。
- 2021年 — Facebook、Google、Netflix、Microsoft和Isovalent聯合宣布創建eBPF基金會[11]來管理eBPF技術的增長。
現在有成千上萬家公司使用eBPF,并且每年涌現出數百個eBPF項目,探索不同的用例。JgR28資訊網——每日最新資訊28at.com
eBPF現在是Linux內核中的一個獨立子系統,并擁有廣泛的社區支持。這項技術本身也在不斷擴展,有了幾個新的添加。JgR28資訊網——每日最新資訊28at.com
那么,我們可以用eBPF做什么?
eBPF的最常見用途可以分為三個領域:JgR28資訊網——每日最新資訊28at.com
安全和網絡已經看到了更廣泛的采用和應用,其中包括像Cilum[12]這樣的項目。相比之下,基于eBPF的可觀測性方案在其演進過程中還處于早期階段。JgR28資訊網——每日最新資訊28at.com
讓我們首先看看安全和網絡的用例。JgR28資訊網——每日最新資訊28at.com
(1) 安全JgR28資訊網——每日最新資訊28at.com
安全是eBPF的一個非常流行的用例。使用eBPF,程序可以觀察內核級別的一切情況,以高速處理事件以檢查意外行為,并比以前更快地發出警報。JgR28資訊網——每日最新資訊28at.com
例如 -JgR28資訊網——每日最新資訊28at.com
- Google[13]使用eBPF進行大規模入侵檢測
- Shopify[14]使用eBPF來實現容器安全
一些第三方安全產品[15]現在使用eBPF進行數據收集和監視。JgR28資訊網——每日最新資訊28at.com
(2) 網絡JgR28資訊網——每日最新資訊28at.com
網絡是另一個廣泛應用的用例。位于eBPF層的位置允許全面監測網絡可觀測性,例如完整網絡路徑的可見性,包括所有跳數,以及源IP和目標IP。使用eBPF程序,可以處理高速網絡事件并在內核內直接操作網絡數據包,而開銷非常低。JgR28資訊網——每日最新資訊28at.com
這允許各種網絡用例,如負載平衡、DDoS防護、流量整形和服務質量(QoS)。JgR28資訊網——每日最新資訊28at.com
- Cloudflare[16]使用eBPF檢測并防止DDoS攻擊,每秒處理1000萬個數據包[17]而不影響網絡性能。
- Meta的基于eBPF的Katran[18]為Facebook的所有負載均衡進行處理
(3) 可觀測性JgR28資訊網——每日最新資訊28at.com
到目前為止,通過內核觀察一切并且eBPF提供了一種高性能和安全的方式來觀察一切,這使得eBPF在可觀察性方面非常有用。JgR28資訊網——每日最新資訊28at.com
讓我們更深入地探討可觀測性,看看這項技術的影響。JgR28資訊網——每日最新資訊28at.com
eBPF如何確切影響可觀測性?
為了探討這一點,讓我們離開eBPF的世界,進入可觀測性的世界,看看構成我們標準可觀測性解決方案的內容。JgR28資訊網——每日最新資訊28at.com
任何可觀測性解決方案都有四個主要組件:JgR28資訊網——每日最新資訊28at.com
1.數據收集 — 從應用程序和基礎設施獲取遙測數據2.數據處理 — 對收集的數據進行過濾、索引和計算3.數據存儲 — 數據的短期和長期存儲4.用戶體驗層 — 確定用戶如何使用數據JgR28資訊網——每日最新資訊28at.com
在這些組件中,eBPF影響的是(截至今天)僅僅是數據收集層 — 使用eBPF直接從內核收集遙測數據的簡便機制。JgR28資訊網——每日最新資訊28at.com
JgR28資訊網——每日最新資訊28at.com
0*8zMD7h66uFLgBIJH.pngJgR28資訊網——每日最新資訊28at.com
eBPF — 對可觀測性的影響JgR28資訊網——每日最新資訊28at.com
所以當我們說“eBPF可觀測性”時,我們實際上是指使用eBPF作為收集遙測數據的工具,而不是使用其他方法來進行儀器化??捎^測性解決方案的其他組件保持不變。JgR28資訊網——每日最新資訊28at.com
eBPF可觀測性的工作原理
為了充分理解eBPF可觀測性背后的機制,我們需要了解掛鉤(hooks)的概念。JgR28資訊網——每日最新資訊28at.com
正如我們前面所看到的,eBPF程序主要是事件驅動的,即每次發生特定事件時都會觸發它們。例如,每次進行函數調用時,都可以調用一個eBPF程序來捕獲一些用于可觀測性目的的數據。JgR28資訊網——每日最新資訊28at.com
- 首先,這些掛鉤可以在內核空間或用戶空間。因此,eBPF可以用于監視用戶空間應用程序以及內核級事件。
- 其次,這些掛鉤可以是預定義的/靜態的,也可以在運行中動態插入到系統中(無需重新啟動!)
這四種不同的eBPF機制允許每一種(見下圖)JgR28資訊網——每日最新資訊28at.com
JgR28資訊網——每日最新資訊28at.com
1*_e2Q4FEhTJhkK2nVYkiICw.pngJgR28資訊網——每日最新資訊28at.com
用戶空間和內核空間的靜態和動態eBPF掛鉤:JgR28資訊網——每日最新資訊28at.com
- 內核跟蹤點 — 用于掛接到由內核開發人員預定義的事件(使用TRACE_EVENT宏)
- USDT — 用于掛接到應用程序代碼中由開發人員預定義的跟蹤點
- Kprobes(內核探針) — 用于在運行時動態掛接到內核代碼的任何部分
- Uprobes(用戶探針) — 用于在運行時動態掛接到用戶空間應用程序的任何部分
在內核空間中有許多預定義的掛鉤,可以輕松將eBPF程序附加到其中(例如,系統調用、函數入口/出口、網絡事件、內核跟蹤點)。類似地,在用戶空間中,許多語言運行時、數據庫系統和軟件堆棧會暴露出Linux BCC工具的預定義掛鉤,eBPF程序可以連接到這些掛鉤。JgR28資訊網——每日最新資訊28at.com
但更有趣的是kprobes和uprobes。如果生產中出現問題,我沒有足夠的信息,并且我希望在運行時動態添加儀表化,該怎么辦?這就是kprobes和uprobes允許強大的可觀測性的地方。JgR28資訊網——每日最新資訊28at.com
JgR28資訊網——每日最新資訊28at.com
0*4BZtZLhHeUsGWSc1.pngJgR28資訊網——每日最新資訊28at.com
eBPF kprobes 和 uprobes:JgR28資訊網——每日最新資訊28at.com
例如,使用uprobes,可以在不修改應用程序代碼的情況下在運行時掛接到應用程序內的特定函數。每當執行該函數時,都會觸發一個eBPF程序以捕獲所需的數據。這允許像實時[19]調試這樣的令人興奮的可能性。JgR28資訊網——每日最新資訊28at.com
現在我們知道了eBPF可觀測性是如何工作的,讓我們來看看用例。JgR28資訊網——每日最新資訊28at.com
eBPF可觀測性用例
eBPF可用于幾乎所有常見的現有可觀測性用例,并且還提供了新的可能性。JgR28資訊網——每日最新資訊28at.com
- 系統和基礎設施監控
- 應用程序性能監控(APM)
- 安全監控
- 故障排除
(1) 系統和基礎設施監控JgR28資訊網——每日最新資訊28at.com
在這個領域,eBPF最常用于監控Linux主機的性能和資源使用情況。JgR28資訊網——每日最新資訊28at.com
- CPU和內存使用率
- 硬盤和網絡性能
- 進程活動和調度
- 文件系統活動
eBPF程序可以輕松地在這些事件的發生時捕獲數據,并將其發送到存儲后端,以便稍后分析。JgR28資訊網——每日最新資訊28at.com
(2) 應用程序性能監控(APM)JgR28資訊網——每日最新資訊28at.com
eBPF也用于應用程序內部的性能監控。例如,在Go應用程序中,可以使用uprobes掛接到某個特定函數,以捕獲函數參數、返回值和執行時間。這對于詳細分析應用程序性能問題非常有用。JgR28資訊網——每日最新資訊28at.com
(3) 安全監控JgR28資訊網——每日最新資訊28at.com
eBPF在安全監控方面也非常有用。它可以用于檢測惡意行為、網絡攻擊和異常事件。eBPF程序可以在內核和應用程序級別捕獲事件,并將其傳遞給安全信息和事件管理系統,以進行進一步的分析和響應。JgR28資訊網——每日最新資訊28at.com
(4) 故障排除JgR28資訊網——每日最新資訊28at.com
eBPF還可以用于故障排除。它可以用于跟蹤應用程序崩潰、性能下降或其他問題的根本原因。eBPF程序可以捕獲關鍵性能指標、事件和上下文信息,以幫助診斷問題并進行修復。JgR28資訊網——每日最新資訊28at.com
實際示例
以下是一些eBPF可觀測性用例的實際示例:JgR28資訊網——每日最新資訊28at.com
- Tracing和Profiling — 使用eBPF捕獲應用程序的性能數據,例如函數調用、系統調用和內存分配,以識別瓶頸和優化性能。
- 網絡可觀測性 — 使用eBPF來監視網絡流量、分析網絡包,并實施防火墻策略和負載平衡。
- 容器監控 — 在Kubernetes集群中,使用eBPF來監控容器內部的資源使用情況、性能和問題。
- 安全監控 — 使用eBPF來檢測潛在的安全威脅,例如異常網絡活動、不尋常的系統調用和入侵嘗試。
- 分布式跟蹤 — 使用eBPF捕獲應用程序的分布式跟蹤數據,以分析請求的流經整個系統的路徑,幫助診斷和優化性能問題。
eBPF和傳統觀測性的比較
現在讓我們來比較eBPF可觀測性和傳統觀測性方法。JgR28資訊網——每日最新資訊28at.com
(1) 傳統觀測性JgR28資訊網——每日最新資訊28at.com
傳統的可觀測性方法通?;谝韵略瓌t:JgR28資訊網——每日最新資訊28at.com
- 代理和代理集成 — 在目標系統中安裝代理,代理負責收集和傳輸遙測數據。這通常需要在每個目標系統上部署代理,而且代理也需要進行版本控制和維護。
- 度量指標集成 — 需要配置和管理度量和日志指標的集成。這通常涉及到手動配置和更新,以確保適當的指標和日志數據被采集。
- 額外的開銷 — 代理需要在目標系統上運行,這可能會引入額外的開銷,例如CPU和內存消耗。
- 局限性 — 傳統的可觀測性方法可能會受到系統復雜性和性能問題的限制,因為它們可能無法實時捕獲足夠的數據。
- 安全性 — 代理可能會引入潛在的安全風險,因為它們在目標系統上運行并訪問敏感數據。
(2) eBPF可觀測性JgR28資訊網——每日最新資訊28at.com
與傳統觀測性方法相比,eBPF可觀測性具有以下優勢:JgR28資訊網——每日最新資訊28at.com
- 內核級別的可觀測性 — eBPF程序在內核級別運行,可以觀察系統的內部狀態和事件,無需在目標系統上運行代理。
- 輕量級 — eBPF程序通常對系統資源的開銷很小,因為它們在內核級別運行,無需獨立的代理。
- 安全性 — eBPF程序受到內核驗證器的強制約束,以確保它們不會引入安全風險。
- 靈活性 — eBPF程序可以在運行時動態附加到系統中,無需重新啟動目標系統,從而提供了更大的靈活性和可伸縮性。
- 性能 — eBPF程序通常以本機機器指令運行,因此性能很高,可以實時捕獲大量數據。
盡管eBPF可觀測性具有許多優勢,但它也具有一些挑戰和限制。首先,eBPF編程需要一定的學習曲線,因為它涉及到特定的編程模型和語言。此外,某些高級用例可能需要更復雜的eBPF程序。JgR28資訊網——每日最新資訊28at.com
未來展望
eBPF可觀測性已經取得了巨大的進展,但仍有很多潛在的未來發展方向。JgR28資訊網——每日最新資訊28at.com
- 更多的工具和庫 — 隨著eBPF的流行,可以預期會有更多的工具和庫出現,用于簡化eBPF程序的開發、調試和部署。
- 標準化 — 隨著eBPF的廣泛應用,可以期待出現更多的標準和最佳實踐,以幫助開發人員更輕松地使用eBPF進行可觀測性。
- 更廣泛的集成 — eBPF將繼續集成到各種云計算和容器平臺中,以幫助用戶監控和調試分布式應用程序。
- 更多的可觀測性用例 — 隨著eBPF技術的不斷發展,可以預期將出現更多的創新可觀測性用例,幫助用戶更好地了解和優化其應用程序和基礎設施的性能。
總之,eBPF可觀測性是一個充滿潛力的領域,已經取得了令人印象深刻的進展。它提供了一種強大而靈活的方式來觀察和監視應用程序和基礎設施的行為,有望在未來繼續發展和成熟。對于那些希望更好地了解和控制其系統的用戶來說,eBPF可觀測性是一個令人興奮的選擇。JgR28資訊網——每日最新資訊28at.com
引用鏈接
- [1] eBPF在Windows上的實現: https://github.com/microsoft/ebpf-for-windows
- [2] 3000萬行代碼: https://www.phoronix.com/news/Linux-5.12-rc1-Code-Size
- [3] 這個視頻: https://www.youtube.com/watch?v=DAvZH13725I
- [4] 論文: https://www.tcpdump.org/papers/bpf-usenix93.pdf
- [5] Brendan Gregg: https://www.brendangregg.com/
- [6] Katran: https://engineering.fb.com/2018/05/22/open-source/open-sourcing-katran-a-scalable-network-load-balancer/
- [7] Facebook.com: http://facebook.com/
- [8] 網絡、安全和可觀測性層: https://cloud.google.com/blog/products/containers-kubernetes/bringing-ebpf-and-cilium-to-google-kubernetes-engine
- [9] Capital One: https://www.youtube.com/watch?v=hwOpCKBaJ-w
- [10] Adobe: https://www.youtube.com/watch?v=7UQ2CU6UEGY
- [11] 創建eBPF基金會: https://isovalent.com/blog/post/2021-08-ebpf-foundation-announcement/
- [12] Cilum: https://github.com/cilium/cilium
- [13] Google: https://www.youtube.com/watch?v=l8jZ-8uLdVU
- [14] Shopify: https://www.youtube.com/watch?v=6pVci31Mb6Q
- [15] 第三方安全產品: https://www.traceable.ai/blog-post/ebpf-and-api-security-with-traceable
- [16] Cloudflare: https://legacydevconf.info/2.1/session.html?bertin=
- [17] 1000萬個數據包: https://blog.cloudflare.com/how-to-drop-10-million-packets/
- [18] Katran: https://engineering.fb.com/2018/05/22/open-source/open-sourcing-katran-a-scalable-network-load-balancer/
- [19] 實時: https://www.cncf.io/blog/2021/11/17/debugging-with-ebpf-part-1-tracing-go-function-arguments-in-prod/
本文鏈接:http://www.tebozhan.com/showinfo-26-13468-0.html解碼eBPF可觀測性:eBPF如何改變我們所知的觀測性
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 為什么 HTTP/3 正在吞噬世界
下一篇: 全球科技行業兩年裁員40萬,LLM博士卻拿620萬年薪offer?