本篇文章給大家分享的是有關(guān)Docker 中怎么搭建overlay 網(wǎng)絡(luò),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、喀喇沁ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的喀喇沁網(wǎng)站制作公司
在swarm模式下構(gòu)建和測試一個Docker overlay網(wǎng)絡(luò)
在下面的例子中,需要2個Docker主機(jī),在兩個分離的二層網(wǎng)絡(luò) ,通過路由器進(jìn)行連接,如下圖 所示:
1)構(gòu)建swarm
我們要做的第一件事是把兩臺主機(jī) 配置成兩節(jié)點的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. |
至此,已經(jīng)創(chuàng)建好了包含包含node1和node2兩個節(jié)點的swarm。
2)創(chuàng)建一個overlay網(wǎng)絡(luò)
創(chuàng)建一個叫做uber-net的overlay網(wǎng)絡(luò)。
在node1(manager)上運行如下命令:docker network create -d overlay uber-net
通過上述命令創(chuàng)建了一個新的overlay網(wǎng)絡(luò),其對Swarm中的所有主機(jī)是可用的,還包含一個用TLS加密的控制平面。如果想加密數(shù)據(jù)平面,需要在命令中增加參數(shù):-o encrypted。
可以使用 docker network ls命令來查看每一個節(jié)點上的網(wǎng)絡(luò)。
我們創(chuàng)建的uber-net網(wǎng)絡(luò)在列表的低端。其他的網(wǎng)絡(luò)當(dāng)Docker安裝的時候和初始化Swarm的時候創(chuàng)建。
如果在node2運行 docker network ls 命令,你將注意你不能看見uber-net網(wǎng)絡(luò)。這是因為只有當(dāng)運行中的容器連接到網(wǎng)絡(luò)時,新網(wǎng)絡(luò)才對worker節(jié)點可見。這種延遲方法通過減少網(wǎng)絡(luò)數(shù)量提高了網(wǎng)絡(luò)的可擴(kuò)展性。
3)將服務(wù)連接到overlay網(wǎng)絡(luò)
現(xiàn)在我們有一個overlay網(wǎng)絡(luò),讓我們創(chuàng)建一個新的Docker服務(wù)并連接到overlay網(wǎng)絡(luò)。我們將創(chuàng)建的服務(wù)包含兩個副本(容器),因此一個可以運行在node1和另一個可以運行在node2。這將會自動化地擴(kuò)展uber-net網(wǎng)絡(luò)到node2.
在node1上執(zhí)行如下命令:
docker service create --name test --network uber-net --replicas 2 ubuntu sleep infinity
創(chuàng)建了一個名為test的服務(wù),并連接到uber-net網(wǎng)絡(luò),基于提供的鏡像創(chuàng)建了2個副本(容器)。在上面的例子中,我們向容器發(fā)送了sleep命令保持容器運行,并且在停止后退出。
因為我們運行了2個副本(容器),Swarm有2個節(jié)點,在每一個節(jié)點上將會有一個副本??梢允褂?docker service ps查看,如下所示:
當(dāng)Swarm在一個overlay網(wǎng)絡(luò)上啟動一個容器時,它自動把網(wǎng)絡(luò)擴(kuò)展到運行容器的節(jié)點上。這意味著在node2上可以看見uber-net網(wǎng)絡(luò)。
4)測試overlay網(wǎng)絡(luò)
現(xiàn)在用ping命令來測試overlay網(wǎng)絡(luò)。
如下圖所示,我們在分離的網(wǎng)絡(luò)上得到2個Docker主機(jī),二者都接入了單一的overlay網(wǎng)絡(luò)。在每一個節(jié)點上都有一個容器連接到overlay網(wǎng)絡(luò)??梢杂胮ing命令來查看兩個容器之間是否連通。
為了執(zhí)行測試,我們需要 知道每一個容器的IP地址,通過運行docker network inspect可以看到分配給overlay的子網(wǎng)
上面是輸出顯示uber-net’s 的子網(wǎng)是 10.0.0.0/24。注意,這并不匹配任何有一個物理基礎(chǔ)網(wǎng)絡(luò)(172.31.1.0/24 和192.168.1.0/24).
在節(jié)點1和節(jié)點2上運行如下命令,這將會得到容器的ID和IP地址。
最終的uber-net’s 的信息如下圖所示:
我們可以看到,二層overlay網(wǎng)絡(luò)橫跨兩個主機(jī),在overlay網(wǎng)絡(luò)上每一個容器都有一個IP地址。這意味著node1上的容器可以使用10.0.0.4來ping node2上的容器。盡管這兩個節(jié)點位于不同的二層基礎(chǔ)網(wǎng)絡(luò),但是還可以ping通。
在node1上登錄進(jìn)容器,并ping遠(yuǎn)程容器。
在Linux Ubuntu 容器中需要安裝ping工具包。如下所示:
使用overlay網(wǎng)絡(luò),在node1上的容器可以ping通node2上的容器。也可以在容器內(nèi)追蹤ping命令的路由。
到目前為止,我們已經(jīng)通過單條命令創(chuàng)建了overlay網(wǎng)絡(luò),并向網(wǎng)絡(luò)中接入了容器。容器分布在兩個不同的主機(jī)上,兩臺主機(jī)分屬于不同的二層網(wǎng)絡(luò)。在找出兩臺容器的 IP 之后,驗證了容器可以通過overlay網(wǎng)絡(luò)直接連接。
工作原理
現(xiàn)在,我們已經(jīng)知道如何構(gòu)建和使用一個容器overlay網(wǎng)絡(luò)。讓我們找出背后的工作原理。
1)VXLAN 入門
首先,Docker overlay網(wǎng)絡(luò)使用VXLAN隧道創(chuàng)建虛擬的二層overlay網(wǎng)絡(luò)。在進(jìn)行下一步之前,我們先快速了解VXLAN入門。
在最高層次上,VXLAN允許在已存在的3層基礎(chǔ)設(shè)施上創(chuàng)建一個虛擬的2層網(wǎng)絡(luò)。我們前面使用的例子創(chuàng)建了一個新的10.0.0.0/24二層網(wǎng)絡(luò),其基于3層IP網(wǎng)絡(luò),3層IP網(wǎng)絡(luò)由2個2層網(wǎng)絡(luò)組成-172.31.1.0/24 和192.168.1.0/24,如下圖所示:
VXLAN的美妙之處在于它是一種封裝技術(shù),使得已存在的路由和網(wǎng)絡(luò)基礎(chǔ)設(shè)施看起來像普通的IP/UDP數(shù)據(jù)包。處理起來無問題。
為了創(chuàng)建虛擬2層網(wǎng)絡(luò),通過基礎(chǔ)3層IP基礎(chǔ)設(shè)施創(chuàng)建了一個VXLAN隧道。你也許聽過基礎(chǔ)網(wǎng)絡(luò),常用于指3層以下的基礎(chǔ)部分。
VXLAN隧道的每一端都有VXLAN歲寶端點(VTEP)。這個VTEP執(zhí)行封裝和解封裝以及一些功能所必須的操作。如下圖:
2)梳理兩容器例子
在這個例子中,我們有兩個通過IP網(wǎng)絡(luò)連接的主機(jī)。每一個主機(jī)運行一個單一容器,我們創(chuàng)建了一個單一的VXLAN網(wǎng)絡(luò)并讓容器連接到它。
為了完成這個,在每一個主機(jī)上創(chuàng)建一個新的sandbox。如前述章節(jié)所述,一個sandbox像一個容器,但是代替運行一個運行程序,它運行一個隔離的網(wǎng)絡(luò)棧
在sandbox內(nèi)部創(chuàng)建了一個虛擬交換機(jī)(又叫虛擬網(wǎng)橋)叫做Br0,同時也創(chuàng)建了一個VTEP,一端插入到Br0虛擬交換機(jī),另一端插入到主機(jī)網(wǎng)絡(luò)棧(VTEP)
主機(jī)網(wǎng)絡(luò)棧的一端從主機(jī)所連接的基礎(chǔ)網(wǎng)絡(luò)中獲取IP地址,并以UDP的方式綁定到端口4789,每一個主機(jī)上的兩個VTEPs通過VXLAN創(chuàng)建了一個overlay。如下所示:
這是VXLAN overlay網(wǎng)絡(luò)的基礎(chǔ)。
每個容器都得到它自己的虛擬Ethernet(veth)適配器,并插入到本地Br0虛擬交換機(jī)。拓?fù)浣Y(jié)構(gòu)如下所示。
3)通信例子
現(xiàn)在,我們看到了主要的插拔元素,讓我們看兩個容器的通信。
我們把node1上的容器稱為C1,把node2上的容器稱為C2,假定C1想ping通C2.如下圖所示:
C1創(chuàng)建ping請求,并設(shè)置目的IP地址為C2的10.0.0.4地址。通過連接到Br0虛擬交換機(jī)的veth接口發(fā)送流量。虛擬交互機(jī)并不知道向什么地方發(fā)送packet,因為在它的MAC地址表里 沒和目的IP地址對應(yīng)的任何入口 。因此,它將數(shù)據(jù)包泛洪到所有的端口。連接到Br0的VTEP接口知道如何轉(zhuǎn)發(fā)這個幀,因此用它自己的MAC地址響應(yīng)。這是一個ARP代理重放。并且Br0交換機(jī)學(xué)習(xí)到了如何轉(zhuǎn)發(fā)packet。因此它更新ARP路由表,將10.0.0.4映射到本地VTEP的MAC地址上。
現(xiàn)在 Br0 虛擬交換機(jī)已經(jīng)學(xué)會如何將流量轉(zhuǎn)發(fā)到 C2,所有未來發(fā)送到 C2 的包都會被直接轉(zhuǎn)發(fā)到 VTEP 接口。VTEP 接口知道 C2,是因為所有新啟動的容器都會將自己的網(wǎng)絡(luò)詳情采用網(wǎng)絡(luò)內(nèi)置 Gossip 協(xié)議發(fā)送給相同 Swarm 集群內(nèi)的其他節(jié)點。
交換機(jī)會將包轉(zhuǎn)發(fā)到 VTEP 接口,VTEP 完成數(shù)據(jù)幀的封裝,這樣就能在底層網(wǎng)絡(luò)傳輸。具體來說,封裝操作就是把 VXLAN Header 信息添加以太幀當(dāng)中。
VXLAN Header 信息包含了 VXLAN 網(wǎng)絡(luò) ID(VNID),其作用是記錄 VLAN 到 VXLAN 的映射關(guān)系。每個 VLAN 都對應(yīng)一個 VNID,以便包可以在解析后被轉(zhuǎn)發(fā)到正確的 VLAN。
封裝的時候會將數(shù)據(jù)幀放到 UDP 包中,并設(shè)置 UDP 的目的 IP 字段為 node2 節(jié)點的 VTEP 的 IP 地址,同時設(shè)置 UDP Socket 端口為 4789。這種封裝方式保證了底層網(wǎng)絡(luò)即使不知道任何關(guān)于 VXLAN 的信息,也可以完成數(shù)據(jù)傳輸。
當(dāng)包到達(dá) node2 之后,內(nèi)核發(fā)現(xiàn)目的端口為 UDP 端口 4789,同時還知道存在 VTEP 接口綁定到該 Socket。所以內(nèi)核將包發(fā)給 VTEP,由 VTEP 讀取 VNID,解壓包信息,并根據(jù) VNID 發(fā)送到本地名為 Br0 的連接到 VLAN 的交換機(jī)。在該交換機(jī)上,包被發(fā)送給容器 C2。
Docker 支持使用同樣的覆蓋網(wǎng)絡(luò)實現(xiàn)三層路由。例如,讀者可以創(chuàng)建包含兩個子網(wǎng)的覆蓋網(wǎng)絡(luò),Docker 會負(fù)責(zé)子網(wǎng)間的路由。創(chuàng)建的命令如 docker network create --subnet=10.1.1.0/24 --subnet=11.1.1.0/24 -d overlay prod-net。該命令會在 Sandbox 中創(chuàng)建兩個虛擬交換機(jī),默認(rèn)支持路由。
以上就是Docker 中怎么搭建overlay 網(wǎng)絡(luò),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。