- Flannel: 最成熟、最簡單的選擇
- Calico: 性能好、靈活性最強,目前的企業級主流
- Canal: 將Flannel提供的網絡層與Calico的網絡策略功能集成在一起。
- Weave: 獨有的功能,是對整個網絡的簡單加密,會增加網絡開銷
- Kube-router: kube-router采用lvs實現svc網絡,采用bgp實現pod網絡.
- CNI-Genie:CNI-Genie 是一個可以讓k8s使用多個cni網絡插件的組件,暫時不支持隔離策略
k8s的容器虛擬化網絡方案大體分為兩種: 基於隧道方案和基於路由方案
一、隧道方案
flannel的 vxlan模式、calico的ipip模式都是隧道模式。
1、1隧道模式過程
隧道模式分為兩個過程:分配網段和封包/解包兩個過程
1.1.1分配網絡
宿主機利用etcd(etcd中維護ip)會為當前主機上運行的容器分配一個虛擬ip,並且宿主機上運行一個代理網絡進程agent,代理出入的數據包。
1.1.2封包/解包
宿主上的agent進程會改變容器的發出的數據包的源ip和目的ip,目的宿主機上的agent收到數據包進行拆包然后送到目的容器。
二、路由方案
flannel的host-gw模式,calico的bgp模式都是路由方案
1.1路由過程
真個路由過程分為分配網段、廣播路由兩個階段
1.1.1分配網段
類似隧道模式,每台宿主上的agent會從etcd中為每個容器分配一個虛ip。
1.1.2廣播路由
agent會在宿主機上增加一套路由規則,凡是目的地址是該容器的ip的就發往容器的虛擬網卡上,同時會通過BGP廣播協議將自己的虛擬ip發往集群中其他node節點,其他的node節點收到廣播同樣在本機創建一條路由規則:該虛擬ip的數據包發至他的宿主機ip上。
優缺點對比
由於隧道模式存在封包和拆包的過程而路由模式沒有,所以路由模式性能高於隧道模式;
隧道模式通過agent代理工作在ip層而路由模型工作在mac層下;
路由模式會因為路由表膨脹性能下降;
Calico簡單簡介
1 Calico是一個純三層的協議,為OpenStack虛機和Docker容器提供多主機間通信。Calico不使用重疊網絡比如flannel和libnetwork重疊網絡驅動, 2 它是一個純三層的方法,使用虛擬路由代替虛擬交換,每一台虛擬路由通過BGP協議傳播可達信息(路由)到剩余數據中心
Calico 架構
Calico 是一個三層的數據中心網絡方案,而且方便集成 OpenStack 這種 IaaS 雲架構,能夠提供高效可控的 VM、容器、裸機之間的通信。
1 結合上面這張圖,我們來過一遍 Calico 的核心組件: 2 3 Felix,Calico agent,跑在每台需要運行 workload 的節點上,主要負責配置路由及 ACLs 等信息來確保 endpoint 的連通狀態; 4 5 etcd,分布式鍵值存儲,主要負責網絡元數據一致性,確保 Calico 網絡狀態的准確性; 6 7 BGP Client(BIRD), 主要負責把 Felix 寫入 kernel 的路由信息分發到當前 Calico 網絡,確保 workload 間的通信的有效性; 8 9 BGP Route Reflector(BIRD), 大規模部署時使用,摒棄所有節點互聯的 mesh 模式,通過一個或者多個BGP Route Reflector來完成集中式的路由分發; 10 11 通過將整個互聯網的可擴展 IP 網絡原則壓縮到數據中心級別,Calico 在每一個計算節點利用Linux kernel實現了一個高效的vRouter來負責數據轉發而每個vRouter通過BGP 12 協議負責把自己上運行的 workload 的路由信息像整個 Calico 網絡內傳播 - 小規模部署可以直接互聯,大規模下可通過指定的 13 BGP route reflector 來完成。 14 15 這樣保證最終所有的 workload 之間的數據流量都是通過 IP 包的方式完成互聯的。
1 Calico 節點組網可以直接利用數據中心的網絡結構(支持 L2 或者 L3),不需要額外的 NAT,隧道或者 VXLAN overlay network。
如上圖所示,這樣保證這個方案的簡單可控,而且沒有封包解包,節約 CPU 計算資源的同時,提高了整個網絡的性能。
此外,Calico 基於 iptables 還提供了豐富而靈活的網絡 policy, 保證通過各個節點上的 ACLs 來提供 workload 的多租戶隔離、安全組以及其他可達性限制等功能。
Calico網絡方式(兩種)
1)IPIP
從字面來理解,就是把一個IP數據包又套在一個IP包里,即把 IP 層封裝到 IP 層的一個 tunnel,看起來似乎是浪費,實則不然。它的作用其實基本上就相當於一個基於IP層的網橋!一般來說,普通的網橋是基於mac層的,根本不需 IP,而這個 ipip 則是通過兩端的路由做一個 tunnel,把兩個本來不通的網絡通過點對點連接起來。ipip 的源代碼在內核 net/ipv4/ipip.c 中可以找到。
2)BGP
邊界網關協議(Border Gateway Protocol, BGP)是互聯網上一個核心的去中心化自治路由協議。它通過維護IP路由表或‘前綴’表來實現自治系統(AS)之間的可達性,屬於矢量路由協議。BGP不使用傳統的內部網關協議(IGP)的指標,而使用基於路徑、網絡策略或規則集來決定路由。因此,它更適合被稱為矢量性協議,而不是路由協議。BGP,通俗的講就是講接入到機房的多條線路(如電信、聯通、移動等)融合為一體,實現多線單IP,BGP 機房的優點:服務器只需要設置一個IP地址,最佳訪問路由是由網絡上的骨干路由器根據路由跳數與其它技術指標來確定的,不會占用服務器的任何系統。
1 每個主機上都部署了calico/node作為虛擬路由器,並且可以通過calico將宿主機組織成任意的拓撲集群。當集群中的容器需要與外界通信時, 2 就可以通過BGP協議將網關物理路由器加入到集群中,使外界可以直接訪問容器IP,而不需要做任何NAT之類的復雜操作。 3 4 當容器通過calico進行跨主機通信時,其網絡通信模型如下圖所示:
1 從上圖可以看出,當容器創建時,calico為容器生成veth pair,一端作為容器網卡加入到容器的網絡命名空間,並設置IP和掩碼,一端直接暴露在宿主機上, 2 並通過設置路由規則,將容器IP暴露到宿主機的通信路由上。於此同時,calico為每個主機分配了一段子網作為容器可分配的IP范圍,這樣就可以根據子網的 3 CIDR為每個主機生成比較固定的路由規則。 4 5 當容器需要跨主機通信時,主要經過下面的簡單步驟: 6 1)容器流量通過veth pair到達宿主機的網絡命名空間上。 7 2)根據容器要訪問的IP所在的子網CIDR和主機上的路由規則,找到下一跳要到達的宿主機IP。 8 3)流量到達下一跳的宿主機后,根據當前宿主機上的路由規則,直接到達對端容器的veth pair插在宿主機的一端,最終進入容器。 9 10 從上面的通信過程來看,跨主機通信時,整個通信路徑完全沒有使用NAT或者UDP封裝,性能上的損耗確實比較低。但正式由於calico的通信機制是完全基於三層的,這種機制也帶來了一些缺陷,例如: 11 1)calico目前只支持TCP、UDP、ICMP、ICMPv6協議,如果使用其他四層協議(例如NetBIOS協議),建議使用weave、原生overlay等其他overlay網絡實現。 12 2)基於三層實現通信,在二層上沒有任何加密包裝,因此只能在私有的可靠網絡上使用。 13 3)流量隔離基於iptables實現,並且從etcd中獲取需要生成的隔離規則,有一些性能上的隱患。
使用IPIP模式后的路由如下:
node1:
master1:
此模式還會在宿主機上生成虛擬網卡tunnel
node1:
master1:
如此,在node1上能ping 通master1的pod。兩個宿主機通過這個tunnel進行通信,就像Linux的網橋一樣。