一文解決OpenCloudOS 如何基于 eBPF 實現(xiàn)容器級別的TCP 連接監(jiān)控?
導(dǎo)語:eBPF 技術(shù)的出現(xiàn),使得內(nèi)核的資源監(jiān)控更加的便捷、高效,容器化監(jiān)控也更加適用于云原生的場景。基于 eBPF 實現(xiàn)的可觀測性,可以無需修改內(nèi)核源碼或者加載內(nèi)核模塊,安全高效的擴展內(nèi)核功能,很好的解決了上述問題。本文,將從網(wǎng)絡(luò)的角度介紹如何基于 eBPF,實現(xiàn)容器級別的 TCP 連接監(jiān)控。?
一、技術(shù)背景
OpenCloudOS 適用于大規(guī)模容器集群服務(wù)器場景,為了提高服務(wù)器的資源利用率,降低業(yè)務(wù)及客戶的服務(wù)器成本,提出了離、在線業(yè)務(wù)混合部署的資源隔離方案。資源隔離 QoS(Quality of Service,服務(wù)質(zhì)量)方案主要包括 CPU、I/O、內(nèi)存和網(wǎng)絡(luò)四大模塊。
針對這四種服務(wù)器資源進行 QoS,能夠?qū)⒂脩舻脑诰€、離線業(yè)務(wù)部署到同一臺服務(wù)器上,在保證在線業(yè)務(wù)服務(wù)質(zhì)量的同時,有效的提升了資源利用率,助力降本增效,契合健康可持續(xù)的發(fā)展理念。隨著 OpenCloudOS 中大規(guī)模離、在線服務(wù)混合部署的應(yīng)用,如何更好的實時監(jiān)控、反饋服務(wù)狀況成為了業(yè)務(wù)運維人員亟需解決的問題。? 基于 Linux 內(nèi)核實現(xiàn)的可觀測性,具備性能好、靈活性高等優(yōu)點。然而,基于內(nèi)核的實現(xiàn)通常是比較困難和繁瑣的。在傳統(tǒng)的實現(xiàn)方式中,開發(fā)人員需要修改內(nèi)核源代碼重新編譯或者加載內(nèi)核模塊來實現(xiàn)性能的觀測,可能會應(yīng)對復(fù)雜難以調(diào)試的情況,使得性能觀測變得異常棘手。像基于 kprobe、tracepoint、perf events 等技術(shù)的 ftrace、perf 工具,通過在內(nèi)核函數(shù)中打樁,把數(shù)據(jù)從內(nèi)核態(tài)搬到用戶態(tài)進行處理。諸如上述實現(xiàn)可觀測性的方式帶來的弊端也很明顯,無保護的內(nèi)核模塊有極大的安全隱患,同時實現(xiàn)的成本較高,不能夠應(yīng)對多變的場景。eBPF 技術(shù)的出現(xiàn),使得內(nèi)核的資源監(jiān)控更加的便捷、高效,容器化監(jiān)控也更加適用于云原生的場景?;?eBPF 實現(xiàn)的可觀測性,可以無需修改內(nèi)核源碼或者加載內(nèi)核模塊,安全高效的擴展內(nèi)核功能,很好的解決了上述問題。本文,將從網(wǎng)絡(luò)的角度介紹如何基于 eBPF,實現(xiàn)容器級別的 TCP 連接監(jiān)控。?
二、eBPF 介紹
eBPF 是一種在 Linux 內(nèi)核運行沙箱程序的技術(shù),在無需修改內(nèi)核源碼或者加載內(nèi)核模塊的情況下安全高效地擴展內(nèi)核功能,可以看作是在內(nèi)核的一些 hook point 上執(zhí)行用戶代碼的一個虛擬機。
用戶編寫的代碼被 clang 編譯成字節(jié)碼后加載到 linux 內(nèi)核,經(jīng)過 verifier 引擎保證字節(jié)碼的安全性,然后通過內(nèi)嵌的 JIT 編譯器將字節(jié)碼轉(zhuǎn)成本地機器碼。eBPF 是由事件觸發(fā)的,當事件到來時,則在內(nèi)核空間執(zhí)行用戶態(tài) BPF 程序,改變內(nèi)核的處理流程。
eBPF 在引入內(nèi)核后,逐漸演進成為一個通用執(zhí)行引擎,可基于此開發(fā)性能分析工具,網(wǎng)絡(luò)過濾器等。eBPF 程序架構(gòu)強調(diào)安全性和穩(wěn)定性,看上去像內(nèi)核模塊,但卻并不需要重新編譯內(nèi)核。
在 eBPF 程序的運行過程中,并不會因為程序問題而造成系統(tǒng)崩潰。由于其安全、高效、可編程,以及在速度和性能方面的優(yōu)勢,eBPF 在內(nèi)核觀測、追蹤監(jiān)控、應(yīng)用性能調(diào)優(yōu)、流量控制、性能統(tǒng)計、安全等領(lǐng)域發(fā)揮了重要的作用。
三、eBPF 工具在實際應(yīng)用中的問題
隨著離、在線混部功能的大規(guī)模部署使用,實際應(yīng)用中更多的業(yè)務(wù)是基于容器來進行資源的隔離與調(diào)度?;谡麢C的系統(tǒng)級別的網(wǎng)絡(luò)監(jiān)控、追蹤工具無法實現(xiàn)容器級別的控制,并不適用于云原生的容器場景。
如何實現(xiàn)更加精細的 cgroup、進程級別的資源監(jiān)控,幫助管理員更好的了解系統(tǒng)的資源使用情況,已經(jīng)成為廣泛關(guān)注的問題,因此監(jiān)控工具的容器化實現(xiàn)尤為重要。?OpenCloudOS 將 cgroup 層級的子系統(tǒng)狀態(tài) ID 傳輸?shù)接脩艨臻g,建立 cgroup 子系統(tǒng)路徑和 ID 之間的聯(lián)系。同時適配隱藏了 cgroup v1 和 v2 結(jié)構(gòu)差異,使內(nèi)核僅收集所需的子系統(tǒng)中特定 cgroup 的網(wǎng)絡(luò)連接狀況信息?;诖?,分別實現(xiàn)了 BCC 和 libbpf 網(wǎng)絡(luò)工具的容器化監(jiān)控。?
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?


四、網(wǎng)絡(luò)監(jiān)控工具示例
以下示例實驗環(huán)境為:?
發(fā)行版:OC 8.6
內(nèi)核:TK4-5.4
工具:BCC 網(wǎng)絡(luò)監(jiān)控工具
1. tcpconnect ?
基于 cgroup 監(jiān)控 tcp 網(wǎng)絡(luò)連接,顯示源IP、目的IP、目的端口等狀態(tài)信息。? ?

基于 cgroup 統(tǒng)計一段時間內(nèi)的 tcp 連接數(shù)量。

2. tcpconnlat ?
基于 cgroup 監(jiān)控 tcp 建立連接的時間,顯示連接的狀態(tài)信息。? ?

3. tcprtt ?
基于 cgroup 統(tǒng)計一段時間內(nèi) tcp rtt 的分布,顯示連接的狀態(tài)信息。? ?

4. tcptrace ?
基于過濾條件監(jiān)控 tcp 網(wǎng)絡(luò)連接,跟蹤 skb 報文在內(nèi)核中的生命周期,輸出每個報文在協(xié)議棧中各個點的時間延遲、地址、所在 CPU、網(wǎng)口等信息。? ?

5. tcplife ?
基于 cgroup 跟蹤 tcp 連接的生命周期,顯示連接的存活時間等統(tǒng)計信息。? ?

6. tcpdrop ?
基于 cgroup 監(jiān)控 tcp 網(wǎng)絡(luò)連接,追蹤內(nèi)核丟棄的數(shù)據(jù)包,顯示數(shù)據(jù)包地址、端口和調(diào)用棧等信息。

參考鏈接:
原文作者:honglinli
