摘要:是一個專為定制的三層網(wǎng)絡解決方案,主要用于解決容器的跨主機通信問題。收到的數(shù)據(jù)包被轉發(fā)到進程。查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到。然后在網(wǎng)絡層的源和目的均是容器的,虛擬。默認也是使用容器網(wǎng)絡方案,其官網(wǎng)也清晰的畫出了的。
前言
我們知道docker官方并沒有提供多主機的容器通信方案,單機網(wǎng)絡的模式主要有host,container,brige,none。none這種模式,顧名思義就是docker本身不去管理網(wǎng)絡模式,交由其他管理和分配,比如cni。Flannel是一個專為kubernetes定制的三層網(wǎng)絡解決方案,主要用于解決容器的跨主機通信問題。
首先,flannel利用Kubernetes API或者etcd用于存儲整個集群的網(wǎng)絡配置,其中最主要的內(nèi)容為設置集群的網(wǎng)絡地址空間。例如,設定整個集群內(nèi)所有容器的IP都取自網(wǎng)段“10.1.0.0/16”。
接著,flannel在每個主機中運行flanneld作為agent,它會為所在主機從集群的網(wǎng)絡地址空間中,獲取一個小的網(wǎng)段subnet,本主機內(nèi)所有容器的IP地址都將從中分配。
然后,flanneld再將本主機獲取的subnet以及用于主機間通信的Public IP,同樣通過kubernetes API或者etcd存儲起來。
最后,flannel利用各種backend ,例如udp,vxlan,host-gw等等,跨主機轉發(fā)容器間的網(wǎng)絡流量,完成容器間的跨主機通信。
Flannel為每個主機提供獨立的子網(wǎng),整個集群的網(wǎng)絡信息存儲在etcd上。對于跨主機的轉發(fā),目標容器的IP地址,需要從etcd獲取。
先上圖,比較直觀:
步驟:
IP數(shù)據(jù)報被封裝并通過容器的eth0發(fā)送。
Container1的eth0通過veth對與Docker0交互并將數(shù)據(jù)包發(fā)送到Docker0。然后Docker0轉發(fā)包。
Docker0確定Container3的IP地址,通過查詢本地路由表到外部容器,并將數(shù)據(jù)包發(fā)送到虛擬NIC Flannel0。
Flannel0收到的數(shù)據(jù)包被轉發(fā)到Flanneld進程。 Flanneld進程封裝了數(shù)據(jù)包通過查詢etcd維護的路由表并發(fā)送數(shù)據(jù)包通過主機的eth0。
數(shù)據(jù)包確定網(wǎng)絡中的目標主機主機。
目的主機的Flanneld進程監(jiān)聽8285端口,負責解封包。
解封裝的數(shù)據(jù)包將轉發(fā)到虛擬NICFlannel0。
Flannel0查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到Docker0。
Docker0確定目標容器并發(fā)送包到目標容器。
在常用的vxlan模式中,涉及到上面步驟提到的封包和拆包,這也是Flannel網(wǎng)絡傳輸效率相對低的原因。
下面重點說一下host-gw模式。
hostgw是最簡單的backend,它的原理非常簡單,直接添加路由,將目的主機當做網(wǎng)關,直接路由原始封包。
例如,我們從etcd中監(jiān)聽到一個EventAdded事件subnet為10.1.15.0/24被分配給主機Public IP 192.168.0.100,hostgw要做的工作就是在本主機上添加一條目的地址為10.1.15.0/24,網(wǎng)關地址為192.168.0.100,輸出設備為上文中選擇的集群間交互的網(wǎng)卡即可。對于EventRemoved事件,只需刪除對應的路由。
因為沒有了封包和拆包,host-gw的性能是最好的。
不過host-gw 要求主機網(wǎng)絡二層直接互聯(lián)。所以每個節(jié)點上有n-1個路由,而n個節(jié)點一共有n(n-1)/2個路由以保證flannel的flat網(wǎng)絡能力。
為什么host-gw 要求主機網(wǎng)絡二層直接互聯(lián)?
首先通過抓包分析,抓包結果如下圖:
可以看出host-gw在傳輸層走的是tcp。然后在網(wǎng)絡層的源IP和目的IP均是容器的IP,虛擬IP。這就決定了二層互聯(lián),因為只有交換機是不關注源IP和目的IP。假如兩臺主機在兩個lan中,二層不通,三層通,那么就需要路由器,而路由器是無法識別容器的這些ip。當然也可以配置路由規(guī)則,但是顯然沒有這么做的。
Openshift默認也是使用Flannel host-gw容器網(wǎng)絡方案,其官網(wǎng)也清晰的畫出了host-gw的data flow diagram。
示例配置和啟動參數(shù)示例配置:
{ "Network": "10.0.0.0/8", "SubnetLen": 20, "SubnetMin": "10.10.0.0", "SubnetMax": "10.99.0.0", "Backend": { "Type": "udp", "Port": 7890 } }
啟動參數(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總結
接下來,會重點講代碼的實現(xiàn)部分。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33062.html
摘要:是一個專為定制的三層網(wǎng)絡解決方案,主要用于解決容器的跨主機通信問題。收到的數(shù)據(jù)包被轉發(fā)到進程。查詢路由表,解封包,并將數(shù)據(jù)包發(fā)送到。然后在網(wǎng)絡層的源和目的均是容器的,虛擬。默認也是使用容器網(wǎng)絡方案,其官網(wǎng)也清晰的畫出了的。 前言 我們知道docker官方并沒有提供多主機的容器通信方案,單機網(wǎng)絡的模式主要有host,container,brige,none。none這種模式,顧名思義就是...
摘要:今天主要針對版本進行源碼分析。外部接口的定義如下創(chuàng)建子網(wǎng)管理器負責子網(wǎng)的創(chuàng)建更新添加刪除監(jiān)聽等,主要和打交道定義續(xù)約。在到期之前,子網(wǎng)管理器調(diào)用該方法進行續(xù)約。 前言 之前在k8s與網(wǎng)絡--Flannel解讀一文中,我們主要講了Flannel整體的工作原理。今天主要針對Flannel v0.10.0版本進行源碼分析。首先需要理解三個比較重要的概念: 網(wǎng)絡(Network):整個集群中...
摘要:今天主要針對版本進行源碼分析。外部接口的定義如下創(chuàng)建子網(wǎng)管理器負責子網(wǎng)的創(chuàng)建更新添加刪除監(jiān)聽等,主要和打交道定義續(xù)約。在到期之前,子網(wǎng)管理器調(diào)用該方法進行續(xù)約。 前言 之前在k8s與網(wǎng)絡--Flannel解讀一文中,我們主要講了Flannel整體的工作原理。今天主要針對Flannel v0.10.0版本進行源碼分析。首先需要理解三個比較重要的概念: 網(wǎng)絡(Network):整個集群中...
摘要:今天主要針對版本進行源碼分析。外部接口的定義如下創(chuàng)建子網(wǎng)管理器負責子網(wǎng)的創(chuàng)建更新添加刪除監(jiān)聽等,主要和打交道定義續(xù)約。在到期之前,子網(wǎng)管理器調(diào)用該方法進行續(xù)約。 前言 之前在k8s與網(wǎng)絡--Flannel解讀一文中,我們主要講了Flannel整體的工作原理。今天主要針對Flannel v0.10.0版本進行源碼分析。首先需要理解三個比較重要的概念: 網(wǎng)絡(Network):整個集群中...
摘要:前言有種方法可以讓集群外訪問運行在集群上的應用程序。當群集上運行的應用程序數(shù)量增加時,這可能會導致端口沖突。由于這些原因,主機網(wǎng)絡不是使您的應用程序可以從群集外部訪問的好方法。例如,可以將網(wǎng)絡插件部署為在集群的所有節(jié)點上設置的守護進程。 前言 有5種方法可以讓集群外訪問運行在Kubernetes集群上的應用程序(pod)。接下來我們詳細討論Kubernetes的hostNetwork,...
閱讀 1442·2023-04-25 19:00
閱讀 4135·2021-11-17 17:00
閱讀 1753·2021-11-11 16:55
閱讀 1511·2021-10-14 09:43
閱讀 3108·2021-09-30 09:58
閱讀 850·2021-09-02 15:11
閱讀 2118·2019-08-30 12:56
閱讀 1399·2019-08-30 11:12