高巍
(麒麟軟件有限公司 北京市 100081)
下一個技術(shù)時代發(fā)展的是基于容器的應(yīng)用程序,它們橫跨多云和混合云環(huán)境,包括物理平臺、虛擬平臺、私有云平臺和公有云平臺。Kubernetes、容器和Linux是這次變革的核心,操作系統(tǒng)內(nèi)核能力已經(jīng)成為云計算技術(shù)發(fā)展和演進的重要支撐。面對業(yè)務(wù)多且復(fù)雜、建設(shè)規(guī)模龐大、架構(gòu)分布式化、異構(gòu)資源納管等新機遇新挑戰(zhàn),應(yīng)用開發(fā)人員開始從用戶視角關(guān)注云原生環(huán)境下服務(wù)網(wǎng)格、集群調(diào)度等性能優(yōu)化,開始關(guān)注Linux內(nèi)核,隨著eBPF等技術(shù)的快速發(fā)展,操作系統(tǒng)在容器編碼、持久化管理、服務(wù)網(wǎng)格等方面提供了新思路新技術(shù),實現(xiàn)數(shù)字時代操作系統(tǒng)面向多云架構(gòu)、無處不在、智能自治的基礎(chǔ)軟件。
傳統(tǒng)操作系統(tǒng)Linux內(nèi)核是硬件與軟件之間的一個中間層,從技術(shù)層面講是將應(yīng)用層的請求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動程序,對系統(tǒng)中的各種設(shè)備和組件進行尋址;從應(yīng)用程序?qū)用嬷v,應(yīng)用程序與硬件沒有聯(lián)系,只與內(nèi)核有聯(lián)系,應(yīng)用程序使用系統(tǒng)調(diào)用(syscall)接口發(fā)出請求,要求內(nèi)核代表它行事;內(nèi)核是一個資源管理程序,負(fù)責(zé)將共享資源(CPU時間、磁盤空間、網(wǎng)絡(luò)連接等)分配到各個系統(tǒng)進程,支撐設(shè)備管理、進程管理、文件系統(tǒng)和包管理等。隨著云原生技術(shù)發(fā)展,新一代Linux內(nèi)核需要支撐分布式調(diào)度、容器管理、編排管理等新功能。
eBPF起源于Linux內(nèi)核,可以運行沙箱程序,安全有效地擴展內(nèi)核功能,無需更改內(nèi)核源代碼或加載內(nèi)核模塊。eBPF全稱“擴展的伯克利數(shù)據(jù)包過濾器(Extended Berkeley Packet Filter)”,是一種數(shù)據(jù)包過濾技術(shù),從BPF(Berkeley Packet Filter)技術(shù)擴展而來。BPF提供了一種在內(nèi)核事件和用戶程序事件發(fā)生時安全注入代碼的機制,這就讓非內(nèi)核開發(fā)人員也可以對內(nèi)核進行控制。隨著Linux內(nèi)核的發(fā)展,BPF逐步從最初的數(shù)據(jù)包過濾擴展到網(wǎng)絡(luò)、內(nèi)核、安全、跟蹤等,而且它的功能特性還在快速發(fā)展之中,這種擴展后的BPF被簡稱為eBPF。
云原生概念最早由Pivotal的MattStine于2013年首次提出。2015年谷歌公司牽頭成立了云原生計算基金會(CNCF,Cloud Native Computing Foundation),致力于推動云原生技術(shù)的普及和可持續(xù)發(fā)展。2018年,隨著服務(wù)網(wǎng)格(Service Mesh)的加入,CNCF對云原生的定義發(fā)生了改變:云原生技術(shù)有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中,構(gòu)建和運行可彈性擴展的應(yīng)用。云原生技術(shù)主要包括容器、服務(wù)網(wǎng)格、微服務(wù)、不可變基礎(chǔ)設(shè)施和聲明式API。
可觀測性(Observability)一詞源于控制論,最早是由匈牙利裔工程師Rudolf E. Kálmán提出,指系統(tǒng)可以由其外部輸出推斷其內(nèi)部狀態(tài)的程度。對軟件架構(gòu)來說,監(jiān)控(Monitoring)與可觀測性(Observability)是兩個不同的概念,監(jiān)控旨在識別系統(tǒng)是否正常運行,可觀測性探究運行不暢的原因(Monitoring tells you whether the system works. Observability lets you ask why it’s not working.)。
通過附加eBPF程序來跟蹤點位以及內(nèi)核與用戶應(yīng)用調(diào)查點位的能力,允許實現(xiàn)應(yīng)用程序和系統(tǒng)程序本身運行時行為的不可預(yù)見條件下的可視性。通過向應(yīng)用程序端和系統(tǒng)端都提供內(nèi)省功能,兩種視圖均能夠被結(jié)合,從而向故障排解系統(tǒng)性能問題提供強大且獨特的見解。高級統(tǒng)計數(shù)據(jù)結(jié)構(gòu)允許以有效方式提取有意義的可視性數(shù)據(jù),而無需如相似系統(tǒng)般普遍采用導(dǎo)出大量抽樣數(shù)據(jù)的方式。
eBPF能夠?qū)趶V泛的可能來源的可視化事件的定制指標(biāo)進行收集和核內(nèi)聚合,而非依賴于操作系統(tǒng)所呈現(xiàn)的靜態(tài)計數(shù)器和儀表。通過僅收集所需的可視化數(shù)據(jù),并在事件源生成直方圖和類似數(shù)據(jù)結(jié)構(gòu),而非依賴于導(dǎo)出樣本,這樣可以拓展可實現(xiàn)的可視性的深度,并且顯著縮減整體系統(tǒng)費用。
基于識別和理解所有系統(tǒng)調(diào)用而創(chuàng)建,而且與所有網(wǎng)絡(luò)操作的數(shù)據(jù)包和套接層視圖相整合,使得安全系統(tǒng)具備革新性的創(chuàng)新方法。當(dāng)系統(tǒng)調(diào)用過濾、網(wǎng)絡(luò)層過濾和進程上下文語境跟蹤等方面已經(jīng)逐一被完全獨立的系統(tǒng)妥善處理,eBPF能夠有效地整合可視性、資源可控性,從而在更廣泛的上下文語境中以更佳的控制水準(zhǔn)來創(chuàng)建安全系統(tǒng)操作。
可編程性與運行效率的組合使得eBPF成為服務(wù)網(wǎng)格解決方案中所有數(shù)據(jù)包處理需求的一個自然適配器。eBPF的可編程性使得在無需脫離Linux內(nèi)核數(shù)據(jù)包處理上下文語境的情形下,即可添加額外的協(xié)議解析器,并且能夠便捷地對任何前向推進邏輯編程以滿足與時俱進的需求。由JIT編譯器供給的效率提供了近乎內(nèi)核代碼層級的自然編譯的執(zhí)行性能。
eBPF程序并不像常規(guī)的線程那樣,啟動后就一直保持運行,它需要由事件觸發(fā)后才會執(zhí)行。這些事件包括系統(tǒng)調(diào)用、內(nèi)核跟蹤點、內(nèi)核函數(shù)和用戶態(tài)函數(shù)的調(diào)用退出、網(wǎng)絡(luò)事件等。借助于強大的內(nèi)核態(tài)插樁(kprobe)和用戶態(tài)插樁(uprobe),eBPF程序的運行流程,如圖1所示。
圖1:eBPF程序的運行流程
(1)用戶態(tài)編寫eBPF程序;
(2)使用LLVM編譯成bytecode的ELF文件;
(3)使用bpf系統(tǒng)調(diào)用,把程序加載進入內(nèi)核;
(4)內(nèi)核的verifier會驗證eBPF程序的合法性,確保其能夠安全、合規(guī)地在內(nèi)核中運行;
(5)內(nèi)核會使用JIT compiler把eBPF字節(jié)碼編譯成本地機器碼;
(6)eBPF程序在內(nèi)核中以VM方式安全運行。
確保內(nèi)核安全和穩(wěn)定一直都是eBPF的首要任務(wù),不安全的eBPF程序根本就不會提交到內(nèi)核虛擬機中執(zhí)行。通常借助LLVM把編寫的eBPF程序轉(zhuǎn)換為BPF字節(jié)碼,然后再通過BPF系統(tǒng)調(diào)用提交給內(nèi)核執(zhí)行,如圖1所示。內(nèi)核在接受BPF字節(jié)碼之前,會首先通過驗證器verifier對字節(jié)碼進行校驗,只有校驗通過的BPF字節(jié)碼才會提交到即時編譯器執(zhí)行。
如果BPF字節(jié)碼中包含不安全的操作,驗證器verifier會直接拒絕BPF程序的執(zhí)行。一些典型的驗證過程如下所示:
(1)只有特權(quán)進程才可以執(zhí)行BPF系統(tǒng)調(diào)用;
(2)BPF程序不能包含無限循環(huán);
(3)BPF程序不能導(dǎo)致內(nèi)核崩潰;
(4)BPF程序必須在有限的時間段內(nèi)完成。
eBPF程序的開發(fā)方式:涵蓋bpftrace、BCC和libbpf這三種方式:
(1)bpftrace通常用在快速排查和定位系統(tǒng)上,它支持用單行腳本的方式來快速開發(fā)并執(zhí)行一個eBPF程序。bpftrace的功能略顯有限,不支持特別復(fù)雜的eBPF程序,也依賴于BCC和LLVM動態(tài)編譯執(zhí)行;
(2)BCC通常運用在開發(fā)復(fù)雜的eBPF程序中,其內(nèi)置的各種小工具也是目前應(yīng)用最為廣泛的eBPF小程序。BCC也存在提升的空間,它依賴于LLVM和內(nèi)核頭文件才可以動態(tài)編譯和加載eBPF程序;
(3)libbpf是從內(nèi)核中抽離出來的標(biāo)準(zhǔn)庫,用它開發(fā)的eBPF程序可以直接并行執(zhí)行,這樣就不需要每臺計算機都安裝LLVM和內(nèi)核頭文件了。不過,它要求內(nèi)核開啟BPF特性,需要最新的發(fā)行版才會默認(rèn)開啟。
簡單代碼示意基于eBPF丟棄網(wǎng)卡收到的任意數(shù)據(jù)包:
基于eBPF技術(shù)可以追蹤到Linux操作系統(tǒng)棧,如圖2所示,展示了一個Linux操作系統(tǒng)軟件堆棧。這些工具提供了對整個系統(tǒng)的性能分析,為可觀測性和監(jiān)控提供了能力支撐。
圖2:eBPF性能及可觀測性分析工具
可觀測性技術(shù)由日志、指標(biāo)和追蹤三根支柱來構(gòu)建。
(1)Logging:日志展現(xiàn)的是應(yīng)用運行而產(chǎn)生的事件或者程序在執(zhí)行的過程中間產(chǎn)生的一些記錄,可以詳細解釋系統(tǒng)的運行狀態(tài)。但是,存儲和查詢需要消耗大量的資源,往往使用過濾器減少數(shù)據(jù)量。
(2)Metrics:指標(biāo)是一種聚合數(shù)值,存儲空間很小,可以觀察系統(tǒng)的狀態(tài)和趨勢,但對于問題定位缺乏細節(jié)展示,可以使用等高線指標(biāo)等多維數(shù)據(jù)結(jié)構(gòu)來增強對于細節(jié)的表現(xiàn)力。例如,統(tǒng)計一個服務(wù)TBS的正確率、成功率、流量等,這是常見的針對單個指標(biāo)或者某一個數(shù)據(jù)庫的度量方法。
(3)Tracing:追蹤面向的是請求,可以輕松分析出請求中的異常點,但是與Logging日志存在相同的問題就是資源消耗量較大。通常也需要通過采樣的方式減少數(shù)據(jù)量。比如一次數(shù)據(jù)調(diào)用請求的范圍,也就是從瀏覽器或者手機客戶端發(fā)起的任何一次調(diào)用,這是一個流程化的進度,需要軌跡去追蹤。
目前以Prometheus、Fluentd、Jaeger等監(jiān)控工具存在監(jiān)控粒度不夠細致、資源消耗量大、外部代碼侵入等問題?;诓僮飨到y(tǒng)eBPF技術(shù)可以提供更優(yōu)的支撐,eBPF在可觀測性和監(jiān)控方面的優(yōu)勢是:
(1)能夠提取最全面的數(shù)據(jù),包括內(nèi)核、網(wǎng)絡(luò)、磁盤、用戶態(tài)等;
(2)資源開銷比例??;基于內(nèi)核進行采樣,對應(yīng)用范例零侵入、零改造;
(3)應(yīng)用程序零代碼改造,只要Linux內(nèi)核版本符合要求,eBPF能夠觀測任意數(shù)據(jù);
(4)能夠輕松應(yīng)對容器啟動、停止等動態(tài)特點,不需要任何的sideCar侵入,直接通過內(nèi)核來觀測任意的容器行為。
在云原生環(huán)境中每臺機器(或虛擬機)只有一個內(nèi)核,所有運行在該機器上的容器都共享同一個內(nèi)核,內(nèi)核了解主機上運行的所有應(yīng)用代碼。通過對內(nèi)核的檢測,基于eBPF可以同時檢測在該機器上運行的所有應(yīng)用程序代碼。當(dāng)將eBPF程序加載到內(nèi)核并將其附加到事件上時,它就會被觸發(fā),而不考慮哪個進程與該事件有關(guān)。
依賴eBPF技術(shù)可以有效補充可觀測性和監(jiān)控盲區(qū),意即關(guān)于云原生基礎(chǔ)設(shè)施層以及應(yīng)用層面的調(diào)用問題,自頂向下端到端串聯(lián)解決問題。利用eBPF增強底層K8s資源使用能力,主要是增強指標(biāo)力度,讓其能夠更加細膩地分析問題。基于eBPF的可觀測性架構(gòu),如圖3所示。
圖3:基于eBPF的可觀測性架構(gòu)
基于eBPF提升系統(tǒng)可觀測性和監(jiān)控具備以下特點:
(1)觀測數(shù)據(jù)層次廣、粒度細。eBPF代碼本身就相當(dāng)于一部分內(nèi)核,能夠讓內(nèi)核更貼近于容器,更加云原生化;
(2)可編程性。eBPF代碼在用戶態(tài)編寫,能夠?qū)崟r編譯驗證后導(dǎo)入內(nèi)核,這種可編程性使得可以動態(tài)地修改相關(guān)代碼,使eBPF能夠輕松應(yīng)對規(guī)模的增長;
(3)面向系統(tǒng)和應(yīng)用透明。eBPF技術(shù)在內(nèi)核層面執(zhí)行,對于系統(tǒng)及應(yīng)用透明,完全無侵入式運行并實現(xiàn)功能;
(4)快速靈活。eBPF代碼在經(jīng)過JIT編譯完進入內(nèi)核執(zhí)行時獲得近乎內(nèi)核代碼執(zhí)行的速度,對于任何系統(tǒng)調(diào)用幾乎都能夠高效追蹤,十分靈活。
隨著微服務(wù)架構(gòu)的發(fā)展,以Linkerd/Istio/NGINXMesh為代表的sidecar代理模式應(yīng)運而生,這就是第一代ServiceMesh,它作為一個基礎(chǔ)設(shè)施層,與業(yè)務(wù)進程完全解耦,和業(yè)務(wù)一起部署,接管業(yè)務(wù)件之間的通信,將網(wǎng)絡(luò)數(shù)據(jù)收發(fā)單獨抽象出一層,在這層集中處理服務(wù)發(fā)現(xiàn)、負(fù)載均衡、授權(quán)認(rèn)證等分布式系統(tǒng)所需要的功能,實現(xiàn)網(wǎng)絡(luò)拓?fù)渲姓埱蟮目煽總鬏敗erviceMesh帶來如此多便利的同時,也不可避免地存在著一些問題。傳統(tǒng)方式如圖4所示,客戶端到服務(wù)端的消息僅需進出一次內(nèi)核協(xié)議棧即可完成消息傳遞,但在sidecar模式中,一般選擇使用內(nèi)核的iptables能力掌控業(yè)務(wù)流量,這就造成了業(yè)務(wù)數(shù)據(jù)需要多次進出內(nèi)核協(xié)議棧,導(dǎo)致業(yè)務(wù)時延增大,吞吐量變低。
圖4:基于iptables的sidecar模式
基于eBPF能力短接socket之間數(shù)據(jù)包傳輸來提高傳輸效率,如圖5所示,實現(xiàn)ServiceMesh網(wǎng)絡(luò)加速,為實現(xiàn)短接內(nèi)核網(wǎng)絡(luò)協(xié)議棧目標(biāo),需要使用eBPF提供的兩種能力,分別是sockops與socket redirection:
圖5:基于eBPF的sidecar模式
(1) sockops提供了在tcp socket創(chuàng)建連接時將socket使用當(dāng)前連接的唯一key標(biāo)識后將socket信息保存在sockmap數(shù)據(jù)結(jié)構(gòu)中的能力;
類似的,代碼實現(xiàn)如:
(2) socket redirection在傳輸tcp數(shù)據(jù)時支持使用key去sockmap中查找socket,命中后可直接將數(shù)據(jù)轉(zhuǎn)發(fā)到此socket中。
類似的,代碼實現(xiàn)如:
對于未在sockmap中找到的socket,正常將數(shù)據(jù)包通過內(nèi)核網(wǎng)絡(luò)協(xié)議棧發(fā)送出去。將這些能力結(jié)合在一起,就可以在不經(jīng)過內(nèi)核網(wǎng)絡(luò)協(xié)議棧的前提下直接將數(shù)據(jù)包轉(zhuǎn)發(fā)到對應(yīng)的socket上,完成數(shù)據(jù)的一次傳輸,降低在內(nèi)核網(wǎng)絡(luò)協(xié)議棧上的時間消耗,這在服務(wù)網(wǎng)格這種需要多次轉(zhuǎn)發(fā)流量的場景下,能夠顯著提高服務(wù)網(wǎng)格的QPS,降低網(wǎng)絡(luò)時延。
不難看出,云計算數(shù)字化基礎(chǔ)設(shè)施是數(shù)字經(jīng)濟時代的必然產(chǎn)物,基于云原生構(gòu)建一個高性能分布式調(diào)度系統(tǒng),更靈活有效地滿足不斷發(fā)展的用戶需求,操作系統(tǒng)發(fā)展無論在數(shù)據(jù)中心、云端還是邊緣計算環(huán)境同樣需要有新思路新技術(shù)新模式。以基于操作系統(tǒng)eBPF可觀測性技術(shù)發(fā)展為例:
(1)分布式網(wǎng)絡(luò)問題診斷雖然有效解決了較大規(guī)模的網(wǎng)絡(luò)鏈路性能診斷定位問題,但是這些設(shè)計和研究都是從容器網(wǎng)絡(luò)層面來考慮設(shè)計,面對其他應(yīng)用場景和不同系統(tǒng)架構(gòu)也會面臨一定的局限性,未來可繼續(xù)基于操作系統(tǒng)eBPF技術(shù)從系統(tǒng)的其他層面,如從算力和存儲視角提升系統(tǒng)的可觀測性。
(2)與其他分析技術(shù)融合進一步拓寬eBPF可觀測性應(yīng)用空間。在《面向政務(wù)領(lǐng)域的擬人化人機交互關(guān)鍵技術(shù)研究與應(yīng)用》項目中eBPF技術(shù)應(yīng)用于創(chuàng)建開放式智能客服平臺,暨創(chuàng)建面向?qū)嶋H問題求解的開放共享式智能客服云化、微服務(wù)平臺,eBPF技術(shù)與深度學(xué)習(xí)和監(jiān)督學(xué)習(xí)等技術(shù)一起部署并實現(xiàn)自主反饋的平臺學(xué)習(xí)能力,達到全領(lǐng)域的快速部署和應(yīng)用可觀測。
隨著應(yīng)用的不斷發(fā)展,對標(biāo)RedHat(OpenShift)和SUSE(RANCHER)國外操作系統(tǒng)廠商,國產(chǎn)操作系統(tǒng)廠商和云原生廠商越來越意識到操作系統(tǒng)技術(shù)與云原生技術(shù)緊密關(guān)聯(lián)!基于操作系統(tǒng)eBPF技術(shù)已成為Linux內(nèi)核中發(fā)展最快的子模塊,eBPF為操作系統(tǒng)內(nèi)核賦予新的能力,在云原生服務(wù)編碼、集群調(diào)度、執(zhí)行系統(tǒng)、運行環(huán)境中發(fā)揮重要作用,起到傳統(tǒng)操作系統(tǒng)(Operating System)與云操作系統(tǒng)(Orchestration System)之間的技術(shù)紐帶作用。