天天看點

螞蟻金服Docker網絡技術實踐

以下内容根據演講ppt以及現場分享整理而成。

主要内容提綱

一、docker網絡分析

二、docker網絡插件開發

三、螞蟻金服的網絡插件實踐

主要介紹三種docker網絡,bridge網絡、docker原生的overlay網絡以及weave網絡,在這裡主要分享一下這些網絡的架構或者說是結構。

docker bridge網絡

bridge網絡可能是大家最熟悉的網絡,如下圖所示,hosta和hostb是兩個主控端,docker運作起來就将在主控端上建立docker0的網橋作為容器的開關。

螞蟻金服Docker網絡技術實踐

在網橋建立完成之後,同一個主控端上的不同容器之間就可以通過網橋的轉發功能進行通信,但是位于不同主控端器上的容器無法直接進行通信,他們可以通過iptables snat/dnat和容器外網絡進行通信。bridge網絡結構比較簡單,但是缺點是不同主控端之間的容器其實并不在一個共同的網絡中,不同主控端之間的容器無法進行直接的通信。

docker overlay網絡

對于應用而言,如果要部署在docker中,基本上都需要面對跨主機互聯的問題,docker提供了原生的overlay網絡,對docker具有良好的支援性。

螞蟻金服Docker網絡技術實踐

這裡簡單提一下vxlan協定,下圖中的inner enthernet frame是由容器發出的封包,在經過封包一層層封裝以後,最後以udp的方式發送出去。

螞蟻金服Docker網絡技術實踐

在overlay網絡中,每個容器會有兩張網卡,其中一張網卡用于與外部網絡進行通信,向外部網絡傳輸的資料會經由eth1網卡,并通過docker_gwbridge發送出去。如果是不同主控端之間的容器想要通信的話,資料将會通過eth0發送出去。每個overlay網絡有獨立namespace和br0網橋,在節點元件叢集進行通訊時,采用的使用gossip協定來管理節點成員關系、并且通過廣播l3miss處理二層arp的互動。而不同網橋上的vxlan裝置的作用就是幫助不同主控端的容器通過vxlan隧道直接通信。

docker weave網絡

weave網絡的易用性比較高,是以更容易上手,而且目前而言,weave網絡的産品系也是比較完善的。weave網絡有兩種實作方式,一種是使用者動态的封裝實作,另外一種是核心态的封裝實作,這裡主要介紹核心态的封裝實作。

在下圖中weave router中有這樣的一個插件,這個插件主要實作了兩個功能,一個是幫助與其他的主控端建立gossip協定的連結,進而建立叢集的拓撲關系。另外一點就是幫助跨主控端的容器通過datapath和vxlan隧道進行通信。

螞蟻金服Docker網絡技術實踐

小結

這三種網路有一些共同點,首先需求是共同的,都要滿足容器的跨主機通信的需求,同時arp的廣播會增加網絡負擔,阿裡雲自己的産品上這一點就被解決了,這三種網絡使用的gossip協定的運維複雜度,而且無法适應多種docker網絡環境,難以滿足高性能的網絡業務。

二、docker網絡插件架構和開發

在介紹阿裡雲的插件建構之前,先給簡單大家介紹docker網絡插件架構和開發通用的cnm模型。如下圖所示,這裡有三個docker容器,這裡主要有三個概念sandbox、endpoint和network。sandbox可以了解為docker内部運作的namespace,也就是隔離的網絡配置環境;endpoint其實是虛拟的網卡,它隸屬于某一個network的通訊端口,多個endpoint也可以在一個sandbox中共存;而network就是所有接在節點裡面的endpoint,也就是一個唯一的、可識别的endpoint組。在同一個network中的endpoint可以互相通訊,而且你可以建立一個frontend和backendnetwork,然後這兩個network是完全隔離的。

螞蟻金服Docker網絡技術實踐

在了解這三個概念之後,我們看一下這些概念是如何在流程中串聯起來的。docker在啟動起來時會起到controller這樣的角色,當建立network的時候,就會調用newcontroller函數,之後再調用newsandbox建立namespace,之後還會調用newendpoint,使得插件自己處理如何去建立endpoint,最後将調用join的方法,建立sandbox和endpoint的關系,這時候就相當于容器中有了網卡。

螞蟻金服Docker網絡技術實踐

目前docker已經提供了開發“利器”,也就是docker官方提供的開發架構。大家在開發時隻需要導入幾個包,當容器運作起來,整個插件的服務也就開始運作了,後面需要實作的就是幾個接口了。也就是相當于大家不用從零開始造輪子了。

螞蟻金服Docker網絡技術實踐

docker和plugin是如何通信有三種方式:.sock/.spec/.json。一般大家使用的都是sock的方式。目前螞蟻金服使用的都是容器的方式,這樣的方式既可以很友善地對它進行更新,也可以很友善地進行管理。

三、螞蟻金服網絡插件

vlan driver

vlan driver其實是最接近于現有實體網絡的驅動插件。在這樣的方案中,主控端的管控流量和容器的流量被隔離在兩個不同的vlan中,采用了ovs bridge,并且将容器接入到這個ovs bridge中。為了避免arp廣播風暴并且緩解交換機pps的巨大壓力,采用了arp帶回的政策和大二層的政策,也避免了容器mac位址表象對于交換機的影響。目前在大部分的企業都選擇了vlan的方式,因為它最适配現有實體網絡,對業務影響最小。

螞蟻金服Docker網絡技術實踐

sriov driver

sriov driver本質上也是vlan網絡,但是目前沒有采用ovs。因為有一些像db這樣的業務對于網絡的延遲有更高的要求,才産生了sriov driver。具體的做法就是将vf虛化出來,直接塞到容器裡面去,沿用現實場景中的bonding模式,使用雙活的bonding模式使得pf和vf兩邊都可以結合起來。

螞蟻金服Docker網絡技術實踐

vpc driver

業務上雲會有兩種選擇,一個是經典的雲環境,另外就是vpc的環境。如果大家使用的是vpc環境,就可以采用我們的這種vpc driver。其主要實作方式就是阿裡雲提供了自定義路由的方式,可以自定義vrouter上的路由,也就是自定義資料到達vrouter之後下一跳的路徑,如果是利用專線就可以實作和使用者中心的docker互聯。vpc driver非常适用于在阿裡雲的vpc上使用docker。

螞蟻金服Docker網絡技術實踐

vxlan driver

vxlan driver适用于在阿裡雲經典雲環境上面進行建構應用的場景。這個方案是比較完善的,它将slb,以及對内和對外的因素都考慮進去了。vxlan driver具有獨立的ipam,支援subnet,進行了macnat和arp帶回,是以在容器裡面看到的所有容器的mac位址都是一樣的。比較适用于在阿裡雲經典vm中運作多docker。

螞蟻金服Docker網絡技術實踐

smart nic driver

之前提到的方式都是在linux核心中完成的,是以消耗的是linux主機的能力,在千兆網絡環境下大家可能覺得不是問題,但是在萬兆網絡中,就會感覺到無法發揮出萬兆網絡真正的能力。由于沒有sriov網絡隔離,容器之間網絡的影響還是比較大的,另外在各種業務整合的時候,需要做流量管控的時候又将是性能消耗點。

螞蟻金服Docker網絡技術實踐

高性能網絡其實要做的就是類似一張智能網卡,用網卡對于協定封包進行加解封裝,然後将協定封包直接送到容器裡面,主控端性能沒有任何消耗,而且這樣對于智能網卡功能的擴充也非常容易,也不會影響主控端。實作了無論網卡如何,保證容器底層的網絡最優。