跨主機容器網絡方案

跨主機容器網絡方案

在Kubernetes體系中,Kubernetes網絡模型設計的一個基本原則:每個Pod都擁有一個獨立的IP地址,而且假定所有的Pod都在一個可以直接聯通的、扁平的網絡空間中,不管他們是否運行在同一個Node(宿主機)中,都可以直接通過對方的IP進行訪問。也就是說Kubernetes默認是要求各個Node之間的容器網絡能夠互通,但Kubernetes本身不提供跨主機的容器網絡方案。
目前,爲容器設置Overlay網絡是最主流的跨主機容器網絡方案。在Kubernetes平臺,建議通過CNI插件的方式部署容器網絡。
CNI(Container Network Interface,容器網絡接口)是CNCF基金會下的一個項目,有一組用於配置容器的網絡接口的規範和庫組成,現在已經被Kubernetes、rkt、Mesos等項目採納,比較成熟。一個容器可以同時通過綁定多個CNI網絡插件來加入到多個網絡中。
下面介紹一下幾種常用的網絡方案:

1、Flannel

Flannel是由CoreOS公司爲Kubernetes集羣設計的一個Overlay網絡方案,通過以下兩種功能來實現Node上容器直接網絡互通:

  • 爲每一臺Node的docker0網橋設置一個獨立不衝突的IP地址池
  • 爲各Node的docker0虛擬網絡建立一個覆蓋網絡(Overlay Network),通過這個覆蓋網絡,將數據包原封不動地傳遞到目標容器中
    下圖是Flanell網絡模型的數據轉發流程:
    在這裏插入圖片描述
    Flannel使用Kubernetes API或Etcd存儲網絡配置數據、子網分配及其他輔助信息。對於跨主機容器之間網絡數據包的轉發,Flannel支持一下之中模式:
  • hostgw是最簡單的backend,它的原理非常簡單,直接添加路由,將目的主機當做網關,直接路由原始封包。所有的主機都在同一個局域網內,保證二層網絡連通。
  • udp:和hostgw不同的是,udp backend並不會將從etcd中監聽到的事件裏所包含的lease信息作爲路由寫入主機中。封包解包是在用戶態和內核態交互處理,CPU性能有所損耗。
  • VxLAN:vxlan和上文提到的udp backend的封包結構是非常類似的,不同之處是多了一個vxlan header,以及原始報文中多了個二層的報頭。封包解包在內核態處理,提高數據包處理速率。

2、Calico

Calico是由Tigera公司開發的基於BGP協議的網絡方案,和其他虛擬網絡最大的不同是,它沒有采用 overlay 網絡做報文的轉發,提供了純 3 層的網絡模型。
Calico系統架構如圖:
在這裏插入圖片描述
組件介紹:

  • Felix:Calico Agent,運行在每個Node節點上,負責爲容器設置網絡資源(IP地址、路由規則、Iptables等),保證跨主機的容器網絡互通。
  • Etcd:提供後端存儲。
  • BGP Client(BIRD):負責把Felix寫入kernel的路由信息通過BGP協議廣播到Calico網絡中。
  • BGP Route Reflector(BIRD):一般在大規模部署時採用,與所有節點互聯的mesh模式不同,通過一個或多個BGP Route Reflector來完成集中式的路由分發。
  • CalicoCtl:Calico的命令行管理工具。
    Calico保證所有容器之間的數據流量都是通過IP路由的方式完成互聯互通的。Calico節點組網可以直接利用數據中心的網絡結構(L2或L3),不需要額外的NAT、隧道或者Overlay Network,沒有額外的封包解包,能夠節約CPU運算且提高網絡效率。

3、Macvlan

Macvlan是Linux Kernel的特性之一,通過Macvlan配置的容器網絡與主機網絡屬於一個局域網,並且容器有自己獨立的IP地址,可以直接訪問整個局域網內部,無需進行地址轉換,這是一種高效的虛擬網絡技術。這種模式的容器網絡就類似於我們的VM網絡。

4、Linen(基於Open vSwitch的Overlay網絡方案)

Open vSwitch是一個開源的虛擬交換機,類似傳統的Linux Bridge,Kubernetes主要是建立L3到L3的隧道,即OVS的Tunnel模式。
Linen CNI插件通過Flax daemon和Linen CNI這兩個組件完成OVS網絡的配置:

  • Flax daemon:在每臺Node上運行,有新節點加入時會自動將其加入當前的Overlay網絡中。
  • Linen CNI:由Kubelet調用爲容器提供網絡設置。

5、直接路由

就目前Docker自身默認的網絡來說,單臺主機上的不同Docker容器可以藉助docker0網橋直接通信,這沒毛病,而不同主機上的Docker容器之間只能通過在主機上用映射端口的方法來進行通信,有時這種方式會很不方便,甚至達不到我們的要求,因此位於不同物理機上的Docker容器之間直接使用本身的IP地址進行通信很有必要。再者說,如果將Docker容器起在不同的物理主機上,我們不可避免的會遭遇到Docker容器的跨主機通信問題。因此我們可以在各Node上設置路由規則,可以將沒有Node上的容器網橋和Node的匹配關係直接配置在Linux的路由表中,這樣不同節點的容器就可以根據路由表直接找到目的容器所在的Node,實現通信。
在集羣主機數量較多時,我們需要維護的路由表信息太多,會帶來很大的工作量,並且只要由新Node加入,都需要更改所有主機的路由表。爲了能夠自動完成各Node之間的docker0的路由規則配置,我們通常使用動態路由發現協議來完成。常用的動態路由協議:RIP、BGP、OSPF等

6、幾種方案對比

屬性 Flannel Calico macvlan Open vSwitch 直接路由
方案特性 通過虛擬設備flannel0實現對docker0的管理 基於BGP協議的純三層網絡方案 基於Linux Kernel的macvlan技術 基於隧道的虛擬路由器技術 基於Linux Kernel的vRouter技術
對底層網絡的要求 三層互通 三層互通 二層互通 三層互通 二層互通
配置難易程度 簡單;基於etcd 簡單;基於etcd 簡單;直接使用宿主機網絡,需要仔細規劃IP地址範圍 複雜;需手工配置各節點的Bridge 簡單;使用宿主機vRouter功能,需要仔細規劃每個Node的IP地址範圍
網絡性能 host-gw > VxLAN > UDP BGP性能損失小;IPIP模式較小 性能損失可忽略 性能損失較小 性能損失較小
網絡聯通性限制 在不支持BGP協議的網絡環境下無法使用 基於macvlan的容器無法與宿主機網路通信 在無法實現大二層互通的網絡環境下無法使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章