當前位置:
首頁 > 科技 > 詳解:Docker原生網路和主流優化方案

詳解:Docker原生網路和主流優化方案

在雲計算架構設計中,最複雜且最重要的組件就是網路,Docker作為雲計算追捧的新寵兒也不會例外,尤其是當使用Docker容器構建分散式服務時,通信和網路變得非常重要。

第1章 容器演進和關鍵技術介紹4

第2章 為什麼是Docker引領主流13

第3章 詳談Docker的生態系統34

3.1 Docker的生態系統導圖35

3.2 Docker的挑戰者Rocket37

第4章 詳解Docker AUFS技術38

第5章 Docker技術架構詳細分析44

5.1 Docker關鍵技術回顧44

5.2 Docker實現持續部署45

5.3 Docker總架構圖46

5.3.1 Docker Client模塊48

5.3.2 Docker Daemon模塊49

5.3.3 Docker Server子模塊50

5.3.4 Engine子模塊52

5.3.5 Job任務子模塊52

5.3.6 Docker Registry模塊53

5.3.7 Graph模塊53

5.3.8 Driver模塊54

5.3.9 Libcontainer模塊58

5.3.10 Docker container模塊60

第6章 容器定義存儲(CDS)技術分析61

第7章 Portworx容器定義存儲(CDS)詳解70

7.1 Portworx架構和原理71

7.2 存儲控制面72

7.3 數據面訪問73

7.4 生命周期管理74

7.5 Portworx應用場景75

第8章 Diamanti容器融合存儲基礎架構78

8.1 容器的內建基礎架構79

8.2 容器與其網路互聯80

8.3 容器的存儲持久化81

8.4 簡化容器管理81

8.5 集成流行的容器開源架構82

8.6 Diamanti產品特點83

第9章 Docker原生網路和實現原理84

第10章 Openstack如何實現與容器對接88

第11章 Docker網路技術方案詳解94

第12章 細說Docker發展和生態102

12.1 Docker發展歷程102

12.2 Docker的推動者103

12.3 Docker鏡像倉庫103

12.4 Docker的生態環境104

12.5 Docker的優勢104

12.6 Docker的跨平台特性106

12.7 Docker容器雲106

12.8 Docker改名Moby淺析107

接下來,我們將從Docker原生網路架構出發,討論目前活躍的多種針對Docker提出的網路優化方案。

Docker的網路是基於Linux的網路命名空間和虛擬網路設備(特別是veth pair)來實現。在Docker中,網路介面默認都是虛擬的介面,可以充分發揮數據在不同Docker間或Docker與宿主機轉發效率。這是因為Linux通過在內核中通過數據複製實現虛擬介面之間的數據轉發,即發送介面的發送緩存中的數據包將被直接複製到接收介面的接收緩存中,而無需通過外部物理網路設備進行交換。

Docker容器創建網路時,會在本地主機和容器內分別創建一個虛擬介面,並讓它們彼此連通,形成一對虛擬網路介面,這樣的一對介面叫做veth pair。

當Docker進程啟動之後,它會配置一個叫docker0的虛擬網橋在宿主機上。這個網橋介面允許Docker去分配虛擬的子網給即將啟動的容器。這個網橋在容器內的網路和宿主機網路之間將作為網路介面的主節點呈現。

當Docker容器啟動後,創建一對虛擬介面,分別放到本地主機和新容器的命名空間中。本地宿主機一端的虛擬介面連接到默認的docker0網橋或指定網橋上,並具有一個以veth開頭的唯一名字。容器一端的虛擬介面將放到新創建的容器中,並修改名字作為eth0,這個介面只在容器的命名空間可見。

從網橋可用地址段中,分配一個網橋子網內的IP地址給容器的eth0。這個IP地址嵌在容器內網路中,用於提供容器網路到宿主機docker0網橋上的一個通道。並配置默認路由網關為docker0網卡的內部介面docker0的IP地址。Docker會自動配置iptables規則和配置NAT,便於連通宿主機上的docker0網橋。完成這些操作之後,容器就可以使用它所能看到的eth0虛擬網卡,來連接其他容器和訪問外部網路。

Docker提供了一種容器間通信機制叫做Docker links。如果一個新容器鏈接到一個已有容器,新容器將會通過環境變數獲得已有容器的鏈接信息。通過提供給信任容器有關已有容器的鏈接信息,實現容器間的通信。

同一宿主機上的容器可以相互通信並提供服務給相鄰容器,而不需要額外的配置(埠暴露或發布),宿主系統會簡單將路由請求從docker0傳到目的地。

容器可以暴露它們的埠給宿主機,用於接收外部請求流量。暴露出的埠可以通過特定埠或由Docker來隨機選擇一個高位空閑埠映射到宿主機上。暴露埠意味著Docker將呈現該埠是暴露容器所使用,這可以被用於服務發現和links(新容器將會設置環境變數來對應原容器暴露的埠)。

容器可以發布它們的埠給宿主機,埠發布將映射埠到宿主介面,使得它可以與外界交互。暴露出的埠可選擇映射宿主機上一個指定埠,或者Docker可以自動的隨機選擇一個高位空閑埠。

Libcontainer也需要重點關注下,它是Docker中用於容器管理模塊(創建容器、實現容器生命周期管理),它基於Go語言實現,通過管理Namespaces、Cgroups以及文件系統來進行容器控制。在Docker中,對容器管理的模塊為Execdriver,目前Docker支持的容器管理方式有兩種,一種就是最初支持的LXC方式,另一種稱為Native的Libcontainer進行容器管理。

Docker起初是採用LXC的開源容器管理引擎。把LXC複雜的容器創建與使用方式簡化為Docker自己的一套命令體系。後來Docker將底層實現都抽象化到Libcontainer的介面。這樣可以實現跨平台能力,無論是使用了Namespace、Cgroups技術或是使用Systemd等其他方案,只要實現了Libcontainer定義的一組標準介面,Docker都可以運行。

Docker原生網路模型在保證埠映射、鏈接正確的情況下,可實現同一宿主機上容器間的通信和宿主機之間的通信。

但針對安全或者特殊功能要求特殊的網路環境,Docker這個原生的網路功能就會受限制。於是許多項目致力於擴展Docker網路生態。下面我們重點介紹下這些基於Docker網路優化的6個項目及方案。

Libnetwork方案介紹

Libnetwork是Docker公司正在開發的新的網路底層架構,由libcontainer和Docker Engine中的網路相關的代碼合併而成。Libnetwork的目標是引入了容器網路模型(CNM),並為應用程序提供一致的編程API介面以及網路抽象。CNM得到了網路方面的合作夥伴Cisco、IBM、Joyent、Microsoft、Rancher、VMware和Weave的支持,使Libnetwork發展為一個跨平台的容器網路管理工具。

Libnetwork的容器網路模型包含了三個重要概念,Network Sandbox,Endpoint和Network。

網路沙盒Network Sandbox承載Docker容器中一個網路配置的隔離、獨立運行環境。Endpoint用於在某個網路上進行網路通訊的介面,一個Endpoint只能加入一個network Sandbox,同時,多個Endpoint也可以在一個網路沙盒中共存。

Network就是一個唯一的、可識別的endpoint組,組內endpoint可以相互通訊。不同網路組內的endpoint不能通信。可以創建兩個完全隔離的Frontend network和Backend network。

Pipework方案介紹

Pipework是由Docker開發者通過Shell開發,作為一個權宜之計來簡化Docker網路配置流程,這個項目使得高級網路配置變得容易,能夠自動完成一些網路功能配置,但功能有限。

Pipework首先會檢查是否存在br0網橋,若不存在,就自己創建。若"ovs"開頭,就會創建OpenVswitch網橋,以"br"開頭,創建Linux網橋。創建veth pair設備,用於為容器提供網卡並連接到br0網橋。

使用Docker inspect找到容器在主機中的pid,然後通過PID將容器的網路命名空間鏈接到/var/run/netns/目錄下。這麼做的目的是,方便在主機上使用ip netns命令配置容器的網路。將之前創建的veth pair設備分別加入容器和網橋中(在容器中默認為eth1)。

最後會配置新網卡eth1的IP。若指定為網關地址,那麼pipework會改變默認路由eth0和docker0為該IP,容器通往外網的流量會經由新配置的eth1出去。

Socketplane方案介紹

Socketplane是SND創業公司,目前已經被Docker公司收購,其實現方式是在原有的Docker命令上做了一層封裝,通過攔截並修改Docker Client發送給Docker engine的命令來實現網路安全和維護的目前。

Socketplane依賴於OpenvSwitch和Consul。Socketplane作為虛擬交換機實現底層網路通信,Consul實現消息同步和服務發現。SocketPlane在 Socket 層面提供了一個網路的抽象層,對開發者屏蔽VLANs, VXLANs, Tunnels 或TEPs等概念,實現和OpenvSwitch集成,支持多網路和分散式 IP 地址管理,通過可管理的方式去解決各種網路問題。

Weave方案介紹

Weave方案包含兩大組件,用戶態Shell腳本和Weave虛擬路由容器。Weave虛擬路由容器需要在每個宿主機上布置,把不同宿主機的route容器連接起來。

不同主機間的網路通信依賴於Weave虛擬route,通過route攔截所有普通容器的IP請求,以UDP數據包發送到其他宿主機上的普通容器,實現跨主機的多個容器扁平網路。但是Weave解決了不同主機網路間通信問題。

Flannel方案介紹

Flannel原名為Rudder,是由CoreOS團隊開發,這個項目被開發的初衷是為每一個宿主系統提供一個共享、完整的網路子網,配合Google kubernetes使用,但在其他場景下也被用來簡化埠映射和網路管理的複雜性。

Flannel和OpenvSwitch設計思路基本一致,在Docker在宿主機上創建一個網橋時,通過採用Flannel自己的網橋替代它。其差別在於Flannel通信是用軟的UDP來包裝IP數據包,而OpenvSwitch用的是採用SDN思想。Flannel網路配置是寫入到etcd集群中,Flannel進程一般運行在三台主機上,Docker啟動時,運行的Docker從主機所屬的完整子網網段中動態分配IP。

Tinc方案介紹

Tinc是一個輕量的VPN軟體,也是一個開源的VPN解決方案,它採用隧道和加密實現。Tinc是一個健壯的解決方案,它能夠使私有網路對任何應用透明。

關於Tinc方案介紹的資料並不多,主要藉助VPN技術實現數據網路安全傳輸,由於採用了「虛擬專用網」技術,即用戶實際上並不存在一個獨立專用的網路,也能保證Docker間數據安全傳輸。

Docker容器本身具備對內或對外提供服務是原生網路模型和能力,如通過虛擬介面的配置、子網、NAT表管理和iptables等,但是還需要一些網路項目支持,提供了更高級的網路配置和安全控制。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 架構師技術聯盟 的精彩文章:

黑科技:高性能計算BurstBuffer技術詳解

TAG:架構師技術聯盟 |