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