Flannel是kubernetes的網(wǎng)絡(luò)插件之一,通過構(gòu)建k8s集群節(jié)點(diǎn)之間的overlay網(wǎng)絡(luò),實(shí)現(xiàn)跨節(jié)點(diǎn)通信等功能。flannel常用的網(wǎng)絡(luò)轉(zhuǎn)發(fā)模式有hostgw、udp、vxlan等,在實(shí)際生產(chǎn)中常用的是vxlan模式。
子網(wǎng)劃分
k8s會(huì)為每個(gè)集群節(jié)點(diǎn)劃分子網(wǎng),這樣pod調(diào)度到某節(jié)點(diǎn)時(shí),就會(huì)按照該節(jié)點(diǎn)的子網(wǎng)網(wǎng)段分配ip,保障pod ip的集群唯一性。
我們可以查看/run/flannel/subnet.env 文件,里面主要包括當(dāng)前節(jié)點(diǎn)的子網(wǎng)信息。例如本機(jī)集群192.168.249.10節(jié)點(diǎn)子網(wǎng)網(wǎng)段是10.244.0.0/24,192.168.249.12節(jié)點(diǎn)子網(wǎng)網(wǎng)段是10.244.1.0/24
Flannel通過daemonset的方式在每個(gè)k8s節(jié)點(diǎn)上運(yùn)行了一個(gè)flanneld的服務(wù),通過flanneld進(jìn)程對(duì)節(jié)點(diǎn)進(jìn)行創(chuàng)建隧道,添加路由信息,修改iptables等操作。
跨節(jié)點(diǎn)Pod通信
我們以vxlan模式為例看一下flannel如何實(shí)現(xiàn)的pod間的通信。
Flannel創(chuàng)建名為flannel.1的vxlan設(shè)備(nolearning),設(shè)備ip是子網(wǎng)的第一個(gè)IP 10.244.1.0,并把設(shè)備的mac和ip和本節(jié)點(diǎn)的ip記錄到etcd中。還會(huì)創(chuàng)建名為cni0的網(wǎng)橋,網(wǎng)橋的ip是子網(wǎng)的第二個(gè)ip 10.244.1.1,起到docker0網(wǎng)橋的作用。
我們先看一下跨節(jié)點(diǎn)通信的流程圖,然后一步一步查看數(shù)據(jù)包流向。
我們從節(jié)點(diǎn)192.168.249.12上的pod1?10.244.1.4中ping節(jié)點(diǎn)192.168.249.10上的pod2? 10.244.0.2
進(jìn)入pod1 執(zhí)行route -n,我們發(fā)現(xiàn)pod的默認(rèn)網(wǎng)關(guān)是10.244.1.1,也就是cni0
為什么pod的eth0可以發(fā)給cni0網(wǎng)橋呢,查看pod的eth0網(wǎng)卡,發(fā)現(xiàn)他的對(duì)端是if11。
我們?cè)倏此拗鳈C(jī)上的網(wǎng)絡(luò)設(shè)備if11是vethc8894304,這個(gè)設(shè)備在cni0網(wǎng)橋上。這里可以理解成一根網(wǎng)線一頭插在pod里,另一頭插在了cni0網(wǎng)橋上。
到了cni0網(wǎng)橋其實(shí)就到了宿主機(jī),再看宿主機(jī)的路由信息??梢园l(fā)現(xiàn)flannel專門為每個(gè)子網(wǎng)網(wǎng)段創(chuàng)建了一條路由,10.244.0.0/24網(wǎng)段就通過宿主機(jī)上的vxlan設(shè)備flannel.1發(fā)給網(wǎng)關(guān)10.244.0.0,網(wǎng)關(guān)的ip、mac與宿主機(jī)的對(duì)應(yīng)關(guān)系都可以在etcd中查到。
之后通過flannel.1 進(jìn)行vxlan封包。vxlan包結(jié)構(gòu)如圖所示。
包內(nèi)層就是pod到pod發(fā)送的二層鏈路層包,在此基礎(chǔ)上添加了vxlan的header,并使用udp、宿主機(jī)的ip和mac信息進(jìn)行封包后,傳輸給對(duì)方宿主機(jī)再進(jìn)行拆包。
最后查看對(duì)端宿主機(jī)的路由表,route -n。
對(duì)于本機(jī)pod網(wǎng)段的數(shù)據(jù)包 10.244.0.0/24,都轉(zhuǎn)給了虛擬網(wǎng)橋cni0,而cni0再通過上面的veth對(duì)將數(shù)據(jù)包轉(zhuǎn)發(fā)到pod中。至此就完成了跨node節(jié)點(diǎn)的pod通信。
同節(jié)點(diǎn)Pod通信
了解了跨節(jié)點(diǎn)pod通信,再考慮同節(jié)點(diǎn)pod通信就明白,直接通過cni0網(wǎng)橋就可以了。
UDP與Host-gw模式
Flannel還提供了UDP和Host-gw兩種模式。UDP模式和Vxlan基本一致,只是封包方式不同,UDP封包結(jié)構(gòu)如下圖所示。
所以UDP封包就是直接將內(nèi)層IP層數(shù)據(jù)包封裝到了UDP中,由于是使用flanneld應(yīng)用層面進(jìn)行封包解包,效果比vxlan內(nèi)核封包要差,使用較少。
我們修改flannel的configmap,將flannel從vxlan模式換成host-gw模式,并重啟flannel的pod。這樣就從vxlan模式切換成了host-gw模式。
kubectl edit cm -nkube-system kube-flannel-cfg
我們發(fā)現(xiàn)其他pod網(wǎng)段的路由信息有所變化,輸出網(wǎng)卡從flannel.1變成了本機(jī)網(wǎng)卡,因?yàn)椴恍枰M(jìn)行封包,同時(shí)flannel的mtu從1450改成1500。而網(wǎng)關(guān)直接配置為宿主機(jī)ip,這就需要所有的集群節(jié)點(diǎn)處于同一個(gè)二層網(wǎng)絡(luò)中,即二層可達(dá)。這也是host-gw模式的最大限制。
文章來源:http://www.zghlxwxcb.cn/news/detail-417629.html
最后,如果你對(duì)kubernetes感興趣的話,歡迎關(guān)注~文章來源地址http://www.zghlxwxcb.cn/news/detail-417629.html
到了這里,關(guān)于Kubernetes網(wǎng)絡(luò)插件flannel原理簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!