一蒸辆、跨主機(jī)網(wǎng)絡(luò)解決方案
我們知道治拿,Docker 的幾種網(wǎng)絡(luò)方案:none、host捷绑、bridge 和 joined 容器韩脑,它們解決了單個(gè) Docker Host 內(nèi)容器通信的問題。
那么跨主機(jī)容器間通信的方案又有哪些呢粹污?
跨主機(jī)網(wǎng)絡(luò)方案包括:
1. docker 原生的 overlay 和 macvlan段多。
2. 第三方方案:常用的包括 flannel、weave 和 calico壮吩。
Docker 網(wǎng)絡(luò)是一個(gè)非辰裕活躍的技術(shù)領(lǐng)域,不斷有新的方案開發(fā)出來鸭叙,那么要問個(gè)非常重要的問題了: 如此眾多的方案是如何與 docker 集成在一起的觉啊?答案是:libnetwork 以及 CNM。
libnetwork 是 docker 容器網(wǎng)絡(luò)庫沈贝,最核心的內(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 可以包含來自不同 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ò)模型似舵,按照該模型開發(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 通過虛擬出一個(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)哮内。
簡單的理解就是把發(fā)送到虛擬子網(wǎng)地址10.0.0.3的報(bào)文封裝為發(fā)送到真實(shí)IP192.168.1.3的報(bào)文。這必然會(huì)有更大的數(shù)據(jù)開銷壮韭,但卻簡化了集群的網(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ǎng)的能力涌萤。
# docker network ls
# docker network inspect docker_gwbridge
# docker network inspect ingress
服務(wù)或容器一次可以連接到多個(gè)網(wǎng)絡(luò)淹遵。服務(wù)或容器只能通過它們各自連接的網(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ù)就是通過這個(gè) tunnel 通信的咙咽。
五、參考
從docker單機(jī)到swarm模式的網(wǎng)絡(luò)變化
http://www.reibang.com/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