概述
flannel是CoreOS提供用于解決Dokcer集群跨主機通訊的覆蓋網(wǎng)絡工具。它的主要思路是:預先留出一個網(wǎng)段,每個主機使用其中一部分,然后每個容器被分配不同的ip;讓所有的容器認為大家在同一個直連的網(wǎng)絡,底層通過UDP/VxLAN等進行報文的封裝和轉(zhuǎn)發(fā)。
架構(gòu)圖
跨主機容器通信
這里涉及到一個知識點,就是底層通過UDP/VxLAN設備進行報文的封裝和轉(zhuǎn)發(fā),以下來敘述一下這個過程,當報文從Pod1:10.1.15.2/24要去往Pod4: 10.1.20.2/24這個容器的時候,要分別經(jīng)過以下步驟。
因為Pod1的veth0和docker0的一段網(wǎng)卡相連,所以數(shù)據(jù)包會先發(fā)往docker0網(wǎng)橋,此時docker0會查詢自己所維護的路由表,沒有發(fā)現(xiàn)有10.1.20.2/24這個地址,所以會把數(shù)據(jù)包發(fā)送給默認路由,這里的默認路由即flannel網(wǎng)橋。
flannel網(wǎng)橋是一個VxLAN設備,它收到數(shù)據(jù)包后,檢查到包中的目的地址并不是自己的地址,所以他本應該這把這個數(shù)據(jù)包重新發(fā)送出去,因為他的下一層已經(jīng)是數(shù)據(jù)鏈路層,所以即將進行二層封包,即通過ARP協(xié)議來對以太網(wǎng)進行廣播誰是10.1.20.2/24,接受并記錄目的的MAC地址。但是由于它是一個VxLAN設備,其特殊性就是并沒有真正在二層發(fā)出這個 arp 包,而是由 linux kernel 引發(fā)一個”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 完成這項工作后,Linux kernel 就可以在 arp table 中找到 10.1.20.2/24對應的 MAC 地址并封裝二層以太包了。
Node 上 2 的 eth0 接收到上述 VXLAN 包,內(nèi)核也識別出這是一個 VXLAN 包,于是通過相反的步驟解包出來,最后傳達到POD4上去。
-
以太網(wǎng)
+關注
關注
40文章
5610瀏覽量
175322 -
集群
+關注
關注
0文章
102瀏覽量
17401
發(fā)布評論請先 登錄
Docker容器管理命令(一)
docker基礎知識和使用bmnnsdk時的docker常用命令
如何在docker容器內(nèi)使用宿主機上的顯示設備顯示圖像?
如何判斷是否在docker鏡像中?
跨網(wǎng)段獲取遠程主機MAC地址的方法與java實現(xiàn)
基于Docker的云資源彈性調(diào)度策略

評論