1. 程式人生 > 其它 >k8s網路詳解

k8s網路詳解

  • 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的網橋一樣。