Kubernetes網絡插件Flannel的3種工做模式

跨主機通訊的一個解決方案是Flannel,由CoreOS推出,支持3種實現:UDP、VXLAN、host-gw
udp模式:使用設備flannel.0進行封包解包,不是內核原生支持,上下文切換較大,性能很是差
vxlan模式:使用flannel.1進行封包解包,內核原生支持,性能較強
host-gw模式:無需flannel.1這樣的中間設備,直接宿主機看成子網的下一跳地址,性能最強
host-gw的性能損失大約在10%左右,而其餘全部基於VXLAN「隧道」機制 的網絡方案,性能損失在20%~30%左右linux

1、UDP模式(性能差)

核心就是經過TUN設備flannel0實現(TUN設備是工做在三層的虛擬網絡設備,功能是:在操做系統內核和用戶應用程序之間傳遞IP包)
相比兩臺宿主機直接通訊,多出了flanneld的處理過程,這個過程,使用了flannel0這個TUN設備,僅在發出IP包的過程當中就要通過了三次用戶態到內核態的數據拷貝(linux的上下文切換代價比較大),因此性能很是差
原理以下:
docker

以flanel0爲例,操做系統將一個IP包發給flanel0,flanel0把IP包發給建立這個設備的應用程序:flanel進程(內核態->用戶態)
相反,flanel進程向flanel0發送一個IP包,IP包會出如今宿主機的網絡棧中,而後根據宿主機的路由表進行下一步處理(用戶態->內核態)
當IP包從容器通過docker0出如今宿主機,又根據路由表進入flanel0設備後,宿主機上的flanneld進程就會收到這個IP包數據庫

flannel管理的容器網絡裏,一臺宿主機上的全部容器,都屬於該宿主機被分配的「子網」,子網與宿主機的對應關係,存在Etcd中(例如Node1的子網是100.96.1.0/24,container-1的IP地址是100.96.1.2)
當flanneld進程處理flannel0傳入的IP包時,就能夠根據目的IP地址(如100.96.2.3),匹配到對應的子網(好比100.96.2.0/24),從Etcd中找到這個子網對應的宿主機的IP地址(10.168.0.3)
而後flanneld在收到container-1給container-2的包後,把這個包直接封裝在UDP包裏,發送給Node2(UDP包的源地址,就是Node1,目的地址是Node2)
每臺宿主機的flanneld都監聽着8285端口,因此flanneld只要把UDP發給Node2的8285端口就好了。而後Node2的flanneld再把IP包發送給它所管理的TUN設備flannel0,flannel0設備再發給docker0網絡

2、VXLAN模式(性能較好)

什麼是VXLAN?

VXLAN,即Virtual Extensible LAN(虛擬可擴展局域網),是Linux自己支持的一網種網絡虛擬化技術。VXLAN能夠徹底在內核態實現封裝和解封裝工做,從而經過「隧道」機制,構建出覆蓋網絡(Overlay Network)併發

VXLAN的設計思想是:
在現有的三層網絡之上,「覆蓋」一層虛擬的、由內核VXLAN模塊負責維護的二層網絡,使得鏈接在這個VXLAN二nfcu網絡上的「主機」(虛擬機或容器均可以),能夠像在同一個局域網(LAN)裏那樣自由通訊。
爲了可以在二nfcu網絡上打通「隧道」,VXLAN會在宿主機上設置一個特殊的網絡設備做爲「隧道」的兩端,叫VTEP:VXLAN Tunnel End Point(虛擬隧道端點)
原理以下:性能

flanel.1設備,就是VXLAN的VTEP,即有IP地址,也有MAC地址
與UPD模式相似,當container-發出請求後,上的地址10.1.16.3的IP包,會先出如今docker網橋,再路由到本機的flannel.1設備進行處理(進站)
爲了可以將「原始IP包」封裝併發送到正常的主機,VXLAN須要找到隧道的出口:上的宿主機的VTEP設備,這個設備信息,由宿主機的flanneld進程維護學習

VTEP設備之間經過二層數據楨進行通訊
源VTEP設備收到原始IP包後,在上面加上一個目的MAC地址,封裝成一個導去數據楨,發送給目的VTEP設備(獲取 MAC地址須要經過三層IP地址查詢,這是ARP表的功能)
操作系統

封裝過程只是加了一個二層頭,不會改變「原始IP包」的內容
這些VTEP設備的MAC地址,對宿主機網絡來講沒什麼實際意義,稱爲內部數據楨,並不能在宿主機的二層網絡傳輸,Linux內核還須要把它進一步封裝成爲宿主機的一個普通的數據楨,好讓它帶着「內部數據楨」經過宿主機的eth0進行傳輸,Linux會在內部數據楨前面,加上一個我死的VXLAN頭,VXLAN頭裏有一個重要的標誌叫VNI,它是VTEP識別某個數據楨是否是應該歸本身處理的重要標識。
在Flannel中,VNI的默認值是1,這也是爲何宿主機的VTEP設備都叫flannel.1的緣由設計

一個flannel.1設備只知道另外一端flannel.1設備的MAC地址,殊不知道對應的宿主機地址是什麼。
在linux內核裏面,網絡設備進行轉發的依據,來自FDB的轉發數據庫,這個flannel.1網橋對應的FDB信息,是由flanneld進程維護的
linux內核再在IP包前面加上二層數據楨頭,把Node2的MAC地址填進去。這個MAC地址自己,是Node1的ARP表要學習的,需
Flannel維護,這時候Linux封裝的「外部數據楨」的格式以下
3d

而後Node1的flannel.1設備就能夠把這個數據楨從eth0發出去,再通過宿主機網絡來到Node2的eth0
Node2的內核網絡棧會發現這個數據楨有VXLAN Header,而且VNI爲1,Linux內核會對它進行拆包,拿到內部數據楨,根據VNI的值,所它交給Node2的flannel.1設備

3、host-gw模式(性能最高)

這是一種純三層網絡的方案,性能最高

howt-gw模式的工做原理,就是將每一個Flannel子網的下一跳,設置成了該子網對應的宿主機的IP地址,也就是說,宿主機(host)充當了這條容器通訊路徑的「網關」(Gateway),這正是host-gw的含義 全部的子網和主機的信息,都保存在Etcd中,flanneld只須要watch這些數據的變化 ,實時更新路由表就好了。 核心是IP包在封裝成楨的時候,使用路由表的「下一跳」設置上的MAC地址,這樣能夠通過二層網絡到達目的宿主機

相關文章
相關標籤/搜索