【swarm】Docker swarm 的跨主機(jī)通訊

一、跨主機(jī)網(wǎng)絡(luò)解決方案


我們知道,Docker 的幾種網(wǎng)絡(luò)方案:none、host、bridge 和 joined 容器,它們解決了單個(gè) Docker Host 內(nèi)容器通信的問(wèn)題。

那么跨主機(jī)容器間通信的方案又有哪些呢?

跨主機(jī)網(wǎng)絡(luò)方案包括:

1. docker 原生的 overlay 和 macvlan。

2. 第三方方案:常用的包括 flannel、weave 和 calico。

Docker 網(wǎng)絡(luò)是一個(gè)非?;钴S的技術(shù)領(lǐng)域,不斷有新的方案開(kāi)發(fā)出來(lái),那么要問(wèn)個(gè)非常重要的問(wèn)題了: 如此眾多的方案是如何與 docker 集成在一起的?答案是:libnetwork 以及 CNM。

libnetwork 是 docker 容器網(wǎng)絡(luò)庫(kù),最核心的內(nèi)容是其定義的 Container Network Model (CNM),這個(gè)模型對(duì)容器網(wǎng)絡(luò)進(jìn)行了抽象,由以下三類組件組成:

1.Sandbox:Sandbox 是容器的網(wǎng)絡(luò)棧,包含容器的 interface、路由表和 DNS 設(shè)置。 Linux Network Namespace 是 Sandbox 的標(biāo)準(zhǔn)實(shí)現(xiàn)。Sandbox 可以包含來(lái)自不同 Network 的 Endpoint。

2.Endpoint:Endpoint 的作用是將 Sandbox 接入 Network。Endpoint 的典型實(shí)現(xiàn)是 veth pair,后面我們會(huì)舉例。一個(gè) Endpoint 只能屬于一個(gè)網(wǎng)絡(luò),也只能屬于一個(gè) Sandbox。

3.Network:Network 包含一組 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的實(shí)現(xiàn)可以是 Linux Bridge、VLAN 等。


如圖所示兩個(gè)容器,一個(gè)容器一個(gè) Sandbox,每個(gè) Sandbox 都有一個(gè) Endpoint 連接到 Network 1,第二個(gè) Sandbox 還有一個(gè) Endpoint 將其接入 Network 2.



libnetwork CNM 定義了 docker 容器的網(wǎng)絡(luò)模型,按照該模型開(kāi)發(fā)出的 driver 就能與 docker daemon 協(xié)同工作,實(shí)現(xiàn)容器網(wǎng)絡(luò)。

docker 原生的 driver 包括 none、bridge、overlay 和 macvlan,第三方 driver 包括 flannel、weave、calico 等。




Docker Swarm 內(nèi)置的跨主機(jī)容器通信方案是overlay網(wǎng)絡(luò),這是一個(gè)基于vxlan協(xié)議的網(wǎng)絡(luò)實(shí)現(xiàn)。

VxLAN 可將二層數(shù)據(jù)封裝到 UDP 進(jìn)行傳輸,VxLAN 提供與 VLAN 相同的以太網(wǎng)二層服務(wù),但是擁有更強(qiáng)的擴(kuò)展性和靈活性。

?overlay 通過(guò)虛擬出一個(gè)子網(wǎng),讓處于不同主機(jī)的容器能透明地使用這個(gè)子網(wǎng)。所以跨主機(jī)的容器通信就變成了在同一個(gè)子網(wǎng)下的容器通信,看上去就像是同一主機(jī)下的bridge網(wǎng)絡(luò)通信。


根據(jù)vxlan的作用知道,它是要在三層網(wǎng)絡(luò)中虛擬出二層網(wǎng)絡(luò),即跨網(wǎng)段建立虛擬子網(wǎng)。

簡(jiǎn)單的理解就是把發(fā)送到虛擬子網(wǎng)地址10.0.0.3的報(bào)文封裝為發(fā)送到真實(shí)IP192.168.1.3的報(bào)文。這必然會(huì)有更大的數(shù)據(jù)開(kāi)銷,但卻簡(jiǎn)化了集群的網(wǎng)絡(luò)連接,讓分布在不同主機(jī)的容器好像都在同一個(gè)主機(jī)上一樣 。


overlay網(wǎng)絡(luò)會(huì)創(chuàng)建多個(gè)Docker主機(jī)之間的分布式網(wǎng)絡(luò)。該網(wǎng)絡(luò)位于(覆蓋)特定于主機(jī)的網(wǎng)絡(luò)之上,允許連接到它的容器(包括群集服務(wù)容器)安全地進(jìn)行通信。Docker透明地處理每個(gè)數(shù)據(jù)包與正確的Docker守護(hù)程序主機(jī)和正確的目標(biāo)容器的路由。


初始化swarm或?qū)ocker主機(jī)加入現(xiàn)有swarm時(shí),會(huì)在該Docker主機(jī)上創(chuàng)建兩個(gè)新網(wǎng)絡(luò):

1. ingress overlay 網(wǎng)絡(luò),處理與swarm集群服務(wù)相關(guān)的控制和數(shù)據(jù)流量。創(chuàng)建群組服務(wù)并且不將其連接到用戶定義的覆蓋網(wǎng)絡(luò)時(shí),服務(wù)將默認(rèn)連接到ingress overlay網(wǎng)絡(luò)。集群中只能有一個(gè)ingress overlay 網(wǎng)絡(luò)。

2. docker_gwbridge 橋接網(wǎng)絡(luò),它將各個(gè)Docker守護(hù)程序連接到參與該群集的其他Docker守護(hù)進(jìn)程。同時(shí)該docker_gwbridge 網(wǎng)絡(luò)將為主機(jī)上的容器提供訪問(wèn)外網(wǎng)的能力。


# docker network ls

# docker network inspect docker_gwbridge

# docker network inspect ingress


服務(wù)或容器一次可以連接到多個(gè)網(wǎng)絡(luò)。服務(wù)或容器只能通過(guò)它們各自連接的網(wǎng)絡(luò)進(jìn)行通信。


二、創(chuàng)建overlay網(wǎng)絡(luò)


三、加密overlay網(wǎng)絡(luò)



四、overlay 網(wǎng)絡(luò)實(shí)現(xiàn)原理


docker 會(huì)為每個(gè) overlay 網(wǎng)絡(luò)創(chuàng)建一個(gè)獨(dú)立的 network namespace,其中會(huì)有一個(gè) linux bridge br0,endpoint 還是由 veth pair 實(shí)現(xiàn),一端連接到容器中(即 eth0),另一端連接到 namespace 的 br0 上。

br0 除了連接所有的 endpoint,還會(huì)連接一個(gè) vxlan 設(shè)備,用于與其他 host 建立 vxlan tunnel。容器之間的數(shù)據(jù)就是通過(guò)這個(gè) tunnel 通信的。


邏輯網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)圖


五、參考


從docker單機(jī)到swarm模式的網(wǎng)絡(luò)變化

http://m.itdecent.cn/p/26e13631d625


Docker Swarm管理節(jié)點(diǎn)高可用分析

https://zhoujinl.github.io/2018/10/19/docker-swarm-manager-ha


Docker Swarm服務(wù)調(diào)度分析

https://zhoujinl.github.io/2018/09/20/docker-swarm-scheduler

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容