k8s(十六): VXLAN和Flannel

前言

目前k8s中比較常用的cni有calico、flannel、kube-router等,個人比較熟悉的是kube-router的bgp純直通方案,flannel則是另一款使用較多的比較簡單易用的方案,這裏着重瞭解一下flannel的vxlan這一常用模式

VXLAN

在瞭解flannel之前,有必要掌握vxlan的基礎知識。首先來看看vxlan協議的報文封裝格式:
在這裏插入圖片描述

說明:

vxlan,給數據中心大二層網絡使用,何爲大二層,又爲何需要vxlan?

1.vlan數量有限

vlan的tag位一個4個字節,其中12bit是給vlan id使用,也即是一共有4096個vlan id支持,在大型數據中心中不夠用,但這個問題其實QinQ(IEEE 802.1 ad)標準可以解決,重點原因是因爲第二點

2.mac地址表限制

虛擬化/容器化場景下,一臺物理機內部有衆多虛擬網卡,而外部的二層設備(交換機)是將mac地址都緩存入內存中的,且交換機內存空間一般較小,在虛擬化的數據中心中,如果mac表滿了,會出現大量的廣播泛洪,造成
極大的網絡資源和計算資源的浪費

3.靈活部署限制

如果虛機和物理機之間使用橋接網絡,那麼虛擬機則同樣受物理機網絡的限制,只能使用那一個vlan的地址,不同vlan下的虛機受制於vlan無法順暢的進行互相遷移,容易主機的資源利用率的不均衡。雖然可以通過物理機與交換設備全部通過trunk的方式連接來解決vlan切換這個問題,但是這樣無疑會形成一個巨大的傳統二層網絡空間,相應的BUM(Broadcast,Unknown Unicast,Multicast)風暴和交換機MAC地址表的問題也會隨之產生,這是無法接受的。

那麼vxlan是怎麼解決上面幾個問題的呢?

從上面的報文封裝圖可以看出,vxlan外層(二層頭部、三層頭部)繼續沿用現有標準,只是在傳輸層,使用了udp封裝,udp封裝之內,就是vxlan的協議封裝。VXLAN Tunnel EndPoint(簡稱VTE, 是指支持vxlan封裝、拆包的交換設備,一般可理解爲承載着虛擬機的物理機),通過vxlan header內部封裝的信息,拆包後直接將original layer 2 frame數據,轉發給相應的虛擬網卡。

如此,在外部的網絡設備層面,vxlan保持着傳統的通信方式,即各個VTE之間以UDP的方式互相通信;而在VTE層面,則通過報文封裝,實現了內部衆多的虛擬網卡mac地址之間的數據交換:
其一,24bit的VNID標識,實現了1600多萬個不同二層子網的區分;
其二,通過報文封裝的格式,
其三,通過VXLAN的封裝,實現了虛擬網卡之間越過傳統三層網絡,以特殊的二層數據幀交換的方式通信,走的是一套獨立於物理網絡(underlay network)的overlay network,在物理網絡上可以保持不變,但是同時,虛擬機的部署和遷移,又不用受物理網絡的限制,有利於物理資源利用率維持均衡

以上也就是爲什麼vxlan又稱爲虛擬大二層網絡,有了以上基礎鋪墊,下面來簡述一下flannel 的vxlan實現的工作具體流程。

Flannel

按照慣例,先上流程圖:

在這裏插入圖片描述

步驟詳解:

源端:

1)源容器veth0向目標容器發送數據,根據容器內的默認路由,數據首先發送給宿主機的docker0網橋
2)宿主機docker0網橋接受到數據後,宿主機查詢路由表,pod相關的路由都是交由flannel.1網卡,因此,將其轉發給flannel.1虛擬網卡處理
3)flannel.1接受到數據後,查詢etcd數據庫,獲取目標pod網段對應的目標宿主機地址、目標宿主機的flannel網卡的mac地址、vxlan vnid等信息。然後對數據進行udp封裝如下:
udp頭封裝:
source port 8285,target port 8285
udp內部封裝:
1.vxlan封裝:vxlan vnid等信息
2. original layer 2 frame封裝:source {源 flannel.1網卡mac地址} target{目標flannel.1網卡的mac地址}
完成以上udp封裝後,將數據轉發給物理機的eth0網卡

4)宿主機eth0接收到來自flannel.1的udp包,還需要將其封裝成正常的通信用的數據包,爲它加上通用的ip頭、二層頭,這項工作在由linux內核來完成。
Ethernet Header的信息:
source:{源宿主機機網卡的MAC地址}
target:{目標宿主機網卡的MAC地址}
IP Header的信息:
source:{源宿主機網卡的IP地址}
target:{目標宿主機網卡的IP地址}
通過此次封裝,一個真正可用的數據包就封裝完成,可以通過物理網絡傳輸了。

目標端:

5)目標宿主機的eth0接收到數據後,對數據包進行拆封,拆到udp層後,將其轉發給8285端口的flannel進程
6)目標宿主機端flannel拆除udp頭、vxlan頭,獲取到內部的原始數據幀,在原始數據幀內部,解析出源容器ip、目標容器ip,重新封裝成通用的數據包,查詢路由表,轉發給docker0網橋;
7)最後,docker0網橋將數據送達目標容器內的veth0網卡,完成容器之間的數據通信。

總結:

通過對vxlan設計思想和flannel的落地方案的互相印證,對這兩者會有更爲深刻的理解,同時,不難發現,flannel性能表現不佳的原因很可能是因爲反覆拆封包過程、etcd查詢這幾個步驟帶來的額外開銷。

參考:

https://blog.csdn.net/u010039418/article/details/90451081
https://www.cnblogs.com/cwind/p/10085146.html
https://events.static.linuxfound.org/sites/events/files/slides/2013-linuxcon.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章