概述
flannel是CoreOS提供用于解決Dokcer集群跨主機(jī)通訊的覆蓋網(wǎng)絡(luò)工具。它的主要思路是:預(yù)先留出一個(gè)網(wǎng)段,每個(gè)主機(jī)使用其中一部分,然后每個(gè)容器被分配不同的ip;讓所有的容器認(rèn)為大家在同一個(gè)直連的網(wǎng)絡(luò),底層通過UDP/VxLAN等進(jìn)行報(bào)文的封裝和轉(zhuǎn)發(fā)。
架構(gòu)圖
跨主機(jī)容器通信
這里涉及到一個(gè)知識點(diǎn),就是底層通過UDP/VxLAN設(shè)備進(jìn)行報(bào)文的封裝和轉(zhuǎn)發(fā),以下來敘述一下這個(gè)過程,當(dāng)報(bào)文從Pod1:10.1.15.2/24要去往Pod4: 10.1.20.2/24這個(gè)容器的時(shí)候,要分別經(jīng)過以下步驟。
因?yàn)镻od1的veth0和docker0的一段網(wǎng)卡相連,所以數(shù)據(jù)包會先發(fā)往docker0網(wǎng)橋,此時(shí)docker0會查詢自己所維護(hù)的路由表,沒有發(fā)現(xiàn)有10.1.20.2/24這個(gè)地址,所以會把數(shù)據(jù)包發(fā)送給默認(rèn)路由,這里的默認(rèn)路由即flannel網(wǎng)橋。
flannel網(wǎng)橋是一個(gè)VxLAN設(shè)備,它收到數(shù)據(jù)包后,檢查到包中的目的地址并不是自己的地址,所以他本應(yīng)該這把這個(gè)數(shù)據(jù)包重新發(fā)送出去,因?yàn)樗南乱粚右呀?jīng)是數(shù)據(jù)鏈路層,所以即將進(jìn)行二層封包,即通過ARP協(xié)議來對以太網(wǎng)進(jìn)行廣播誰是10.1.20.2/24,接受并記錄目的的MAC地址。但是由于它是一個(gè)VxLAN設(shè)備,其特殊性就是并沒有真正在二層發(fā)出這個(gè) arp 包,而是由 linux kernel 引發(fā)一個(gè)”L3 MISS”事件并將 arp 請求發(fā)到用戶空間的 Flannel 程序中。
flannel程序接收到”L3 MISS”事件以及 arp 請求 (who is10.1.20.2/24 ) 后,并不會像以太網(wǎng)發(fā)送ARP請求,而是在etcd中匹配10.1.20.2/24的信息,從而找到Node2的MAC地址。Flannel 將查詢到的信息放入 Node1 host 的 arp cache 表中,flannel0 完成這項(xiàng)工作后,Linux kernel 就可以在 arp table 中找到 10.1.20.2/24對應(yīng)的 MAC 地址并封裝二層以太包了。
Node 上 2 的 eth0 接收到上述 VXLAN 包,內(nèi)核也識別出這是一個(gè) VXLAN 包,于是通過相反的步驟解包出來,最后傳達(dá)到POD4上去。
-
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5450瀏覽量
172177 -
集群
+關(guān)注
關(guān)注
0文章
88瀏覽量
17188
發(fā)布評論請先 登錄
相關(guān)推薦
評論