歡迎光臨
每天分享高質量文章

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

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

 

開篇之前,先給讀者分享下筆者對容器知識總結: 容器技術架構、網絡和生態詳解,內容涉及容器技術的方方面面,感興趣的讀者可通文末“閱讀原文”過瞭解詳情。

 

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

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

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

  • 3.1 Docker的生態系統導圖 35

  • 3.2 Docker的挑戰者Rocket 37

第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

  • 11.1 Libnetwork方案介紹 95
  • 11.2 Pipework方案介紹 97
  • 11.3 Socketplane方案介紹 98
  • 11.4 Weave方案介紹 99
  • 11.5 Flannel方案介紹 100
  • 11.6 Tinc方案介紹 101

第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等,但是還需要一些網絡專案支持,提供了更高級的網絡配置和安全控制。

已同步到看一看
赞(0)

分享創造快樂