容器網絡方案分類:
按照來源分類:
1、 docker原生網絡方案
2、 第三方網絡方案
按照方案是否提供跨主機網絡:
1、 單主機網絡方案
2、 跨主機網絡方案
(
容器網絡庫及容器網絡模型(Container Network Model):
libnetwork 是 docker 容器網絡庫,最核心的內容是其定義的 Container Network Model (CNM),這個模型對容器網絡進行了抽象,由以下三類組件組成:
1、 Sandbox
容器網絡棧。Linux network namespace是標准實現。包括容器interface、路由表、dns設置。
2、 Network
常見的實現,比如linux bridge。
3、 Endpoint
作用是聯通sandbox和network。
例子:
1、 sandbox,由 Network Namespace 實現,每個容器有自己的network namespace
2、 network,由linux bridge docker0和br-5d863e9f78b6實現。
3、 endppont,由三對veth pair實現。
網絡方案介紹:
Bridge
1、 linux bridge,linux Bridge(網橋)是工作於二層的虛擬網絡設備,功能類似於物理的交換機。
2、 veth pair,vth pair 是一對虛擬網卡,從一張veth網卡發出的數據包可以直接到達它的peer veth,兩者之間存在着虛擬鏈路。
3、 特點:
1) container獨立的network namespace,用veth pair連接到host上的linux bridge
2) 各bridge網絡彼此獨立,不同網絡不聯通,因此同一host上的不同網絡下的container不通,不同host上的container更不通。加上路由是否就可以通了?
Docker Overlay
特點
1)各container獨立的network namespace
2)各host上新起同樣的network namespace,里面生成同樣的overlay bridge
3)container通過veth pair連到各host上的overlay bridge
4)各host上的overlay bridge通過vxlan設備建立overlay 網絡
5)為了使各container能訪問外網,overlay網絡方案同時在各主機上創建了bridge用於各container訪問外部網絡
6)使用consul存儲狀態數據
7)提供dns服務
Macvlan
macvlan 本身是 linxu kernel 模塊,其功能是允許在同一個物理網卡上配置多個 MAC 地址,即多個 interface,每個 interface 可以配置自己的 IP。macvlan 本質上是一種網卡虛擬化技術,Docker 用 macvlan 實現容器網絡就不奇怪了。
1、網卡虛擬化技術,允許一塊網卡配置多個mac地址,即多個interface
2、本質還是單主機網絡。需要人工在各host上創建network
3、同時在使用的時候,手動為各container分配靜態ip地址,且要避免ip沖突
4、不提供dns服務
5、獨占host網卡。為避免這種狀況,使用網卡虛擬化技術,將一塊網卡上配置上多個sub-interface
6、需要真實存在的網關
Flannel
本質上是把docker默認的相互隔離的docker0網絡連起來組成了一個更大的網絡,實現了跨主機通信,所以就失去了網絡隔離性。
flannel 沒有創建新的 docker 網絡,而是直接使用默認的 bridge 網絡。同一主機的容器通過 docker0 連接,跨主機流量通過 flannel.1 轉發。
overlay backend方案:
1、各主機上的interface flanne.1
2、etcd管理各主機上的subnet
3、不提供dns服務
Vxlan backend方案:
1、通過vxlan封裝解決不同host上的網絡聯通
host-gw backend方案:
1、通過路由表的方式解決聯通性
Weave
weave 是 Weaveworks 開發的容器網絡解決方案。weave 創建的虛擬網絡可以將部署在多個主機上的容器連接起來。對容器來說,weave 就像一個巨大的以太網交換機,所有容器都被接入這個交換機,容器可以直接通信,無需 NAT 和端口映射。除此之外,weave 的 DNS 模塊使容器可以通過 hostname 訪問。
weave 運行了三個容器:
weave 是主程序,負責建立 weave 網絡,收發數據 ,提供 DNS 服務等。
weaveplugin 是 libnetwork CNM driver,實現 Docker 網絡。
weaveproxy 提供 Docker 命令的代理服務,當用戶運行 Docker CLI 創建容器時,它會自動將容器添加到 weave 網絡。
1、首先要將不同node加入同一個weave網絡
2、bridge + open vswtich,分工不同,bridge負責把容器接入weave網絡,open vswitch負責在主機間的vxlan數據轉發。
3、bridge負責將docker網絡接入weave網絡,open vswitch負責vxlan隧道收發數據
4、weave網絡默認使用一個大subnet
Calico
Calico 是一個純三層的虛擬網絡方案,Calico 為每個容器分配一個 IP,每個 host 都是 router,把不同 host 的容器連接起來。與 VxLAN 不同的是,Calico 不對數據包做額外封裝,不需要 NAT 和端口映射,擴展性和性能都很好。
1、三層網絡虛擬方案
2、實現方式的主要技術是路由表配置,需要etcd
3、可以使用network policy
網絡方案對比
網絡模型
跨主機網絡意味着將不同主機上的容器用同一個虛擬網絡連接起來。這個虛擬網絡的拓撲結構和實現技術就是網絡模型。
Docker overlay 如名稱所示,是 overlay 網絡,建立主機間 VxLAN 隧道,原始數據包在發送端被封裝成 VxLAN 數據包,到達目的后在接收端解包。
Macvlan 網絡在二層上通過 VLAN 連接容器,在三層上依賴外部網關連接不同 macvlan。數據包直接發送,不需要封裝,屬於 underlay 網絡。
Flannel 我們討論了兩種 backend:vxlan 和 host-gw。vxlan 與 Docker overlay 類似,屬於 overlay 網絡。host-gw 將主機作為網關,依賴三層 IP 轉發,不需要像 vxlan 那樣對包進行封裝,屬於 underlay 網絡。
Weave 是 VxLAN 實現,屬於 overlay 網絡。
各方案的網絡模型描述如下:
|
Docker Overlay
|
Macvlan
|
Flannel vxlan
|
Flannel host-gw
|
weave
|
Calico
|
---|---|---|---|---|---|---|
網絡模型 | Overlay:VxLAN | Underlay | Overlay:VxLAN | Underlay:純三層 | Overlay:VxLAN | Unerlay:純三層 |
Distributed Store
Docker Overlay、Flannel 和 Calico 都需要 etcd 或 consul。Macvlan 是簡單的 local 網絡,不需要保存和共享網絡信息。Weave 自己負責在主機間交換網絡配置信息,也不需要 Distributed Store。
|
Docker Overlay
|
Macvlan
|
Flannel vxlan
|
Flannel host-gw
|
weave
|
Calico
|
---|---|---|---|---|---|---|
Distributed Store |
Yes | No | Yes | Yes | No | Yes |
IPAM
Docker Overlay 網絡中所有主機共享同一個 subnet,容器啟動時會順序分配 IP,可以通過 --subnet 定制此 IP 空間。
Macvlan 需要用戶自己管理 subnet,為容器分配 IP,不同 subnet 通信依賴外部網關。
Flannel 為每個主機自動分配獨立的 subnet,用戶只需要指定一個大的 IP 池。不同 subnet 之間的路由信息也由 Flannel 自動生成和配置。
Weave 的默認配置下所有容器使用 10.32.0.0/12 subnet,如果此地址空間與現有 IP 沖突,可以通過 --ipalloc-range 分配特定的 subnet。
Calico 從 IP Pool(可定制)中為每個主機分配自己的 subnet。
|
Docker Overlay
|
Macvlan
|
Flannel vxlan
|
Flannel host-gw
|
weave
|
Calico
|
---|---|---|---|---|---|---|
IPAM | 單一大subnet | 自定義 | 每個host一個subnet | 每個host一個subnet | 單一大subnet | 每個host一個subnet |
連通與隔離
同一 Docker Overlay 網絡中的容器可以通信,但不同網絡之間無法通信,要實現跨網絡訪問,只有將容器加入多個網絡。與外網通信可以通過 docker_gwbridge 網絡。
Macvlan 網絡的連通或隔離完全取決於二層 VLAN 和三層路由。
不同 Flannel 網絡中的容器直接就可以通信,沒有提供隔離。與外網通信可以通過 bridge 網絡。
Weave 網絡默認配置下所有容器在一個大的 subnet 中,可以自由通信,如果要實現隔離,需要為容器指定不同的 subnet 或 IP。與外網通信的方案是將主機加入到 weave 網絡,並把主機當作網關。
Calico 默認配置下只允許位於同一網絡中的容器之間通信,但通過其強大的 Policy 能夠實現幾乎任意場景的訪問控制。
性能
性能測試是一個非常嚴謹和復雜的工程,這里我們只嘗試從技術方案的原理上比較各方案的性能。
最朴素的判斷是:Underlay 網絡性能優於 Overlay 網絡。
Overlay 網絡利用隧道技術,將數據包封裝到 UDP 中進行傳輸。因為涉及數據包的封裝和解封,存在額外的 CPU 和網絡開銷。雖然幾乎所有 Overlay 網絡方案底層都采用 Linux kernel 的 vxlan 模塊,這樣可以盡量減少開銷,但這個開銷與 Underlay 網絡相比還是存在的。所以 Macvlan、Flannel host-gw、Calico 的性能會優於 Docker overlay、Flannel vxlan 和 Weave。
Overlay 較 Underlay 可以支持更多的二層網段,能更好地利用已有網絡,以及有避免物理交換機 MAC 表耗盡等優勢,所以在方案選型的時候需要綜合考慮。
總結起來,各網絡方案的重點區別在於:
1、 是用overlay網絡技術聯通各容器網絡,還是純unerlay技術+路由
2、 再就是overlay技術網絡之間的差別,以及各undeylay技術方案之間的差別
兄弟公司底層網絡技術選型:
1、兄弟公司1:calico
2、兄弟公司2:open shiftsdn(open shift定制的SDN網絡方案,可類比waeve)
calico於waeve對比:
1)技術復雜度:calico < waeve,calico主要基於簡單的路由技術,waeve主要基於復雜的SDN技術。
2)性能:calico > waeve,calico不需要對數據包進行二次封裝解封,waeve需要對數據包進行二次封裝解封。
3)擴展性:calico < waeve,waeve屬於overlay網絡,可以支持更多的網段。
從技術復雜度和性能方面看,calico均優於waeve。從使用場景看,容器雲平台只限於內部使用,不考慮接入外部用戶,隔離及擴展性不是重點,與兄弟公司1相似。因此,底層網絡方案建議采用calico。