Cilium:基于eBPF的高效云原生網(wǎng)絡(luò)和ServiceMesh方案
Cilium簡(jiǎn)介
Cilium 是一種開源的云原生網(wǎng)絡(luò)解決方案,基于革命性的內(nèi)核技術(shù) eBPF ,為工作負(fù)載提供高性能、安全、可觀測(cè)的網(wǎng)絡(luò)連接。eBPF 技術(shù)通過(guò)提供附加自定義程序到內(nèi)核中的事件為應(yīng)用程序提供超能力,Cilium 項(xiàng)目利用 eBPF 的能力開發(fā)了多個(gè)程序,通過(guò)這些程序可以有效地管理容器集群。
目前Clilium項(xiàng)目包含三個(gè)項(xiàng)目:Cilium、Hubble、Tetragon。
解決了容器網(wǎng)絡(luò)云面臨的三大挑戰(zhàn):連接、可觀測(cè)性、安全。
Cilium最初由Isovalent創(chuàng)建,并于2015年開源,非常受歡迎。有14000+ GitHub star,500+貢獻(xiàn)者,以及14000+用戶注冊(cè)了Cilium社區(qū)Slack。更重要的是,Cilium 被媒體、金融和搜索等各種垂直行業(yè)的組織廣泛部署在生產(chǎn)環(huán)境中,AWS、微軟、Google三大云提供商現(xiàn)在都在其 Kubernetes 服務(wù)產(chǎn)品中支持 Cilium。Cilium 于2021年10月加入CNCF孵化,并于2022年10月畢業(yè)。畢業(yè)狀態(tài)是任何 CNCF 項(xiàng)目的一個(gè)重要里程碑,表明該項(xiàng)目擁有可持續(xù)的貢獻(xiàn)者社區(qū),被廣泛采用,并且正在成為任何云規(guī)模堆棧的預(yù)期部分。
擴(kuò)展云原生連接
Kubernetes 的最大優(yōu)勢(shì)在于其動(dòng)態(tài)特性,這使其能夠按需擴(kuò)展服務(wù),并在出現(xiàn)問(wèn)題時(shí)將 Pod 和服務(wù)協(xié)調(diào)到所需的狀態(tài)。例如,如果一個(gè)節(jié)點(diǎn)出現(xiàn)故障,Kubernetes 將自動(dòng)重啟集群中另一個(gè)節(jié)點(diǎn)上的 pod,以彌補(bǔ)其損失。但是,這種動(dòng)態(tài)性給傳統(tǒng)網(wǎng)絡(luò)帶來(lái)了麻煩,因?yàn)镮P地址在整個(gè)集群中被重新分配和重用。對(duì)于人工操作員,存在可觀測(cè)性問(wèn)題,因?yàn)槟鸁o(wú)法再對(duì)與特定工作負(fù)載匹配的 IP 地址做出假設(shè)。在底層網(wǎng)絡(luò)堆棧中,某些組件不是為不斷重用 IP 地址而設(shè)計(jì)的,從而導(dǎo)致大規(guī)模性能問(wèn)題。
Cilium 在 Linux 內(nèi)核的不同點(diǎn)注入 eBPF 程序,提供適合云原生時(shí)代的連接層,該層使用 Kubernetes identities 而不是 IP 地址,并允許繞過(guò)部分網(wǎng)絡(luò)堆棧以獲得更好的性能。
在 Kubernetes 中,Pod 通常運(yùn)行自己的網(wǎng)絡(luò)命名空間,這意味著數(shù)據(jù)包必須經(jīng)歷網(wǎng)絡(luò)堆棧兩次——一次在 Pod 命名空間中,一次在主機(jī)中。Cilium 允許繞過(guò)主機(jī)堆棧的重要部分,從而顯著提高性能。就像閃電俠一樣,它快如閃電。
從上圖可以看出,Cilium 可以繞過(guò)網(wǎng)絡(luò)堆棧中的 iptables。這是一個(gè)在設(shè)計(jì)時(shí)沒(méi)有考慮到 Kubernetes 行為的組件,并且由于 Kubernetes 的動(dòng)態(tài)性質(zhì),iptables 的性能通常會(huì)大規(guī)模下降。在節(jié)點(diǎn)、Pod 和服務(wù)較多的大型集群中,通常有大量的 iptables 過(guò)濾器和轉(zhuǎn)發(fā)規(guī)則,需要隨著 Pod 的來(lái)來(lái)去去進(jìn)行更新。更糟糕的是,對(duì)于iptables,更改一個(gè)規(guī)則意味著整個(gè)表被重寫。隨著部署的增長(zhǎng),每次創(chuàng)建或銷毀 Pod 時(shí),規(guī)則需要越來(lái)越長(zhǎng)的時(shí)間來(lái)收斂,從而導(dǎo)致大規(guī)模正確操作的嚴(yán)重延遲。
Cilium 不是 iptables,而是在 eBPF maps 中跟蹤 pod endpoints。這些是存儲(chǔ)在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu),Cilium 的 eBPF 程序可以訪問(wèn)這些數(shù)據(jù)結(jié)構(gòu),以便就每個(gè)網(wǎng)絡(luò)數(shù)據(jù)包的發(fā)送位置做出高效的決策。
基于Cilium身份的網(wǎng)絡(luò)策略
傳統(tǒng)的 Kubernetes 網(wǎng)絡(luò)策略基于 iptables filters,這些 filters 也存在相同的規(guī)模問(wèn)題。Cilium 采用了不同的方法,使用 Kubernetes 標(biāo)簽為 Pod 分配安全身份(類似于 Kubernetes 使用標(biāo)簽識(shí)別分配給每個(gè)服務(wù)的 Pod 的方式)。網(wǎng)絡(luò)策略以 eBPF maps 表示,并允許在網(wǎng)絡(luò)流量進(jìn)入或離開 Cilium 管理的節(jié)點(diǎn)時(shí)從這些映射進(jìn)行超快速查找,以決定是否允許或拒絕數(shù)據(jù)包。這些eBPF程序非常小,速度超快。
使用 Cilium,您可以編寫應(yīng)用程序感知的 L7 策略!例如,您可以編寫一個(gè)策略來(lái)限制 Pod 之間的訪問(wèn),以僅允許特定 API 端點(diǎn)上的特定 HTTP REST 方法。您還可以根據(jù)完全限定的域名或 IP 地址篩選流量,以便在流量需要在群集外部通信時(shí)進(jìn)行通信。
透明加密
策略實(shí)施并不是 Cilium 提供的網(wǎng)絡(luò)安全的唯一方面。零信任網(wǎng)絡(luò)已迅速成為最佳實(shí)踐,透明加密可能是確保所有網(wǎng)絡(luò)流量都加密的最簡(jiǎn)單方法。您可以輕彈開關(guān),讓 Cilium 創(chuàng)建流量通過(guò)的 IPsec 或 WireGuard 連接。通過(guò) eBPF 的魔力,這發(fā)生在內(nèi)核級(jí)別,因此您的應(yīng)用程序不需要任何更改即可加密其流量。
與傳統(tǒng)基礎(chǔ)架構(gòu)集成
借助 Cilium,您可以輕松地將容器化客戶端和服務(wù)與舊式基礎(chǔ)架構(gòu)連接起來(lái)。來(lái)自 Kubernetes Pod 的網(wǎng)絡(luò)流量最終看起來(lái)像是從偽隨機(jī) IP 地址到在數(shù)據(jù)中心服務(wù)器機(jī)架中的虛擬機(jī)上運(yùn)行的傳統(tǒng)服務(wù)。您的傳統(tǒng)防火墻基礎(chǔ)設(shè)施非常希望處理靜態(tài) IP 地址,以便它可以區(qū)分朋友和敵人。Cilium 具有出口網(wǎng)關(guān)概念,可通過(guò)具有固定 IP 地址的特定出口節(jié)點(diǎn)路由用于傳統(tǒng)服務(wù)的流量。另一方面,Cilium 還支持邊界網(wǎng)關(guān)協(xié)議 (BGP),以便更輕松地將 Kubernetes 服務(wù)的路由宣布到集群外部的網(wǎng)絡(luò)基礎(chǔ)設(shè)施。Cilium 在與您的外部服務(wù)集成時(shí)為您提供來(lái)來(lái)往往。
Cluster meshes
我們已經(jīng)討論過(guò)將 Cilium 與外部遺留工作負(fù)載集成,但是多個(gè) Kubernetes 集群呢?是否需要將從一個(gè)群集到另一個(gè)群集的連接視為另一個(gè)外部服務(wù)?您可以將多個(gè)支持 Cilium 的 Kubernetes 集群組合在一起,并以非常酷的方式利用 Cilium 的身份模型來(lái)幫助多集群服務(wù)配置。Cilium 將這種多集群支持稱為 ClusterMesh。
使用 Cilium ClusterMesh,您可以使用 Kubernetes annotations 指定全局服務(wù),并且 Cilium 將對(duì)與存在于多個(gè)集群中的全局服務(wù)關(guān)聯(lián)的服務(wù)端點(diǎn)的訪問(wèn)進(jìn)行負(fù)載平衡 - 如果需要,可以使用加密流量。可以將這些全局服務(wù)的服務(wù)相關(guān)性指定為首選在本地發(fā)送請(qǐng)求(如果終結(jié)點(diǎn)運(yùn)行正常),并在需要時(shí)故障轉(zhuǎn)移到其他群集中的遠(yuǎn)程服務(wù)終結(jié)點(diǎn)。
簡(jiǎn)化跨集群故障轉(zhuǎn)移只是一個(gè)好處:有各種實(shí)際的多集群用例,在 Cilium ClusterMesh 中更容易實(shí)現(xiàn)。設(shè)置 ClusterMesh 只是讓啟用 Cilium 的集群相互感知的問(wèn)題,而 cilium cli 工具使這個(gè)過(guò)程非常簡(jiǎn)單。事實(shí)上,我能夠使用 Cilium 項(xiàng)目的快速入門指南,在短短幾分鐘內(nèi)在 Azure AKS 中啟動(dòng)跨越美國(guó)東部和西部區(qū)域的全局服務(wù)故障轉(zhuǎn)移 Cilium ClusterMesh,在第一次嘗試之前,我對(duì) Azure AKS 一無(wú)所知。
網(wǎng)絡(luò)可觀測(cè)性
到目前為止,我一直專注于網(wǎng)絡(luò)連接和安全性,但 Cilium 也可以幫助實(shí)現(xiàn)大規(guī)模的網(wǎng)絡(luò)可觀測(cè)性。
Kubernetes集群內(nèi)部的網(wǎng)絡(luò)可觀測(cè)性變得非常復(fù)雜。由于 Pod 不斷來(lái)來(lái)去去,并且在擴(kuò)展和縮減時(shí)跨不同工作負(fù)載重新分配內(nèi)部 IP 地址,因此很難觀察數(shù)據(jù)包流。嘗試按群集內(nèi)的 IP 地址跟蹤數(shù)據(jù)包是徒勞的。即使在節(jié)點(diǎn)上運(yùn)行 eBPF 驅(qū)動(dòng)的 tcpdump 也是不夠的,因?yàn)?IP 地址和端口很難與工作負(fù)載匹配,尤其是當(dāng) Kubernetes 本身可能通過(guò)快速重新調(diào)試 pod 來(lái)嘗試解決您正在診斷的問(wèn)題時(shí)。當(dāng)其中一個(gè)微服務(wù)或我們的網(wǎng)絡(luò)策略出現(xiàn)問(wèn)題時(shí),我們?nèi)绾潍@得可觀測(cè)性?
是時(shí)候向您介紹Cilium的超級(jí)朋友 Hubble 了。Hubble 過(guò)濾了動(dòng)態(tài)IP尋址的噪聲,將網(wǎng)絡(luò)流與其Kubernetes身份呈現(xiàn)在一起,因此您可以清楚地看到Pod和服務(wù)如何相互通信以及與外部世界進(jìn)行通信。Hubble建立在Cilium的基礎(chǔ)上,創(chuàng)建了一個(gè)一流的容器網(wǎng)絡(luò)可觀測(cè)性平臺(tái),不僅能夠向你顯示網(wǎng)絡(luò)第3層和第4層的流的詳細(xì)信息,還可以在第7層向你顯示協(xié)議流的細(xì)節(jié),如HTTP和gRPC。
Hubble UI 更進(jìn)一步,提供了服務(wù)依賴關(guān)系圖的圖形描述以及網(wǎng)絡(luò)流詳細(xì)信息。
Cilium 和 Hubble 共同揭示了各種各樣的指標(biāo)、跟蹤和日志,這些指標(biāo)、跟蹤和日志對(duì)于觀察您的網(wǎng)絡(luò)和診斷問(wèn)題非常寶貴。您可以將這些數(shù)據(jù)提取到Grafana中以便于可視化,輕松回答有關(guān)您的網(wǎng)絡(luò)的各種問(wèn)題。例如,如果您想知道特定服務(wù)或所有集群的 4xx HTTP 響應(yīng)速率,或者如果您想知道性能最差的服務(wù)之間的請(qǐng)求/響應(yīng)延遲,Hubble 指標(biāo)可以滿足您的需求。
運(yùn)行時(shí)安全性:可觀測(cè)性和強(qiáng)制實(shí)施
但容器安全性不僅與網(wǎng)絡(luò)策略有關(guān),容器運(yùn)行時(shí)也受益于安全策略。Tetragon專注于使用eBPF進(jìn)行運(yùn)行時(shí)安全可觀察性和實(shí)施。Tetragon 檢測(cè)并可以報(bào)告一系列安全重要事件,例如:
- 流程執(zhí)行事件。
- 系統(tǒng)調(diào)用活動(dòng)。
- I/O 活動(dòng),包括網(wǎng)絡(luò)和文件訪問(wèn)。
Tetragon并不是第一個(gè)出現(xiàn)的eBPF驅(qū)動(dòng)的安全工具,但它為容器安全帶來(lái)了許多新功能。如果其他項(xiàng)目在表面上掛接到系統(tǒng)調(diào)用,則它們受到檢查時(shí)間到使用時(shí)間漏洞的影響,在該漏洞中,系統(tǒng)調(diào)用的參數(shù)可能在到達(dá)內(nèi)核之前被覆蓋。Cilium 工程師利用他們對(duì)內(nèi)核內(nèi)部的了解,在不受此問(wèn)題影響的點(diǎn)上掛鉤到事件中。
Tetragon的跟蹤策略允許您配置要觀察的內(nèi)核事件,并定義匹配條件并采取行動(dòng)。更重要的是,Tetragon提供基于Kubernetes身份的上下文信息。例如,如果要檢測(cè)對(duì)特定文件或目錄的訪問(wèn),則可以配置一個(gè) TracingPolicy,該策略將發(fā)出日志,準(zhǔn)確告訴您哪個(gè)進(jìn)程(運(yùn)行哪個(gè)可執(zhí)行文件)、哪個(gè) pod 訪問(wèn)了該文件。您甚至可以將策略配置為在文件訪問(wèn)完成之前終止違規(guī)進(jìn)程。這非常強(qiáng)大,并為容器安全增加了一種全新的方法,以幫助您限制容器暴露的攻擊面。像沙贊一樣,Tetragon被賦予所羅門的智慧,擁有豐富的知識(shí)和對(duì)如何采取行動(dòng)的判斷技巧。
Tetragon可以獨(dú)立使用,獨(dú)立于Cilium的網(wǎng)絡(luò)功能。但是想象一下,你可以用一個(gè)Tetragon&Cilium超級(jí)英雄的團(tuán)隊(duì)來(lái)做什么,結(jié)合網(wǎng)絡(luò)和運(yùn)行時(shí)安全超能力,這樣你就可以,例如,看到啟動(dòng)可疑網(wǎng)絡(luò)連接的完整進(jìn)程祖先。
無(wú)邊車服務(wù)網(wǎng)格
您已經(jīng)看到 Cilium 不僅實(shí)現(xiàn)了 Kubernetes 服務(wù)之間的連接,而且還提供了可觀測(cè)性和安全性功能,并且能夠在第 7 層采取行動(dòng)。這不是與服務(wù)網(wǎng)格非常相似嗎?是的!現(xiàn)在,Cilium 項(xiàng)目可以提供服務(wù)網(wǎng)格功能,而無(wú)需將邊車注入每個(gè) pod,從而提高服務(wù)網(wǎng)格效率。進(jìn)步有多大?讓我們看一下對(duì)同一節(jié)點(diǎn)上容器之間的 HTTP 延遲處理的影響。使用 HTTP 代理總是會(huì)有成本的,但是,當(dāng)您使用sidecar模式時(shí),您可能會(huì)支付兩倍的代價(jià),因?yàn)槲⒎?wù)相互通信并且流量同時(shí)通過(guò)ingress和egress sidecar HTTP 代理。減少網(wǎng)絡(luò)路徑中的代理數(shù)量并選擇 HTTP filter 的類型會(huì)對(duì)性能產(chǎn)生重大影響。
下面是一個(gè)基準(zhǔn)比較,來(lái)自一篇深入探討 Cilium 服務(wù)網(wǎng)格如何工作的博客文章,它說(shuō)明了運(yùn)行 Cilium Envoy filter(棕色)的單個(gè)節(jié)點(diǎn)范圍的 Envoy 代理與運(yùn)行 Istio Envoy filter(藍(lán)色)的雙邊車 Envoy 模型的 HTTP 處理的典型延遲成本。黃色是沒(méi)有代理且未執(zhí)行 HTTP 處理的基線延遲。
Cilium Service Mesh 通過(guò)使用 Envoy 網(wǎng)絡(luò)代理來(lái)實(shí)現(xiàn)這種延遲改進(jìn),該代理作為 agent 的一部分在每個(gè)節(jié)點(diǎn)上運(yùn)行,而不是作為 sidecar 附加到每個(gè) Pod。但這種改進(jìn)也不全面的,是因?yàn)镃ilium在將網(wǎng)絡(luò)流量重定向到節(jié)點(diǎn)范圍的Envoy代理之前盡可能多地使用eBPF。這是一個(gè)令人印象深刻的一兩拳組合,值得野貓,利用時(shí)機(jī)和技術(shù)而不是蠻力來(lái)獲得您想要的結(jié)果。
這不是一種新方法——Envoy 已經(jīng)在 Cilium 中用于實(shí)施第 7 層感知網(wǎng)絡(luò)策略多年。為了實(shí)現(xiàn)其無(wú) sidecar 服務(wù)網(wǎng)格,Cilium 擴(kuò)展了對(duì)完全兼容的 Kubernetes 入口和網(wǎng)關(guān) API 實(shí)現(xiàn)的支持,以及一個(gè)較低級(jí)別的 CRD,該 CRD 在 Cilium 中公開了 Envoy 的全部功能。如果您現(xiàn)在正在使用基于sidecar 的服務(wù)網(wǎng)格,并且開始感到與在每個(gè) Pod 中部署服務(wù)網(wǎng)格sidecar相關(guān)的資源成本緊張,那么現(xiàn)在是將 Cilium Service Mesh 視為資源效率更高的替代品的好時(shí)機(jī)。
不僅僅是 Kubernetes
雖然一直在 Kubernetes 集群的背景下談?wù)?Cilium,但 Cilium 不僅限于 Kubernetes。Cilium 為連接性、可觀測(cè)性和安全性帶來(lái)的好處也可以在 Kubernetes 之外的工作負(fù)載中實(shí)現(xiàn)。例如,Cilium 可以用作獨(dú)立的負(fù)載均衡器,并在實(shí)際生產(chǎn)環(huán)境中顯示出令人印象深刻的優(yōu)勢(shì)。