您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Docker 中怎么搭建overlay 網絡,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在swarm模式下構建和測試一個Docker overlay網絡
在下面的例子中,需要2個Docker主機,在兩個分離的二層網絡 ,通過路由器進行連接,如下圖 所示:
1)構建swarm
我們要做的第一件事是把兩臺主機 配置成兩節點的swarm。在node1上運行命令:docker swarm init,使得node1成為manager,然后在node2上運行命令:docker swarm join,使得node2成為worker。
在node1上運行命令:
$ docker swarm init \ |
--advertise-addr=172.31.1.5 \ |
--listen-addr=172.31.1.5:2377 |
Swarm initialized: current node (1ex3...o3px) is now a manager. |
在node2上運行命令:
$ docker swarm join \ |
--token SWMTKN-1-0hz2ec...2vye \ |
172.31.1.5:2377 |
This node joined a swarm as a worker. |
至此,已經創建好了包含包含node1和node2兩個節點的swarm。
2)創建一個overlay網絡
創建一個叫做uber-net的overlay網絡。
在node1(manager)上運行如下命令:docker network create -d overlay uber-net
通過上述命令創建了一個新的overlay網絡,其對Swarm中的所有主機是可用的,還包含一個用TLS加密的控制平面。如果想加密數據平面,需要在命令中增加參數:-o encrypted。
可以使用 docker network ls命令來查看每一個節點上的網絡。
我們創建的uber-net網絡在列表的低端。其他的網絡當Docker安裝的時候和初始化Swarm的時候創建。
如果在node2運行 docker network ls 命令,你將注意你不能看見uber-net網絡。這是因為只有當運行中的容器連接到網絡時,新網絡才對worker節點可見。這種延遲方法通過減少網絡數量提高了網絡的可擴展性。
3)將服務連接到overlay網絡
現在我們有一個overlay網絡,讓我們創建一個新的Docker服務并連接到overlay網絡。我們將創建的服務包含兩個副本(容器),因此一個可以運行在node1和另一個可以運行在node2。這將會自動化地擴展uber-net網絡到node2.
在node1上執行如下命令:
docker service create --name test --network uber-net --replicas 2 ubuntu sleep infinity
創建了一個名為test的服務,并連接到uber-net網絡,基于提供的鏡像創建了2個副本(容器)。在上面的例子中,我們向容器發送了sleep命令保持容器運行,并且在停止后退出。
因為我們運行了2個副本(容器),Swarm有2個節點,在每一個節點上將會有一個副本。可以使用 docker service ps查看,如下所示:
當Swarm在一個overlay網絡上啟動一個容器時,它自動把網絡擴展到運行容器的節點上。這意味著在node2上可以看見uber-net網絡。
4)測試overlay網絡
現在用ping命令來測試overlay網絡。
如下圖所示,我們在分離的網絡上得到2個Docker主機,二者都接入了單一的overlay網絡。在每一個節點上都有一個容器連接到overlay網絡。可以用ping命令來查看兩個容器之間是否連通。
為了執行測試,我們需要 知道每一個容器的IP地址,通過運行docker network inspect可以看到分配給overlay的子網
上面是輸出顯示uber-net’s 的子網是 10.0.0.0/24。注意,這并不匹配任何有一個物理基礎網絡(172.31.1.0/24 和192.168.1.0/24).
在節點1和節點2上運行如下命令,這將會得到容器的ID和IP地址。
最終的uber-net’s 的信息如下圖所示:
我們可以看到,二層overlay網絡橫跨兩個主機,在overlay網絡上每一個容器都有一個IP地址。這意味著node1上的容器可以使用10.0.0.4來ping node2上的容器。盡管這兩個節點位于不同的二層基礎網絡,但是還可以ping通。
在node1上登錄進容器,并ping遠程容器。
在Linux Ubuntu 容器中需要安裝ping工具包。如下所示:
使用overlay網絡,在node1上的容器可以ping通node2上的容器。也可以在容器內追蹤ping命令的路由。
到目前為止,我們已經通過單條命令創建了overlay網絡,并向網絡中接入了容器。容器分布在兩個不同的主機上,兩臺主機分屬于不同的二層網絡。在找出兩臺容器的 IP 之后,驗證了容器可以通過overlay網絡直接連接。
工作原理
現在,我們已經知道如何構建和使用一個容器overlay網絡。讓我們找出背后的工作原理。
1)VXLAN 入門
首先,Docker overlay網絡使用VXLAN隧道創建虛擬的二層overlay網絡。在進行下一步之前,我們先快速了解VXLAN入門。
在最高層次上,VXLAN允許在已存在的3層基礎設施上創建一個虛擬的2層網絡。我們前面使用的例子創建了一個新的10.0.0.0/24二層網絡,其基于3層IP網絡,3層IP網絡由2個2層網絡組成-172.31.1.0/24 和192.168.1.0/24,如下圖所示:
VXLAN的美妙之處在于它是一種封裝技術,使得已存在的路由和網絡基礎設施看起來像普通的IP/UDP數據包。處理起來無問題。
為了創建虛擬2層網絡,通過基礎3層IP基礎設施創建了一個VXLAN隧道。你也許聽過基礎網絡,常用于指3層以下的基礎部分。
VXLAN隧道的每一端都有VXLAN歲寶端點(VTEP)。這個VTEP執行封裝和解封裝以及一些功能所必須的操作。如下圖:
2)梳理兩容器例子
在這個例子中,我們有兩個通過IP網絡連接的主機。每一個主機運行一個單一容器,我們創建了一個單一的VXLAN網絡并讓容器連接到它。
為了完成這個,在每一個主機上創建一個新的sandbox。如前述章節所述,一個sandbox像一個容器,但是代替運行一個運行程序,它運行一個隔離的網絡棧
在sandbox內部創建了一個虛擬交換機(又叫虛擬網橋)叫做Br0,同時也創建了一個VTEP,一端插入到Br0虛擬交換機,另一端插入到主機網絡棧(VTEP)
主機網絡棧的一端從主機所連接的基礎網絡中獲取IP地址,并以UDP的方式綁定到端口4789,每一個主機上的兩個VTEPs通過VXLAN創建了一個overlay。如下所示:
這是VXLAN overlay網絡的基礎。
每個容器都得到它自己的虛擬Ethernet(veth)適配器,并插入到本地Br0虛擬交換機。拓撲結構如下所示。
3)通信例子
現在,我們看到了主要的插拔元素,讓我們看兩個容器的通信。
我們把node1上的容器稱為C1,把node2上的容器稱為C2,假定C1想ping通C2.如下圖所示:
C1創建ping請求,并設置目的IP地址為C2的10.0.0.4地址。通過連接到Br0虛擬交換機的veth接口發送流量。虛擬交互機并不知道向什么地方發送packet,因為在它的MAC地址表里 沒和目的IP地址對應的任何入口 。因此,它將數據包泛洪到所有的端口。連接到Br0的VTEP接口知道如何轉發這個幀,因此用它自己的MAC地址響應。這是一個ARP代理重放。并且Br0交換機學習到了如何轉發packet。因此它更新ARP路由表,將10.0.0.4映射到本地VTEP的MAC地址上。
現在 Br0 虛擬交換機已經學會如何將流量轉發到 C2,所有未來發送到 C2 的包都會被直接轉發到 VTEP 接口。VTEP 接口知道 C2,是因為所有新啟動的容器都會將自己的網絡詳情采用網絡內置 Gossip 協議發送給相同 Swarm 集群內的其他節點。
交換機會將包轉發到 VTEP 接口,VTEP 完成數據幀的封裝,這樣就能在底層網絡傳輸。具體來說,封裝操作就是把 VXLAN Header 信息添加以太幀當中。
VXLAN Header 信息包含了 VXLAN 網絡 ID(VNID),其作用是記錄 VLAN 到 VXLAN 的映射關系。每個 VLAN 都對應一個 VNID,以便包可以在解析后被轉發到正確的 VLAN。
封裝的時候會將數據幀放到 UDP 包中,并設置 UDP 的目的 IP 字段為 node2 節點的 VTEP 的 IP 地址,同時設置 UDP Socket 端口為 4789。這種封裝方式保證了底層網絡即使不知道任何關于 VXLAN 的信息,也可以完成數據傳輸。
當包到達 node2 之后,內核發現目的端口為 UDP 端口 4789,同時還知道存在 VTEP 接口綁定到該 Socket。所以內核將包發給 VTEP,由 VTEP 讀取 VNID,解壓包信息,并根據 VNID 發送到本地名為 Br0 的連接到 VLAN 的交換機。在該交換機上,包被發送給容器 C2。
Docker 支持使用同樣的覆蓋網絡實現三層路由。例如,讀者可以創建包含兩個子網的覆蓋網絡,Docker 會負責子網間的路由。創建的命令如 docker network create --subnet=10.1.1.0/24 --subnet=11.1.1.0/24 -d overlay prod-net。該命令會在 Sandbox 中創建兩個虛擬交換機,默認支持路由。
以上就是Docker 中怎么搭建overlay 網絡,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。