eBPF 實踐 — 網路可觀測
簡介
觀測雲採集器,是一款開源、一體式的數據採集 Agent,它提供全平台作業系統支援,擁有全面數據採集能力,涵蓋基礎設施、指標、日誌、應用性能、用戶訪問以及安全巡檢等各種場景。通過 eBPF 技術的引入,觀測雲採集器實踐了網路傳輸層和應用層的部分協議的可觀測。
採集器架構
-
採集管理:配置載入模組用於配置動態管理與採集插件的開啟關閉;監視器模組用於查看採集器資源使用、採集插件開啟、數據處理器腳本工作狀況、採集器外部數據接入API 的響應與延遲資訊等
-
數據採集:採集器不僅可以通過內置插件進行數據採集,還能接入外部數據源,如雲原生計算基金會下的可觀測項目 OTEL 的鏈路、指標數據等
-
數據清洗:在採集插件生成數據後和數據上傳之間的數據清洗層,用戶可以通過編程介入,如使用可編程數據處理器的語言編寫腳本修改 Point ,使用內置函數分析提取網路數據中 IP 歸屬的城市、省份和國家到 Point 中;腳本支援動態載入和卸載
-
數據上傳:採集器對各種數據進行分類上傳,類別有日誌、指標、鏈路、網路等,所有類別的數據均使用 Point 結構封裝,每一個 Point 代表一條數據,大致由四個部分:名字、 標籤字典、欄位字典以及時間戳構成 (其名字可以是指標名 cpu, 日誌來源 nginx ,網路的 httpflow等)
-
eBPF 技術應用
觀測雲採集器使用了三種類型的 eBPF 程式:socket filter、kprobe、uprobe,能夠抓取乙太網幀、跟蹤與 socket 和 TCP/IP 協議棧相關的內核函數以及用戶共享庫函數,實現網路協議可觀測。下圖介紹觀測雲採集器如何實踐 eBPF 技術進行主機上的網路觀測。
數據採集
觀測雲採集器的 eBPF 網路觀測功能採集並生成了三個數據集,分別為 netflow, dnsflow 和 httpflow,其 tag 基本相同,以下是其 tag 名與描述。
Tag 名 描述 src_ip 源 IP dst_ip 目標 IP src_port 源埠 dst_port 目標埠 transport tcp 或 udp family IPv4 或 IPv6 direction 傳輸方向(incoming/outgoing) srciptype 源 IP 類型 (other/private/multicast) dstiptype 目標 IP 類型 (other/private/multicast) host 主機名 source 數據源(netflow,httpflow,dnsflow) pid 進程 id,僅 netflow dst_domain 僅 netflow,來自 dnsflow 抓包記錄 srck8snamespace 源 service 歸屬的 namespace srck8sdeployment_name 源 serivce 歸屬的 deployment srck8sservice_name 源 service srck8spod_name 源 pod dstk8snamespace 目標 service 歸屬的 namespace dstk8sdeployment_name 目標 serivce 歸屬的 deployment dstk8sservice_name 目標 service dstk8spod_name 目標 pod sub_source 子來源,默認 N/A,如若為 Kubernetes 流量則為 K8s 傳輸層網路觀測
-
採集器使用 kprobe 類型 eBPF 程式獲取部分內核函數的輸入與返回值
-
通過 inetbind(6) 函數判斷 srcip + src_port 是否為服務端
-
通過協議棧 tcp\udp 以及 ip 相關的內核函數,獲取服務與客戶端之間的流量大小以及 TCP 協議的連接的建立與關閉次數、重傳和 RTT 資訊
Field 名 描述 bytes_read 接收位元組數 bytes_written 發送位元組數 retransmits 重傳次數 rtt rtt rtt_var rtt_var tcp_closed TCP 連接關閉次數 tcp_established TCP 連接建立次數 應用層網路觀測
-
採集器使用 AF_PACKET + BPF 在採集器上分析 DNS 請求,以支援 CentOS(RedHat)7.6 (其不支援 socket filter 類型 eBPF 程式),記錄請求資訊支援 netflow 進行域名反向解析;
-
對於 HTTP 請求使用 socket filter 和 uprobe 類型 eBPF 程式實現 HTTP(S) 請求分析。
下面的為採集 dns 協議生成的欄位 和 http 協議生成欄位。
Field 名(dns) 描述 count 一個採集周期內的請求總數 latency DNS 平均請求響應時間間隔 latency_max DNS 最大請求的響應時間間隔 rcode DNS 響應碼: 0 – NoError, 1 – FormErr, 2 – ServFail, 3 – NXDomain, 4 – NotImp, 5 – Refused, … Field 名(http) 描述 count 一個採集周期內的請求總數 http_version 1.1 / 1.0 … latency TTFB method GET/POST… path 請求路徑 status_code 狀態碼,如 200, 301, 404 … truncated 請求路徑長度達到採集的(約 150)位元組上限,存在截斷可能 用戶地理分布及 TCP 時延
通過內置數據處理器編寫腳本,來解析 ip 並獲取 ip 歸屬的省份、國家等資訊作為標籤追加到生成的 Point 上,並在觀測雲前端創建儀錶板。下圖通過世界地圖和中國地圖展示 netflow 中客戶端 ip 的地理分布和服務端之間的 tcp 時延。
主機間四層網路拓撲
下圖為當前工作空間內部署了觀測雲採集器並開啟了 eBPF 網路採集器的主機間的網路拓撲圖,圖上我們可以看到主機間的數據發送與接受的位元組數和網路波動等資訊。
K8s Pod 間網路拓撲
當 eBPF 採集插件獲取到 K8S 的 ip 和埠資訊後將自動追加到生成的數據上,通過觀測雲前端構建不同的網路拓撲圖,下圖是構建的 Pod 網路拓撲關係圖。
K8s Deployment 間網路拓撲
下圖是構建的 Deployment 網路拓撲關係圖,從圖中可以看到 nginx deployment 上的 HTTP 協議的每秒請求數和請求錯誤率。
-
-