Docker 跨主機網絡方案分析

PS:文章首發公眾號,歡迎大家關注我的公眾號:aCloudDeveloper,專注技術分享,努力打造干貨分享平臺,二維碼在文末可以掃,謝謝大家。

上篇文章介紹了容器網絡的單主機網絡,本文將進一步介紹多主機網絡,也就是跨主機的網絡。總結下來,多主機網絡解決方案包括但不限于以下幾種:overlay、macvlan、flannel、weave、cacico 等,下面將分別一一介紹這幾種網絡,

PS:本文僅從原理上對幾種網絡進行簡單的對比總結,不涉及太多的細節。

overlay

俗稱隧道網絡,它是基于 VxLAN 協議來將二層數據包封裝到 UDP 中進行傳輸的,目的是擴展二層網段,因為 VLAN 使用 12bit 標記 VLAN ID,最多支持 4094 個 VLAN,這對于大型云網絡會成為瓶頸,而 VxLAN ID 使用 24bit 來標記,支持多達 16777216 個二層網段,所以 VxLAN 是擴展了 VLAN,也叫做大二層網絡。

overlay 網絡需要一個全局的“上帝”來記錄它網絡中的信息,比如主機地址,子網等,這個上帝在 Docker 中是由服務發現協議來完成的,服務發現本質上是一個 key-value 數據庫,要使用它,首先需要向它告知(注冊)一些必要的信息(如網絡中需要通信的主機),然后它就會自動去收集、同步網絡的信息,同時,還會維護一個 IP 地址池,分配給主機中的容器使用。Docker 中比較有名的服務發現有 Consul、Etcd 和 ZooKeeper。overlay 網絡常用 Consul。

431521-20180429195031999-972865143.png

創建 overlay 網絡會創建一個 Linux bridge br0,br0 會創建兩個接口,一個 veth2 作為與容器的虛擬網卡相連的 veth pair,另一個 vxlan1 負責與其他 host 建立 VxLAN 隧道,跨主機的容器就通過這個隧道來進行通信。

為了保證 overlay 網絡中的容器與外網互通,Docker 會創建另一個 Linux bridge docker_gwbridge,同樣,該 bridge 也存在一對 veth pair,要與外圍通信的容器可以通過這對 veth pair 到達 docker_gwbridge,進而通過主機 NAT 訪問外網。

macvlan

macvlan 就如它的名字一樣,是一種網卡虛擬化技術,它能夠將一個物理網卡虛擬出多個接口,每個接口都可以配置 MAC 地址,同樣每個接口也可以配自己的 IP,每個接口就像交換機的端口一樣,可以為它劃分 VLAN。

macvlan 的做法其實就是將這些虛擬出來的接口與 Docker 容器直連來達到通信的目的。一個 macvlan 網絡對應一個接口,不同的 macvlan 網絡分配不同的子網,因此,相同的 macvlan 之間可以互相通信,不同的 macvlan 網絡之間在二層上不能通信,需要借助三層的路由器才能完成通信,如下,顯示的就是兩個不同的 macvlan 網絡之間的通信流程。

431521-20180429195117713-2028389175.png

我們用一個 Linux 主機,通過配置其路由表和 iptables,將其配成一個路由器(當然是虛擬的),就可以完成不同 macvlan 網絡之間的數據交換,當然用物理路由器也是沒毛病的。

flannel

flannel 網絡也需要借助一個全局的上帝來同步網絡信息,一般使用的是 etcd。

flannel 網絡不會創建新的 bridge,而是用默認的 docker0,但創建 flannel 網絡會在主機上創建一個虛擬網卡,掛在 docker0 上,用于跨主機通信。

431521-20180429195144515-388946315.png

組件方式讓 flannel 多了幾分靈活性,它可以使用二層的 VxLAN 隧道來封裝數據包完成跨主機通信,也可以使用純三層的方案來通信,比如 host-gw,只需修改一個配置文件就可以完成轉化。

weave

weave 網絡沒有借助服務發現協議,也沒有 macvlan 那樣的虛擬化技術,只需要在不同主機上啟動 weave 組件就可以完成通信。

創建 weave 網絡會創建兩個網橋,一個是 Linux bridge weave,一個是 datapath,也就是 OVS,weave 負責將容器加入 weave 網絡中,OVS 負責將跨主機通信的數據包封裝成 VxLAN 包進行隧道傳輸。

431521-20180429195213393-1209241662.png

calico

calico 是一個純三層的網絡,它沒有創建任何的網橋,它之所以能完成跨主機的通信,是因為它記住 etcd 將網絡中各網段的路由信息寫進了主機中,然后創建的一對的 veth pair,一塊留在容器的 network namespace 中,一塊成了主機中的虛擬網卡,加入到主機路由表中,從而打通不同主機中的容器通信。

431521-20180514165940183-1171083948.png

calico 相較其他幾個網絡方案最大優點是它提供 policy 機制,用戶可以根據自己的需求自定義 policy,一個 policy 可能對應一條 ACL,用于控制進出容器的數據包,比如我們建立了多個 calico 網絡,想控制其中幾個網絡可以互通,其余不能互通,就可以修改 policy 的配置文件來滿足要求,這種方式大大增加了網絡連通和隔離的靈活性。

總結

1、除了以上的幾種方案,跨主機容器網絡方案還有很多,比如:Romana,Contiv 等,本文就不作過多展開了,大家感興趣可以查閱相關資料了解。

2、跨主機的容器網絡通常要為不同主機的容器維護一個 IP 池,所以大多方案需要借助第三方的服務發現方案。

3、跨主機容器網絡按傳輸方式可以分為純二層網絡,隧道網絡(大二層網絡),以及純三層網絡。


我的公眾號 aCloudDeveloper 分享的內容包括但不限于云計算虛擬化、容器、OpenStack、K8S、霧計算、SDN、OVS、DPDK、Linux、Python、C/C++編程技術等內容,歡迎大家關注。

431521-20180429195432742-41921015.jpg

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451768.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中為什么使用上轉型和下轉型

為什么使用上轉型?因為當一個父類有很多子類,子類都重寫了父類的方法并加以使用。這時候,如果要在之前代碼讓你用其他子類來實現,就變得很簡單,只需要把A a new B();換成A a new C();(假設B和C都繼承了A&…

session和cache的區別

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 以前實現數據的緩存有很多種方法,有客戶端的Cookie,有服務器端的Session和Application。 其中Cookie是保存在客…

第四個

。 轉載于:https://www.cnblogs.com/wxy2000/p/9657823.html

26-- 轉換成小寫字母

文章目錄1.問題描述2.代碼詳情1.問題描述 實現函數 ToLowerCase(),該函數接收一個字符串參數 str,并將該字符串中的大寫字母轉換成小寫字母,之后返回新的字符串。 示例 1: 輸入: “Hello” 輸出: “hello” 示例 2:…

java守護線程和用戶線程的區別

Java中的線程可以分為兩類,即用戶線程和守護線程。用戶線程是為了完成任務,而守護線程主要是為其他線程服務。 守護線程的唯一用途是為其他線程提供服務。守護線程會隨時中斷,因此不要在守護線程上使用需要釋放資源的資源,如輸入輸…

初學duboo+zookeeper

看了很多相關資料,其實都沒有自己動手試一次印象更深刻一些。找了很多教程,下工具,花了幾個小時終于讓程序跑起來了,下面說下步驟:1.java環境也就安裝jdk,我使用的是1.7版本,jdk安裝就不在這復述…

Fedora 17 Beta 版發布

Fedora團隊今天發布了Fedora 17 Beta版本,這是正式版本發布前的最后一個重要的里程碑版本。據該團隊介紹,正式版將在今年5月發布,將主要修復Beta版中發現的關鍵性bug。針對普通用戶的桌面改進: 采用GNOME 3.4,提升了用…

27--字符串相加

文章目錄1.問題描述2.代碼詳情1.問題描述 給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。 注意: num1 和num2 的長度都小于 5100. num1 和num2 都只包含數字 0-9. num1 和num2 都不包含任何前導零。 你不能使用任何內建 BigInteger 庫&…

[轉] 一文弄懂神經網絡中的反向傳播法——BackPropagation

在看CNN和RNN的相關算法TF實現,總感覺有些細枝末節理解不到位,浮在表面。那么就一點點扣細節吧。 這個作者講方向傳播也是沒誰了,666~ 原文地址:https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度學習…

java線程組

線程組 線程組是Java線程編程所持有的概念。在Java中,線程組是指java.lang.ThreadGroup類的對象,每個線程都隸屬于唯一的一個線程組,這個線程組在線程創建時指定并在線程的整個生命周期內都不能更改。可以通過調用包含ThreadGroup類型參數的T…

FreeBSD 8.3 發布

近日,FreeBSD開發團隊放出了8.x穩定分支的8.3版本。此次發行的版本將支持amd64、i386、pc98和 sparc64等處理器類型。FreeBSD是一種類UNIX操作系統,但不是真正意義上的 UNIX 操作系統,它是由經過 BSD、386BSD 和 4.4BSD 發展而來的 Unix 的一…

Java中四種訪問權限總結

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Java中有四種訪問權限, 其中三種有訪問權限修飾符,分別為private、public、protected,還有一種不…

28--僅僅反轉字母

文章目錄1.問題描述2.代碼詳情1.問題描述 給定一個字符串 S,返回 “反轉后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置發生反轉。 示例 1: 輸入:“ab-cd” 輸出:“dc-ba” 示例 2&…

Moving Average

移動平均算法Demo #!/usr/bin/python2.7 # Fetch data from BD and analyse.import json import urllib import traceback import numpy as np # import pandas as pd import matplotlib.pyplot as plt #from scipy import statsdef fetch_raw_data(url):try:response urllib.…

【前端工程師手冊】JavaScript作用域拾遺

【前端工程師手冊】JavaScript作用域拾遺 昨天總結了一些作用域的知識【前端工程師手冊】JavaScript之作用域,但是發表完發現忘記了一些東西,今天拾個遺。 昨天說到了JavaScript中沒有塊級作用域,其實在es6中是有的。 es6中的塊級作用域 先舉…

游戲開發中的數據表示

聲明:本文內容源自騰訊游戲學院程序公開課_服務端 一、數據表示的基礎 什么是數據表示? 數據是信息的載體。 數據表示是一組操作,可以描述、顯示、操作信息。 數據表示的要素 IDL - 接口描述語言 IDL是用來描述軟件組件接口的一種計算機語言。…

29--反轉字符串

文章目錄1.問題描述2.代碼詳情1.問題描述 編寫一個函數,其作用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。 不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。 你可以假設數組中…

什么是臨界區

臨界區[1] 指的是一個訪問共用資源(例如:共用設備或是共用存儲器)的程序片段,而這些共用資源又無法同時被多個 線程 訪問的特性。當有線程進入臨界區段時,其他線程或是 進程 必須等待(例如:bo…

BZOJ 2957 樓房重建 (分塊)

題解:分塊,然后暴力維護每一塊上升序列,注意是不是最長上升序列,二分查找第二塊中大于第一塊的最后一個上升序列中的數。 注意:每一塊的大小不要用√n會T掉的,把塊的大小設為500-600都可以(T了一…

OpenBSD 5.1 正式版發布

OpenBSD 開發團隊于近日發布了 5.1 正式版。 OpenBSD是一個從NetBSD衍生出來的類Unix操作系統。項目領導人Theo de Raadt在1995年發起了OpenBSD項目,希望創造一個注重安全的操作系統,此外OpenBSD也以高品質的文件、堅持開放程式碼以及嚴格的軟件授權著名…