kubernetes網(wǎng)絡(luò)模型flannel和calico解析和對比
有段時間沒寫技術(shù)文章了,一直忙著找工作,刷力扣,看書。也沒有找時間好好沉淀下?,F(xiàn)在補上。
本文探討kubernetes常見的網(wǎng)絡(luò)模型flannel和calico,會介紹兩種網(wǎng)絡(luò)模型的各種模式以及通信原理,然后對比相同點和不同點以及優(yōu)缺點。網(wǎng)上也有很多參考資料,也是參考了這些資料整理出來的。
首先,我們需要了解下kubernetes的網(wǎng)絡(luò)模型的基本要求。
每個Pod都擁有一個獨立的IP地址,并假定所有Pod都在一個可以直接連通的、扁平的網(wǎng)絡(luò)空間中。
具體要求有3點
(1)所有容器都可以在不用NAT的方式下同別的容器通信。
(2)所有節(jié)點都可以在不用NAT的方式下同所有容器通信,反之亦然。
(3)容器的地址和別人看到的地址是同一個地址。
主要就是兩個工作
1、網(wǎng)絡(luò)模型需要分配和管理pod的ip,保證ip不沖突。
2、網(wǎng)絡(luò)模型需要將這些信息通過各種方式同步給所有節(jié)點
不管是flannel和calico就是實現(xiàn)了這兩個工作。
現(xiàn)在來探討下flannel和calico如何實現(xiàn)這兩個工作。
flannel
flannel是通過flanneld進程分配ip,并通過etcd進行持久化存儲。根據(jù)不同模型采用不同方式將信息同步給其他節(jié)點。
模式一:udp
在udp模式下,flannel會創(chuàng)建一個tun設(shè)備flannel0(TUN設(shè)備是工作在三層的虛擬網(wǎng)絡(luò)設(shè)備,在操作系統(tǒng)內(nèi)核和用戶程序之間傳遞ip包),這個設(shè)備由flanneld創(chuàng)建。一端是綁定到docker0,作為docker0默認網(wǎng)關(guān)。一端是flanneld。如果flannel0收到數(shù)據(jù),會將其發(fā)送給創(chuàng)建其的進程即flanneld。
為了描述方便,我將flannel分配給pod的ip稱為私網(wǎng)ip,將宿主機的ip稱為宿主機ip
flanneld會根據(jù)接收方私網(wǎng)ip地址,查詢本地緩存或者去etcd查詢。得到接收方宿主機ip。然后再封裝一層ip報文,其接收方ip即剛才查詢到的接收方宿主機ip,目的端口是自己監(jiān)聽的端口。然后傳遞給宿主機的網(wǎng)卡。宿主機網(wǎng)卡根據(jù)ip發(fā)送給接收方宿主機。由于目標端口是flanneld監(jiān)聽端口,所以接收方宿主機收到報文后會將其發(fā)送給宿主機上的flanneld,其會將報文拆開,然后發(fā)送給docker0。docker0發(fā)送給對應(yīng)的pod。
總結(jié)下:
flannel在啟動時會創(chuàng)建一個flanneld進程,其會創(chuàng)建一個tun設(shè)備flannel0,作為docker0默認網(wǎng)關(guān)。并且flanneld會根據(jù)當前集群節(jié)點給每個節(jié)點分配一個私有網(wǎng)段(會預(yù)留一部分供后續(xù)增加節(jié)點使用),并保存到etcd中,然后修改docker0啟動參數(shù),加上--bip=分配的私有網(wǎng)段。這樣docker0在給pod分配ip的時候就只會使用這個私網(wǎng)網(wǎng)段的ip,這樣ip就不會沖突了。到這里第一個工作就做完了。
相同節(jié)點下的pod通信,直接通過docker0進行通信。
不同節(jié)點下的pod通信,會通過docker0傳遞給flannel0,然后由flanneld封包,發(fā)送給宿主機網(wǎng)卡。并由其發(fā)送給接收方宿主機。然后傳遞給接收方宿主機flanneld,解包,通過flannel0經(jīng)由docker0傳給對端pod。
流程如下
pod1->docker0->flannel0(flanneld封包)->(發(fā)送方網(wǎng)卡)->(中間路由器)->(接收方網(wǎng)卡)->flannel0(flannel解包)->docker0->pod2
流程很復(fù)雜很長。而且由于flanneld是用戶進程,封包和解包需要上下文切換等操作。性能非常差。一般僅測試使用。
模式二:VxLan
VXLAN,即Virtual Extensible LAN(虛擬可擴展局域網(wǎng)),是Linux本身支持的一網(wǎng)種網(wǎng)絡(luò)虛擬化技術(shù)。VXLAN可以完全在內(nèi)核態(tài)實現(xiàn)封裝和解封裝工作,從而通過“隧道”機制,構(gòu)建出覆蓋網(wǎng)絡(luò)(Overlay Network)
為了能夠在二層網(wǎng)絡(luò)上打通“隧道”,VXLAN會在宿主機上設(shè)置一個特殊的網(wǎng)絡(luò)設(shè)備作為“隧道”的兩端,叫VTEP:VXLAN Tunnel End Point(虛擬隧道端點)
在該模式下,前面的ip分配工作不變(flannel0改成flannel.1),需要在發(fā)送方宿主機和接收方宿主機建立VXLAN隧道,即要創(chuàng)建VTEP。由其進行內(nèi)核態(tài)的封裝和解封裝操作,并且其是二層封裝,即封裝mac地址,而非udp的ip地址。
總結(jié)下:
docker0會將非本機的ip數(shù)據(jù)包發(fā)送給flannel.1,flannel.1找到目標主機的VTEP設(shè)備(通過本地緩存或者etcd查詢),設(shè)備信息由flanneld進程維護。找到設(shè)備信息后,封裝mac報文。然后發(fā)送給目標VTEP設(shè)備。目標VTEP設(shè)備收到后,進行拆包,然后經(jīng)由docker0發(fā)送給對端pod。
流程如下
pod1->docker0->flannel.1->VTEP1->(發(fā)送方網(wǎng)卡)->(中間路由器)->(接收方網(wǎng)卡)->VTEP2->flannel.1->docker0->pod2
流程還是很長,但是由于封包和解包操作由內(nèi)核執(zhí)行,所以效率相較udp更高。
模式三:host-GW
該模式下前面的ip分配和管理工作不變(不需要flannel0和flannel.1),還是由flanneld管理。其直接將etcd中保存的私網(wǎng)ip和宿主機ip信息轉(zhuǎn)化為路由信息下發(fā)給每個宿主機。將宿主機充當網(wǎng)關(guān)。flanneld只需要watch監(jiān)聽etcd中信息變化做對應(yīng)的修改。
流程如下
pod1->docker0->(發(fā)送方網(wǎng)卡)->(接收方網(wǎng)卡)->docker0->pod2
流程變短很多,但是由于需要將宿主機充當網(wǎng)關(guān)使用,所以要求,兩臺機器在同一個子網(wǎng)中。其效率也很高,但是當集群節(jié)點變多,路由信息不好維護。
Calico
Calico是采用三層的方案,其通過felix分配和管理ip,并通過bgp協(xié)議通告路由信息。
felix主要是負責網(wǎng)絡(luò)接口管理和監(jiān)聽、路由、ARP 管理、ACL 管理和同步、狀態(tài)上報等,可以類比成flanneld。由其來分配和管理ip,并且也是通過etcd進行持久化存儲。
通過bird進行bgp協(xié)議廣播。默認情況下兩兩節(jié)點需要互聯(lián),可以使用Route Reflector(RR)模式,選擇一個節(jié)點作為RR節(jié)點,其他節(jié)點與該節(jié)點互聯(lián),由RR節(jié)點同步其他節(jié)點的路由信息。
Calico兩種工作模式
IPIP模式
IPIP網(wǎng)絡(luò)就是將IP網(wǎng)絡(luò)封裝在IP網(wǎng)絡(luò)里。IPIP網(wǎng)絡(luò)的特點是所有pod的數(shù)據(jù)流量都從隧道tunl0發(fā)送,并且在tunl0這增加了一層傳輸層的封包。
類似flannel的vxlan模式,區(qū)別是ipip是三層,vxlan是二層隧道。
BGP模式
通過felix管理ip和路由,通過bird廣播bgp協(xié)議,通告路由信息。
類似flannel的host-Gw模式,區(qū)別是不需要在同一個子網(wǎng)中。
如果節(jié)點數(shù)量不多,那么flannel和calico都可以,如果節(jié)點數(shù)量較多,最好使用calico
除開Calico的bgp模式,理論上性能排序
flannel vxlan>calico ipip > flannel udp
理由是vxlan和ipip雖然都是內(nèi)核態(tài)封包和解包,但是vxlan是二層包,ipip是三層包,vxlan報文頭更短,一般來說層級更低,效率會更高。
至于ipip大于udp是因為一個是內(nèi)核態(tài)一個是用戶態(tài),當然內(nèi)核態(tài)性能更好。
以上個人屬于個人觀點,有不同意見歡迎交流