溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

深入淺析docker中的overlay式網(wǎng)絡(luò)

發(fā)布時(shí)間:2020-11-23 16:08:57 來(lái)源:億速云 閱讀:213 作者:Leah 欄目:開發(fā)技術(shù)

深入淺析docker中的overlay式網(wǎng)絡(luò)?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

overlay(覆蓋)式網(wǎng)絡(luò)會(huì)在多個(gè)docker守護(hù)進(jìn)程所在的主機(jī)之間創(chuàng)建一個(gè)分布式的網(wǎng)絡(luò)。這個(gè)網(wǎng)絡(luò)會(huì)覆蓋宿主機(jī)特有的網(wǎng)絡(luò),并允許容器連接它(包括集群服務(wù)中的容器)來(lái)安全通信。顯然,docker會(huì)處理docker守護(hù)進(jìn)程源容器和目標(biāo)容器之間的數(shù)據(jù)報(bào)的路由。

當(dāng)你初始化一個(gè)集群(swarm)或把一個(gè)docker宿主機(jī)加入一個(gè)已經(jīng)存在的集群時(shí),宿主機(jī)上會(huì)新建兩個(gè)網(wǎng)絡(luò):

一個(gè)叫ingress的overlay式網(wǎng)絡(luò),用來(lái)處理和集群服務(wù)相關(guān)的控制和數(shù)據(jù)傳輸。當(dāng)你創(chuàng)建一個(gè)集群服務(wù)而且沒(méi)有把它連到用戶定義的overlay式網(wǎng)絡(luò)時(shí),它默認(rèn)會(huì)連到ingress網(wǎng)絡(luò)。

一個(gè)叫docker_gwbridge的bridge式網(wǎng)絡(luò)。用來(lái)連接本docker守護(hù)進(jìn)程和集群中的其他守護(hù)進(jìn)程。

你可以用docker network create命令創(chuàng)建用戶定義的overlay式網(wǎng)絡(luò),就和你創(chuàng)建用戶定義的bridge式網(wǎng)絡(luò)一樣。服務(wù)和容器可以同時(shí)連到多個(gè)網(wǎng)絡(luò)。服務(wù)和容器只能和它所在的網(wǎng)絡(luò)中的其他對(duì)象通信。

雖然集群服務(wù)和單獨(dú)的容器都能連到overlay式網(wǎng)絡(luò),但默認(rèn)的表現(xiàn)和配置兩者都是不同的。因此,本主題后面的內(nèi)容會(huì)分成三部分:應(yīng)用于所有overlay式網(wǎng)絡(luò)的;應(yīng)用于集群服務(wù)中的網(wǎng)絡(luò)的;應(yīng)用于單獨(dú)的容器使用的overlay式網(wǎng)絡(luò)的。

適用于所有overlay網(wǎng)絡(luò)的操作

創(chuàng)建一個(gè)overlay網(wǎng)絡(luò)

先決條件

使用overlay網(wǎng)絡(luò)的docker守護(hù)進(jìn)程需要的防火墻規(guī)則

要讓一個(gè)overlay網(wǎng)絡(luò)中的docker主機(jī)能夠相互通信,你需要打開下面的端口:

1.TCP端口2377,用來(lái)集群管理相關(guān)的通信

2.TCP和UDP端口7946,用來(lái)進(jìn)行節(jié)點(diǎn)之間的通信

3.UDP端口4789,用來(lái)進(jìn)行進(jìn)行overlay網(wǎng)絡(luò)上的數(shù)據(jù)傳輸

在你能創(chuàng)建一個(gè)overlay網(wǎng)絡(luò)之前,你要么要通過(guò)docker swarm init把你的docker守護(hù)進(jìn)程初始化成一個(gè)集群管理者(swarm manager),要么要通過(guò)docker swarm join把它加入到一個(gè)已存在的集群中。

不管哪種方式,默認(rèn)創(chuàng)建并使用的都是叫做ingress的overlay式網(wǎng)絡(luò)。即使你不打算使用集群服務(wù),也要這么做。

以后你可以創(chuàng)建用戶定義的overlay式網(wǎng)絡(luò)。

要?jiǎng)?chuàng)建一個(gè)用在集群服務(wù)中的overlay式網(wǎng)絡(luò),用下面所示的命令:

$ docker network create -d overlay my-overlay

要?jiǎng)?chuàng)建一個(gè)既能用于集群服務(wù),又能用于單獨(dú)的容器來(lái)和其他docker守護(hù)進(jìn)程中的單獨(dú)的容器進(jìn)行通信的網(wǎng)絡(luò),加上--attachable標(biāo)記:

$ docker network create -d overlay --attachable my-attachable-overlay

你可以指定IP地址范圍,子網(wǎng),網(wǎng)關(guān)和其他選項(xiàng)。細(xì)節(jié)請(qǐng)查看docker network create --help。

overlay網(wǎng)絡(luò)上的加密傳輸

所有的服務(wù)管理相關(guān)的傳輸都默認(rèn)用GCM模式的AES算法加密。集群中的管理節(jié)點(diǎn)每12個(gè)小時(shí)輪換加密用的鍵(key)。

如果要加密應(yīng)用數(shù)據(jù),在創(chuàng)建網(wǎng)絡(luò)時(shí)加上--opt encrypted。這個(gè)參數(shù)支持在vxlan級(jí)別的IPSEC加密。這個(gè)操作會(huì)導(dǎo)致不可忽略的性能下降,所以在應(yīng)用到生產(chǎn)環(huán)境前要先測(cè)試。

當(dāng)你開啟overlay加密后,docker會(huì)在所有網(wǎng)絡(luò)中服務(wù)被調(diào)度到的節(jié)點(diǎn)上創(chuàng)建IPSEC 隧道。這些隧道也會(huì)使用GCM模式的AES算法加密,并且每12個(gè)小時(shí)自動(dòng)輪換加密用的鍵(key)。

❌不要把Windows節(jié)點(diǎn)加入到加密通信的overlay網(wǎng)絡(luò)中。

overlay網(wǎng)絡(luò)上的加密通信不支持Windows。如果Windows節(jié)點(diǎn)試圖連接到加密通信的overlay網(wǎng)絡(luò),不會(huì)報(bào)錯(cuò),但這個(gè)節(jié)點(diǎn)會(huì)不能和其他節(jié)點(diǎn)通信。

集群模式的overlay網(wǎng)絡(luò)和單獨(dú)的容器

你可以用--opt encrypted --attachable或把沒(méi)有被管理的容器加入到網(wǎng)絡(luò)的方式來(lái)使用overlay網(wǎng)絡(luò)特性。

$ docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network

修改默認(rèn)的ingress網(wǎng)絡(luò)

大多數(shù)用戶不需要配置ingress網(wǎng)絡(luò)。但docker17.05以及更高版本允許你這么做。如果自動(dòng)選擇的子網(wǎng)段和你網(wǎng)絡(luò)中已存在的網(wǎng)絡(luò)沖突了,或你需要修改其他底層的網(wǎng)絡(luò)設(shè)置比如MTU的時(shí)候,這個(gè)功能就很有用了。

修改ingress網(wǎng)絡(luò)需要?jiǎng)h除再創(chuàng)建它。這就要求你在集群中創(chuàng)建服務(wù)之前完成修改。如果有發(fā)布端口的服務(wù),在你刪除ingress網(wǎng)絡(luò)之前要先刪除這些服務(wù)。

在ingress網(wǎng)絡(luò)不存在的時(shí)候,已存在的沒(méi)有發(fā)布端口的服務(wù)能繼續(xù)提供服務(wù),但沒(méi)有負(fù)載均衡功能。那些發(fā)布端口的服務(wù)比如發(fā)布80端口的WordPress服務(wù)會(huì)受影響。

用docker network inspect ingress檢查ingress網(wǎng)絡(luò),然后刪除所有所在容器連到ingress的服務(wù)。這些服務(wù)是發(fā)布端口的服務(wù)比如發(fā)布80端口的WordPress服務(wù)。如果所有這些服務(wù)沒(méi)有停掉,下一步會(huì)失敗。

刪除ingress網(wǎng)絡(luò)。

$ docker network rm ingress

WARNING! Before removing the routing-mesh network, make sure all the nodes in your swarm run the same docker engine version. Otherwise, removal may not be effective and functionality of newly created ingress networks will be impaired.

Are you sure you want to continue? [y/N]

3.用ingress標(biāo)記創(chuàng)建新的overlay網(wǎng)絡(luò),加上你想要的配置。下面的例子把MTU配置成1200,把子網(wǎng)設(shè)置成10.11.0.0/16,并把網(wǎng)關(guān)設(shè)成10.11.0.2。

$ docker network create \
 --driver overlay \
 --ingress \
 --subnet=10.11.0.0/16 \
 --gateway=10.11.0.2 \
 --opt com.docker.network.mtu=1200 \
 my-ingress

注意:你也可以把ingerss網(wǎng)絡(luò)命名成其他名字,但只能有一個(gè)。如果你試圖創(chuàng)建第二個(gè),會(huì)失敗。

4.重啟你在第一步停掉的服務(wù)。

修改docker_gwbridge接口

docker_gwbridge是一個(gè)虛擬網(wǎng)橋,用來(lái)連接overlay網(wǎng)絡(luò)(包括ingress網(wǎng)絡(luò))和一個(gè)特定的docker守護(hù)進(jìn)程的物理網(wǎng)絡(luò)。當(dāng)你初始化一個(gè)集群或把一個(gè)docker宿主機(jī)加入到一個(gè)集群時(shí),docker會(huì)自動(dòng)創(chuàng)建它,但它不是一個(gè)docker設(shè)備。它存在于docker宿主機(jī)的內(nèi)核中。如果你要修改它的配置,你必須在把宿主機(jī)加入集群前完成,或暫時(shí)把宿主機(jī)從集群中脫離。

停掉docker

刪除docker_gwbridge接口

$ sudo ip link set docker_gwbridge down

$ sudo ip link del name docker_gwbridge

3.啟動(dòng)docker,不要加入或初始化集群

4.用docker network create命令手動(dòng)創(chuàng)建或重新創(chuàng)建docker_gwbridge網(wǎng)橋,加上你自定義的設(shè)置。下面的例子使用10.11.0.0/16子網(wǎng)。

$ docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

5.初始化或加入集群。由于網(wǎng)橋已經(jīng)存在,docker不會(huì)再用默認(rèn)配置創(chuàng)建它了。

集群服務(wù)中的操作

在overlay網(wǎng)絡(luò)上發(fā)布端口

連到同一個(gè)overlay網(wǎng)絡(luò)的集群服務(wù)會(huì)互相暴露所有端口。如果一個(gè)端口要從服務(wù)外部可訪問(wèn)到,必須在docker service create或docker service update中用-p或--publish來(lái)發(fā)布。

遺留的冒號(hào)分割的語(yǔ)法和新的逗號(hào)分割的語(yǔ)法都是支持的。

更長(zhǎng)的語(yǔ)法更好,因?yàn)槟撤N意義上它是自解釋的。

參數(shù)描述
-p 8080:80 o或-p published=8080,target=80把服務(wù)內(nèi)的 TCP 端口 80映射到路由中的端口8080
-p 8080:80/udp 或-p published=8080,target=80,protocol=udp把服務(wù)內(nèi)的 UDP 端口 80映射到路由中的端口8080
-p 8080:80/tcp -p 8080:80/udp 或 -p published=8080,target=80,protocol=tcp -p published=8080,target=80,protocol=udp把服務(wù)內(nèi)的 TCP 端口 80映射到路由中的端口8080,并把服務(wù)內(nèi)的 UDP 端口 80映射到路由中的端口8080

為集群服務(wù)繞開路由網(wǎng)

默認(rèn)的,集群服務(wù)通過(guò)路由網(wǎng)來(lái)發(fā)布端口。當(dāng)你連到任一集群節(jié)點(diǎn)(不管它有沒(méi)有運(yùn)行端口所代表的服務(wù))上的被發(fā)布的端口時(shí),你都能重定向到運(yùn)行著指定服務(wù)的節(jié)點(diǎn)。docker很有效的充當(dāng)著你的集群服務(wù)的負(fù)載均衡器。使用路由網(wǎng)的服務(wù)運(yùn)行在虛擬IP模式(VIP)下。即使一個(gè)服務(wù)運(yùn)行在一個(gè)節(jié)點(diǎn)上(通過(guò)--global標(biāo)記),也會(huì)使用路由網(wǎng)。當(dāng)使用路由網(wǎng)時(shí),不能保證哪個(gè)節(jié)點(diǎn)處理客戶端的請(qǐng)求。

要繞開路由網(wǎng),你可以用DNS Round Robin (DNSRR)模式啟動(dòng)服務(wù)。通過(guò)給dnsrr設(shè)置--endpoint-mode標(biāo)記。你必須在服務(wù)前端運(yùn)行你自己的負(fù)載均衡器。docker宿主機(jī)上的服務(wù)名的DNS查詢會(huì)返回運(yùn)行著指定服務(wù)的節(jié)點(diǎn)的IP地址集合。配置你的負(fù)載均衡器來(lái)使用這份列表并在節(jié)點(diǎn)間平衡通信。

分離控制流和數(shù)據(jù)流

默認(rèn)的,控制流和集群管理者聯(lián)系并在運(yùn)行在同一網(wǎng)絡(luò)上的應(yīng)用間傳輸,雖然控制流是加密的。你可以配置docker,讓它用不同的網(wǎng)絡(luò)接口來(lái)處理不同的流。當(dāng)你初始化或加入集群時(shí),分別指定--advertise-addr和--datapath-addr。你必須在每個(gè)要加入集群的節(jié)點(diǎn)上做這個(gè)操作。

overlay網(wǎng)絡(luò)上獨(dú)立容器能用的操作

把獨(dú)立容器連到overlay網(wǎng)絡(luò)

ingress網(wǎng)絡(luò)創(chuàng)建時(shí)沒(méi)有指定--attachable標(biāo)記,這意味著只有集群服務(wù)能使用它,獨(dú)立容器不能。你可以把獨(dú)立容器連到用戶定義的,創(chuàng)建時(shí)指定了--attachablebiaoji d overlay網(wǎng)絡(luò)。這給了運(yùn)行在不同docker上的獨(dú)立容器一種能力,即不需在特定docker宿主機(jī)上設(shè)置路由就能通信的能力。

發(fā)布端口

參數(shù)描述
-p 8080:80把服務(wù)內(nèi)的 TCP 端口 80映射到路由中的端口8080
-p 8080:80/udp把服務(wù)內(nèi)的 UDP 端口 80映射到路由中的端口8080
-p 8080:80/tcp -p 8080:80/udp把服務(wù)內(nèi)的 TCP 端口 80映射到路由中的端口8080,并把服務(wù)內(nèi)的 UDP 端口 80映射到路由中的端口8080

看完上述內(nèi)容,你們掌握深入淺析docker中的overlay式網(wǎng)絡(luò)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI