Cilium架構 (Cilium 2)


Cilium架構

譯自:http://docs.cilium.io/en/stable/architecture/

本文檔描述了Cilium的架構。它通過記錄BPF數據路徑(datapath)的鈎子來實現Cilium數據路徑,那么Cilium數據路徑是如何與容器編排層繼承,以及如何在各層(如BPF數據路徑和Cilium代理)之間更新對象的?

數據路徑

Linux內核在網絡棧中支持一個BPF鈎子集,使用這些勾子可以允許BPF程序(即使用回調函數運行)。Cilium數據路徑使用這些鈎子加載BPF程序,當一起使用時,這些程序會創建更高級別的網絡結構。

下面是Cilium使用的鈎子列表以及簡要概述。更詳細的介紹可以參見BPF and XDP Reference Guide

  • XDP:XDP BPF鈎子最早可以在網絡驅動中使用,在報文接收時觸發BPF程序。由於BPF程序能夠(在進行其他處理前)直接作用於報文數據,因此能夠獲取最好的報文處理性能。該鈎子可用於過濾程序丟棄惡意的或非期望的流量,以及其他常見的DDOS防護機制。

  • Ingress/Egress流控:與XDP相同,附加到tc(traffic control) ingress鈎子的BPF程序會附加到網絡接口上,但是在網絡棧完成初始的報文處理之后運行。該鈎子在協議棧的L3層之前運行,但可以訪問與報文相關的大多數元數據,適用於本地節點的處理,如配置L3/L4 endpoint策略以及限制達到endpoints的流量。對於面向設備的網絡,tc ingress鈎子可以與上面的XDP鈎子耦合。完成該操作后,可以合理地假設此時的大多數流量是合法的,並且目的地是主機。

    容器通常會使用一個虛擬設備,稱為veth對,可以看作是連接容器和主機的虛擬線路。通過連接到這對veth的主機側的TC ingress鈎子,Cilium可以監控和對一個容器中存在的所有流量強制執行制訂的策略(在主機側監控和限制本機的容器的流量)。通過將一個BPF程序附加到與每個容器關聯的veth對上,然后使用另外一個附加到tc ingress鈎子上的BPF程序將所有網絡流量路由到主機側的虛擬設備上,這樣Cilium也可以監控和對到達本節點或節點中存在的流量強制執行制訂的策略(在容器側監控和限制本機的流量)。

    根據場景的需要,容器也可能使用ipvlan設備進行連接。這種模式下,主機的物理設備作為ipvlan的master,容器中的虛擬ipvlan設備被設置為slave模式。使用ipvlan而不是veth對的好處是可以減少網絡棧將報文推送到位於另一個網絡命名空間中的ipvlan slave所需要的資源,因此可以獲得更好的延遲結果。為了使用Cilium配置L3/L4 endpoint策略,需要將用於tc的BPF程序附加到容器網絡命名空間中的ipvlan slave設備的tc egress鈎子上。例如,與在ipvlan master的tc ingress鈎子上運行的另一個BPF程序相結合,這樣也可以限制節點上的傳入流量。

  • socket操作:socket操作鈎子附加到一個特定的cgroup上,根據TCP時間運行。Cilium將BPF socket操作程序附加到根cgroup上,並使用該程序監控TCP狀態變更,特別是對ESTABLISHED 狀態變更。當一個socket轉換為ESTABLISHED 狀態,如果TCP socket的對端位於本地節點上(可能是本地代理),則會附加socket 發送/接受程序。

  • socket 發送/接收:當一個TCP socket執行發送操作時會運行socket 發送/接受鈎子。此時,鈎子或檢查消息,最終會丟棄該消息,會將該消息發送到TCP層,會直接將該消息重定向到另外一個socket。如下所述,Cilium使用它來加速數據路徑的重定向。

將上述鈎子與虛擬接口(cilium_host, cilium_net),可選的overlay接口(cilium_vxlan),Linux內核加密支持以及用戶空間代理(Envoy)相結合,Cilium可以創建如下網絡對象。

  • 預過濾(prefilter):預過濾對象會運行一個XDP程序,並提供一組預過濾規則來過濾網絡上的流量來達到更好的性能。特別使用一組Cilium agent提供的CIDR映射來查找報文,如在目的地不是一個有效的endpoint時丟棄報文,或允許網絡棧處理該報文。可以很容易通過擴展來構建一個新的預過濾標准/能力。

  • endpoint策略:endpoint策略對象實現了Cilium endpoint enforcement。它使用一個映射來查找與身份相關的報文,且該層(layer)可以很好地擴展到多個endpoint。取決於本層的策略,可能會丟棄報文,轉發到本地的endpoint或服務對象,或轉發到L7策略對象,用於后續L7規則。它是Cilium數據路徑中負責報文和身份映射以及執行L3和L4策略的主要對象。

  • 服務(service):服務對象會根據該對象接收到的每個報文的目的IP(可能包含目的端口)來進行映射查找。如果找到一個匹配的表項,則將該報文轉發到一個配置到的L3/L4 endpoint上。服務塊可以使用TC ingress鈎子在任何接口上實現一個獨立的負載均衡,或集成到endpoint策略對象中。

  • L3加密:在ingress上,可以使用L3加密對象標識需要解密的報文,然后將報文傳遞到Linux xfrm(轉換)層進行解密,在解密報文后,該對象會接受報文,然后將報文傳遞到網絡棧,后續給其他對象進行處理。根據網絡的模式(直接路由或overlay),可能是BPF尾部調用或將數據包傳遞到下一個對象的Linux路由棧。解密需要的密鑰編碼在IPsec首部,這樣我們不需要在ingress上使用映射查找來定位解密密鑰。

    在egress上,會首先對目的地址執行映射查找來缺點該報文是否被加密,如果被加密,則找出目的節點上可用的密鑰。在選出的節點上挑選最近使用的可用的密鑰,並將報文標記為加密。然后改報文會傳遞到Linux xfrm層執行加密。當接收到現在加密的報文時,它被傳遞到下一層,或通過發送到Linux 棧進行路由,或(如果正在使用overlay)直接執行尾部調用。

  • socket layer Enforcement:socket layer Enforcement會使用兩個鈎子,socket 操作鈎子和socket 發送/接收鈎子來監控並附加到所有與Cilium管理的endpoint相關的TCP socket,包括L7代理。socket操作鈎子會識別要加速的候選套接字,這些候選套接字包括所有的本地節點連接(endpoint到endpoint)以及所有到Cilium代理的連接。這些標識的連接將會包含所有由socket 發送/接收鈎子處理的消息,並且使用sockmap快速重定向進行加速。快速重定向保證Cilium中實現的所有策略對於關聯的socket/endpoint映射均有效,並假設它們會直接向對端socket發送消息。sockmap send/recv鈎子確保消息不會被上面提到的任何對象處理。

  • L7策略:L7策略對象將代理的流量重定向到一個Cilium用戶空間代理實例中。Cilium使用一個Envoy作為它的用戶空間代理。Envoy要么轉發流量,要么會根據配置的L7策略生成拒絕消息。

Cilium通過連接這些組件實現了靈活高效的數據路徑。下面將展示連接單個節點上的endpoint可能存在的數據流(進入一個endpoint以及endpoint到網絡設備)。在每種情況下,都會通過一個額外的圖顯示啟用socket layer Enforcement時的可用的TCP加速路徑。

Endpoint到Endpoint

首先展示的是本地endpoint到endpoint的數據流,在engress和ingress上使用了L7策略。緊跟着展示了啟用socket layer Enforcement時相同endpoint到endpoint的數據流走向。通過對TCP流量啟用socket layer Enforcement,發起連接的握手將遍歷endpoint策略對象,直到TCP的狀態變為ESTABLISHED。最后只有L7策略對象允許之后,連接狀態才能變為ESTABLISHED。

../_images/cilium_bpf_endpoint.svg

從Endpoint出站(Egress from Endpoint)

下面展示了本地endpoint使用overlay網絡進行出站的場景。overlay網絡流量通過與overlay對應的Linux網絡接口進行轉發。默認的overlay接口稱為cilium_vxlan。與上面類似,通過啟用socket layer Enforcement並使用L7代理可以避免在TCP通信的endpoint和L7策略之間運行endpoint策略塊。L3加密塊可以在啟用時加密報文。

../_images/cilium_bpf_egress.svg

入站到Endpoint(Ingress to Endpoin)

最后展示了使用overlay網絡時入站到endpoint的場景。與上面類似,通過啟用socket layer Enforcement可以避免在代理和endpoint socket之間遍歷策略集。如果接收到的報文被加密,則首先需要進行解密,並使用正常流程處理。

../_images/cilium_bpf_ingress.svg

基於veth的數據路徑和基於ipvlan的數據路徑的對比

|基於ipvlan的數據路徑目前僅在技術預覽中,用於實驗目的。該限制會在后續的Cilium發布中移除。

默認的Cilium CNI運行在基於veth的數據路徑模式下,由於所有的BPF程序都由Cilium在主機網絡命名空間之外進行管理,因此使用該模式可以獲得更大的靈活性,這樣容器就可以被授予其命名空間(如CAP_NET_ADMIN)的特權,而不會影響安全性(因為容器無法訪問主機中的BPF enforcement點)。鑒於BPF程序是從主機的網絡名稱空間附加的,BPF也能夠接管並有效地管理本地容器到主機之間的轉發邏輯。但由於veth模式下,網絡棧內部在處理從一個veth設備到位於另一個網絡命名空間中的對端設備時需要重新遍歷網絡棧,因此會造成延遲。當在本地Cilium endpoint間進行通信時,這種出站到入站的轉變需要執行兩次,對於正在到達或從主機發送出去的數據包,則為一次。

對於更具延遲優化的數據路徑,Cilium CNI還支持ipvlan L3/L3S模式,但存在大量限制。為了支持老的且不存在ipvlan發夾模式的內核,Cilium會在tc egress層將BPF程序附加到位於容器的網絡命名空間內的slave設備上,意味着這種數據路徑模式只能用於使用非CAP_NET_ADMIN 和CAP_NET_RAW特權運行的容器。ipvlan使用內部轉發邏輯直接進行slave-to-slave或slave-to-master的重定向,因此BPF程序本身不會執行到設備的轉發。由於網絡棧不需要像基於veth的數據路徑一樣在處理外部報文時重新遍歷,因此能夠更有效地切換命名空間。主機到容器網絡命名空間的切換直接發生在L3層,在后續的ingress處理中無需排隊和重新調度。在本地endpoint之間通信的情況下,會執行一次egress-to-ingress的且華北,而不必執行兩次。

目前的實現中,Cilium的ipvlan模式還有很多限制需要在接下來的工作中解決:目前還無法啟用NAT64以及通過代理啟用L7策略enforcement。當前未啟用到本地endpoint的服務負載平衡以及容器到主機的本地通信。如果需要使用這些功能,僅以使用基於veth的數據路徑模式。

Cilium的CNI ipvlan模式運行在Cilium daemon中,例如--datapath-mode=ipvlan --ipvlan-master-device=bond0,后者通常指定了物理網絡設備,同時也作為ipvlan的master設備。注意在ipvlan 數據路徑模式在kubernetes中部署在L3S模式下。確保有一個穩定運行內核,包括以下ipvlan修復:d5256083f62e

更多BPF的特性參見 BPF and XDP Reference Guide,可以在 Envoy 章節了解如何擴展L7策略。

BPF 映射的限制

所有創建的BPF映射都有上限限制。超出限制的插入將會失敗,從而限制了數據路徑的可伸縮性。下表展示了映射的默認值。每個限制都可以在源代碼中進行修改,如果需要,可以根據請求添加配置選項。

Map Name Scope Default Limit Scale Implications
Connection Tracking node or endpoint 1M TCP/256K UDP Max 1M concurrent TCP connections, max 256K expected UDP answers
Endpoints node 64k Max 64k local endpoints + host IPs per node
IP cache node 512K Max 256K endpoints (IPv4+IPv6), max 512k endpoints (IPv4 or IPv6) across all clusters
Load Balancer node 64k Max 64k cumulative backends across all services across all clusters
Policy endpoint 16k Max 16k allowed identity + port + protocol pairs for specific endpoint
Proxy Map node 512k Max 512k concurrent redirected TCP connections to proxy
Tunnel node 64k Max 32k nodes (IPv4+IPv6) or 64k nodes (IPv4 or IPv6) across all clusters

kubernetes集成

下圖顯示了kube-proxy安裝的iptables規則和Cilium安裝的iptables規則的集成。

../_images/kubernetes_iptables.svg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM