天天看點

Rancher v1.2:網絡架構解讀

在之前的Rancher版本上,使用者時常抱怨Rancher的網絡隻有IPsec,沒有其他選擇。而容器社群的發展是十分迅猛的,各種容器網絡插件風起雲湧,欲在江湖中一争高下。Rancher v1.2版本中與時俱進,對之前的網絡實作進行了改造,支援了CNI标準,除IPsec之外又實作了呼聲比較高的VXLAN網絡,同時增加了CNI插件管理機制,讓我們可以hacking接入其他第三方CNI插件。本文将和大家一起解讀一下Rancher v1.2中網絡的實作。

Rancher-net CNI化

以最簡單最快速方式部署Rancher并添加Host,以預設的IPsec網絡部署一個簡單的應用後,進入應用容器内部看一看網絡情況,對比一下之前的Rancher版本:

<a href="https://s2.51cto.com/wyfs02/M02/8E/24/wKioL1i2vD6j8N9gAACdf4KbaMY041.jpg" target="_blank"></a>

我們最直覺的感受便是,網卡名從eth0到eth0@if8有了變化,原先網卡多IP的實作也去掉了,變成了單純的IPsec網絡IP。這其實就引來了我們要探讨的内容,雖然網絡實作還是IPsec,但是rancher-net元件實際上是已經基于CNI标準了。最直接的證明就是看一下,rancher-net鏡像的Dockerfile:

<a href="https://s3.51cto.com/wyfs02/M00/8E/26/wKiom1i2vK-wqUWAAABkMxmMf14044.jpg" target="_blank"></a>

熟悉CNI規範的夥伴都知道/opt/cni/bin目錄是CNI的插件目錄,bridge和loopback也是CNI的預設插件,這裡的rancher-bridge實際上和CNI原生的bridge沒有太大差别,隻是在幂等性健壯性上做了增強。而在IPAM也就是IP位址管理上,Rancher實作了一個自己的rancher-cni-ipam,它的實作非常簡單,就是通過通路rancher-metadata來擷取系統給容器配置設定的IP。Rancher實際上Fork了CNI的代碼并做了這些修改,https://github.com/rancher/cni。這樣看來實際上,rancher-net的IPsec和Vxlan網絡其實就是基于CNI的bridge基礎上實作的。 

在解釋rancher-net怎麼和CNI融合之前,我們需要了解一下CNI bridge模式是怎麼工作的。舉個例子,假設有兩個容器nginx和mysql,每個容器都有自己的eth0,由于每個容器都是在各自的namespace裡面,是以互相之間是無法通信的,這就需要在外部建構一個bridge來做二層轉發,容器内的eth0和外部連接配接在容器上的虛拟網卡建構成對的veth裝置,這樣容器之間就可以通信了。其實無論是docker的bridge還是cni的bridge,這部分工作原理是差不多的,如圖所示:

<a href="https://s1.51cto.com/wyfs02/M01/8E/26/wKiom1i2vL_TRkuOAABvM6R6Ht4871.jpg" target="_blank"></a>

那麼我們都知道CNI網絡在建立時需要有一個配置,這個配置用來定義CNI網絡模式,讀取哪個CNI插件。在這個場景下也就是cni bridge的資訊,這個資訊rancher是通過rancher-compose傳入metadata來控制的。檢視ipsec服務的rancher-compose.yml可以看到,type使用rancher-bridge,ipam使用rancher-cni-ipam,bridge網橋則複用了docker0,有了這個配置我們甚至可以随意定義ipsec網絡的CIDR,如下圖所示:

<a href="https://s2.51cto.com/wyfs02/M00/8E/24/wKioL1i2vNKC7ok6AABFlv7E-yI826.jpg" target="_blank"></a>

ipsec服務實際上有兩個容器:一個是ipsec主容器,内部包含rancher-net服務和ipsec需要的charon服務;另一個sidekick容器是cni-driver,它來控制cni bridge的建構。兩端主機通過IPsec隧道網絡通信時,資料包到達實體網卡時,需要通過Host内的Iptables規則轉發到ipsec容器内,這個Iptables規則管理則是由network-manager元件來完成的,https://github.com/rancher/plugin-manager。其原理如下圖所示(以IPsec為例):

<a href="https://s4.51cto.com/wyfs02/M01/8E/24/wKioL1i2vOnQISgoAAB_kJUOnQE318.jpg" target="_blank"></a>

整體上看cni ipsec的實作比之前的ipsec精進了不少,而且也做了大量的解耦工作,不單純是走向社群的标準,之前大量的Iptables規則也有了很大的減少,性能上其實也有了很大提升。

Rancher-net vxlan的實作

那麼rancher-net的另外一個backend vxlan又是如何實作的呢?我們需要建立一套VXLAN網絡環境來一探究竟,預設的Cattle引擎網絡是IPsec,如果修改成VXLAN有很多種方式,可以參考我下面使用的方式。

首先,建立一個新的Environment Template,把Rancher IPsec禁用,同時開啟Rancher VXLAN,如下圖所示:

<a href="https://s1.51cto.com/wyfs02/M02/8E/26/wKiom1i2vQGCnzpzAABg_nJBaIM694.jpg" target="_blank"></a>

然後,我們建立一個新的ENV,并使用剛才建立的模版Cattle-VXLAN,建立完成後,添加Host即可使用。如下圖所示:

<a href="https://s1.51cto.com/wyfs02/M01/8E/26/wKiom1i2vRCQ0j2AAABGfriHdZs777.jpg" target="_blank"></a>

以分析IPsec網絡實作方式來分析VXLAN,基本上會發現其原理大緻相同。同樣是基于CNI bridge,使用rancher提供的rancher-cni-bridge、rancher-cni-ipam,網絡配置資訊以metadata方式注入。差別就在于rancher-net容器内部,rancher-net激活的是vxlan driver,它會生成一個vtep1042裝置,并開啟udp 4789端口,這個裝置基于udp 4789建構vxlan overlay的兩端通信,對于本機的容器通過eth0走bridge通信,對于其他Host的容器,則是通過路由規則轉發到vtep1042裝置上,再通過overlay到對端主機,由對端主機的bridge轉發到相應的容器上。整個過程如圖所示:

<a href="https://s1.51cto.com/wyfs02/M02/8E/24/wKioL1i2vSDTqTXaAABs-6bJz7U371.jpg" target="_blank"></a>

總結

容器網絡是容器雲平台中很重要的一環,對于不同的規模、不同的安全要求,會有不同的選型。Rancher的預設網絡改造成了CNI标準,同時也會支援其他第三方CNI插件,結合Rancher獨有的Environment Template功能,使用者可以在一個大叢集中的每個隔離環境内,建立不同的網絡模式,以滿足各種業務場景需求,這種管理的靈活性是其他平台沒有的。

本文轉自 RancherLabs 51CTO部落格,原文連結:http://blog.51cto.com/12462495/1902531

繼續閱讀