最近一直在研究kubernetes陡蝇,搭建集群時(shí)總是遇到一些未知的坑(對于我來說)践樱,為了搞明白kubernetes翰灾,今天仔細(xì)調(diào)研了一下flannel缕粹。
flannel,k8s的網(wǎng)絡(luò)模型纸淮,為k8s集群內(nèi)的容器提供網(wǎng)絡(luò)服務(wù)的組件平斩。
主要作用:
為集群內(nèi)所有容器提供一個(gè)扁平化的網(wǎng)絡(luò)環(huán)境,即:所有容器在flannel提供的網(wǎng)絡(luò)平面上可以看作是在同一網(wǎng)段咽块,自由通信绘面。其模型為全部的容器使用一個(gè)network,然后在每個(gè)host上從network中劃分一個(gè)子網(wǎng)subnet侈沪。為host上的容器創(chuàng)建網(wǎng)絡(luò)時(shí)揭璃,從subnet中劃分一個(gè)ip給容器。這樣就大大提高了容器之間工作效率峭竣,不用考慮IP轉(zhuǎn)換問題塘辅。
已上圖為例解釋flannel網(wǎng)絡(luò)模型中容器的通信方式:
1、容器網(wǎng)卡是通過docker0橋接到flannel0網(wǎng)卡皆撩,而每個(gè)host對應(yīng)的flannel0網(wǎng)段為10.1.x.[1-255]/24扣墩,而flannel所組成的一個(gè)跨host的網(wǎng)段為10.1.x.x/16哲银,而flannel0則為flanneld進(jìn)程虛擬出來的網(wǎng)卡。
2呻惕、docker0的地址是由 /run/flannel/subnet.env 的 FLANNEL_SUBNET 參數(shù)決定的荆责。在啟動(dòng)flannel的同時(shí)會(huì)產(chǎn)生一個(gè)通過flannel生成的配置文件subnet.env,參數(shù)內(nèi)容如下:
FLANNEL_NETWORK=10.0.0.0/16?
FLANNEL_SUBNET=10.0.61.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
3亚脆、跨接點(diǎn)容器之間通信流程
containerA --> docker0 --> flannel0 --> NodeA --> (IP Address) -->? NodeB --> flannel0 --> docker0 --> containerB
(1) 容器A向容器B請求數(shù)據(jù)做院,首先通過路由規(guī)則將數(shù)據(jù)發(fā)往docker0,docker0接受到數(shù)據(jù)后通過路由規(guī)則將數(shù)據(jù)包轉(zhuǎn)交給本節(jié)點(diǎn)的flannel0處理濒持。
(2)flannel0 將數(shù)據(jù)進(jìn)行封裝并發(fā)給宿主機(jī)的eth0键耕,然后走TCP協(xié)議轉(zhuǎn)發(fā)給containerB所在的宿主機(jī)。
(3)containerB所在的宿主機(jī)接收到數(shù)據(jù)后柑营,根據(jù)路由規(guī)則轉(zhuǎn)發(fā)給flannel0屈雄。
(4)flannel0 再次根據(jù)路由協(xié)議將數(shù)據(jù)包發(fā)送給docker0
(5)最后數(shù)據(jù)包到達(dá)containerB,完成容器之間的數(shù)據(jù)通信官套。