摘要:是一個(gè)專為定制的三層網(wǎng)絡(luò)解決方案,主要用于解決容器的跨主機(jī)通信問(wèn)題。收到的數(shù)據(jù)包被轉(zhuǎn)發(fā)到進(jìn)程。查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到。然后在網(wǎng)絡(luò)層的源和目的均是容器的,虛擬。默認(rèn)也是使用容器網(wǎng)絡(luò)方案,其官網(wǎng)也清晰的畫(huà)出了的。
前言
我們知道docker官方并沒(méi)有提供多主機(jī)的容器通信方案,單機(jī)網(wǎng)絡(luò)的模式主要有host,container,brige,none。none這種模式,顧名思義就是docker本身不去管理網(wǎng)絡(luò)模式,交由其他管理和分配,比如cni。Flannel是一個(gè)專為kubernetes定制的三層網(wǎng)絡(luò)解決方案,主要用于解決容器的跨主機(jī)通信問(wèn)題。
首先,flannel利用Kubernetes API或者etcd用于存儲(chǔ)整個(gè)集群的網(wǎng)絡(luò)配置,其中最主要的內(nèi)容為設(shè)置集群的網(wǎng)絡(luò)地址空間。例如,設(shè)定整個(gè)集群內(nèi)所有容器的IP都取自網(wǎng)段“10.1.0.0/16”。
接著,flannel在每個(gè)主機(jī)中運(yùn)行flanneld作為agent,它會(huì)為所在主機(jī)從集群的網(wǎng)絡(luò)地址空間中,獲取一個(gè)小的網(wǎng)段subnet,本主機(jī)內(nèi)所有容器的IP地址都將從中分配。
然后,flanneld再將本主機(jī)獲取的subnet以及用于主機(jī)間通信的Public IP,同樣通過(guò)kubernetes API或者etcd存儲(chǔ)起來(lái)。
最后,flannel利用各種backend ,例如udp,vxlan,host-gw等等,跨主機(jī)轉(zhuǎn)發(fā)容器間的網(wǎng)絡(luò)流量,完成容器間的跨主機(jī)通信。
Flannel為每個(gè)主機(jī)提供獨(dú)立的子網(wǎng),整個(gè)集群的網(wǎng)絡(luò)信息存儲(chǔ)在etcd上。對(duì)于跨主機(jī)的轉(zhuǎn)發(fā),目標(biāo)容器的IP地址,需要從etcd獲取。
先上圖,比較直觀:
步驟:
IP數(shù)據(jù)報(bào)被封裝并通過(guò)容器的eth0發(fā)送。
Container1的eth0通過(guò)veth對(duì)與Docker0交互并將數(shù)據(jù)包發(fā)送到Docker0。然后Docker0轉(zhuǎn)發(fā)包。
Docker0確定Container3的IP地址,通過(guò)查詢本地路由表到外部容器,并將數(shù)據(jù)包發(fā)送到虛擬NIC Flannel0。
Flannel0收到的數(shù)據(jù)包被轉(zhuǎn)發(fā)到Flanneld進(jìn)程。 Flanneld進(jìn)程封裝了數(shù)據(jù)包通過(guò)查詢etcd維護(hù)的路由表并發(fā)送數(shù)據(jù)包通過(guò)主機(jī)的eth0。
數(shù)據(jù)包確定網(wǎng)絡(luò)中的目標(biāo)主機(jī)主機(jī)。
目的主機(jī)的Flanneld進(jìn)程監(jiān)聽(tīng)8285端口,負(fù)責(zé)解封包。
解封裝的數(shù)據(jù)包將轉(zhuǎn)發(fā)到虛擬NICFlannel0。
Flannel0查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到Docker0。
Docker0確定目標(biāo)容器并發(fā)送包到目標(biāo)容器。
在常用的vxlan模式中,涉及到上面步驟提到的封包和拆包,這也是Flannel網(wǎng)絡(luò)傳輸效率相對(duì)低的原因。
下面重點(diǎn)說(shuō)一下host-gw模式。
hostgw是最簡(jiǎn)單的backend,它的原理非常簡(jiǎn)單,直接添加路由,將目的主機(jī)當(dāng)做網(wǎng)關(guān),直接路由原始封包。
例如,我們從etcd中監(jiān)聽(tīng)到一個(gè)EventAdded事件subnet為10.1.15.0/24被分配給主機(jī)Public IP 192.168.0.100,hostgw要做的工作就是在本主機(jī)上添加一條目的地址為10.1.15.0/24,網(wǎng)關(guān)地址為192.168.0.100,輸出設(shè)備為上文中選擇的集群間交互的網(wǎng)卡即可。對(duì)于EventRemoved事件,只需刪除對(duì)應(yīng)的路由。
因?yàn)闆](méi)有了封包和拆包,host-gw的性能是最好的。
不過(guò)host-gw 要求主機(jī)網(wǎng)絡(luò)二層直接互聯(lián)。所以每個(gè)節(jié)點(diǎn)上有n-1個(gè)路由,而n個(gè)節(jié)點(diǎn)一共有n(n-1)/2個(gè)路由以保證flannel的flat網(wǎng)絡(luò)能力。
為什么host-gw 要求主機(jī)網(wǎng)絡(luò)二層直接互聯(lián)?
首先通過(guò)抓包分析,抓包結(jié)果如下圖:
可以看出host-gw在傳輸層走的是tcp。然后在網(wǎng)絡(luò)層的源IP和目的IP均是容器的IP,虛擬IP。這就決定了二層互聯(lián),因?yàn)橹挥薪粨Q機(jī)是不關(guān)注源IP和目的IP。假如兩臺(tái)主機(jī)在兩個(gè)lan中,二層不通,三層通,那么就需要路由器,而路由器是無(wú)法識(shí)別容器的這些ip。當(dāng)然也可以配置路由規(guī)則,但是顯然沒(méi)有這么做的。
Openshift默認(rèn)也是使用Flannel host-gw容器網(wǎng)絡(luò)方案,其官網(wǎng)也清晰的畫(huà)出了host-gw的data flow diagram。
示例配置和啟動(dòng)參數(shù)示例配置:
{ "Network": "10.0.0.0/8", "SubnetLen": 20, "SubnetMin": "10.10.0.0", "SubnetMax": "10.99.0.0", "Backend": { "Type": "udp", "Port": 7890 } }
啟動(dòng)參數(shù):
--public-ip="": IP accessible by other nodes for inter-host communication. Defaults to the IP of the interface being used for communication. --etcd-endpoints=http://127.0.0.1:4001: a comma-delimited list of etcd endpoints. --etcd-prefix=/coreos.com/network: etcd prefix. --etcd-keyfile="": SSL key file used to secure etcd communication. --etcd-certfile="": SSL certification file used to secure etcd communication. --etcd-cafile="": SSL Certificate Authority file used to secure etcd communication. --kube-subnet-mgr: Contact the Kubernetes API for subnet assignment instead of etcd. --iface="": interface to use (IP or name) for inter-host communication. Defaults to the interface for the default route on the machine. This can be specified multiple times to check each option in order. Returns the first match found. --iface-regex="": regex expression to match the first interface to use (IP or name) for inter-host communication. If unspecified, will default to the interface for the default route on the machine. This can be specified multiple times to check each regex in order. Returns the first match found. This option is superseded by the iface option and will only be used if nothing matches any option specified in the iface options. --iptables-resync=5: resync period for iptables rules, in seconds. Defaults to 5 seconds, if you see a large amount of contention for the iptables lock increasing this will probably help. --subnet-file=/run/flannel/subnet.env: filename where env variables (subnet and MTU values) will be written to. --subnet-lease-renew-margin=60: subnet lease renewal margin, in minutes. --ip-masq=false: setup IP masquerade for traffic destined for outside the flannel network. Flannel assumes that the default policy is ACCEPT in the NAT POSTROUTING chain. -v=0: log level for V logs. Set to 1 to see messages related to data path. --healthz-ip="0.0.0.0": The IP address for healthz server to listen (default "0.0.0.0") --healthz-port=0: The port for healthz server to listen(0 to disable) --version: print version and exit總結(jié)
接下來(lái),會(huì)重點(diǎn)講代碼的實(shí)現(xiàn)部分。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/33062.html
摘要:是一個(gè)專為定制的三層網(wǎng)絡(luò)解決方案,主要用于解決容器的跨主機(jī)通信問(wèn)題。收到的數(shù)據(jù)包被轉(zhuǎn)發(fā)到進(jìn)程。查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到。然后在網(wǎng)絡(luò)層的源和目的均是容器的,虛擬。默認(rèn)也是使用容器網(wǎng)絡(luò)方案,其官網(wǎng)也清晰的畫(huà)出了的。 前言 我們知道docker官方并沒(méi)有提供多主機(jī)的容器通信方案,單機(jī)網(wǎng)絡(luò)的模式主要有host,container,brige,none。none這種模式,顧名思義就是...
摘要:今天主要針對(duì)版本進(jìn)行源碼分析。外部接口的定義如下創(chuàng)建子網(wǎng)管理器負(fù)責(zé)子網(wǎng)的創(chuàng)建更新添加刪除監(jiān)聽(tīng)等,主要和打交道定義續(xù)約。在到期之前,子網(wǎng)管理器調(diào)用該方法進(jìn)行續(xù)約。 前言 之前在k8s與網(wǎng)絡(luò)--Flannel解讀一文中,我們主要講了Flannel整體的工作原理。今天主要針對(duì)Flannel v0.10.0版本進(jìn)行源碼分析。首先需要理解三個(gè)比較重要的概念: 網(wǎng)絡(luò)(Network):整個(gè)集群中...
摘要:今天主要針對(duì)版本進(jìn)行源碼分析。外部接口的定義如下創(chuàng)建子網(wǎng)管理器負(fù)責(zé)子網(wǎng)的創(chuàng)建更新添加刪除監(jiān)聽(tīng)等,主要和打交道定義續(xù)約。在到期之前,子網(wǎng)管理器調(diào)用該方法進(jìn)行續(xù)約。 前言 之前在k8s與網(wǎng)絡(luò)--Flannel解讀一文中,我們主要講了Flannel整體的工作原理。今天主要針對(duì)Flannel v0.10.0版本進(jìn)行源碼分析。首先需要理解三個(gè)比較重要的概念: 網(wǎng)絡(luò)(Network):整個(gè)集群中...
摘要:今天主要針對(duì)版本進(jìn)行源碼分析。外部接口的定義如下創(chuàng)建子網(wǎng)管理器負(fù)責(zé)子網(wǎng)的創(chuàng)建更新添加刪除監(jiān)聽(tīng)等,主要和打交道定義續(xù)約。在到期之前,子網(wǎng)管理器調(diào)用該方法進(jìn)行續(xù)約。 前言 之前在k8s與網(wǎng)絡(luò)--Flannel解讀一文中,我們主要講了Flannel整體的工作原理。今天主要針對(duì)Flannel v0.10.0版本進(jìn)行源碼分析。首先需要理解三個(gè)比較重要的概念: 網(wǎng)絡(luò)(Network):整個(gè)集群中...
摘要:前言有種方法可以讓集群外訪問(wèn)運(yùn)行在集群上的應(yīng)用程序。當(dāng)群集上運(yùn)行的應(yīng)用程序數(shù)量增加時(shí),這可能會(huì)導(dǎo)致端口沖突。由于這些原因,主機(jī)網(wǎng)絡(luò)不是使您的應(yīng)用程序可以從群集外部訪問(wèn)的好方法。例如,可以將網(wǎng)絡(luò)插件部署為在集群的所有節(jié)點(diǎn)上設(shè)置的守護(hù)進(jìn)程。 前言 有5種方法可以讓集群外訪問(wèn)運(yùn)行在Kubernetes集群上的應(yīng)用程序(pod)。接下來(lái)我們?cè)敿?xì)討論Kubernetes的hostNetwork,...
閱讀 1518·2023-04-25 19:00
閱讀 4246·2021-11-17 17:00
閱讀 1846·2021-11-11 16:55
閱讀 1598·2021-10-14 09:43
閱讀 3221·2021-09-30 09:58
閱讀 926·2021-09-02 15:11
閱讀 2178·2019-08-30 12:56
閱讀 1461·2019-08-30 11:12