k8s網絡之Flannel網絡

 

k8s網絡主題系列:html

1、k8s網絡之設計與實現node

2、k8s網絡之Flannel網絡docker

3、k8s網絡之Calico網絡數據庫

簡介

FlannelCoreOS團隊針對Kubernetes設計的一個網絡規劃服務,簡單來講,它的功能是讓集羣中的不一樣節點主機建立的Docker容器都具備全集羣惟一的虛擬IP地址。後端

在默認的Docker配置中,每一個節點上的Docker服務會分別負責所在節點容器的IP分配。這樣致使的一個問題是,不一樣節點上容器可能得到相同的內外IP地址。並使這些容器之間可以之間經過IP地址相互找到,也就是相互ping通。網絡

Flannel的設計目的就是爲集羣中的全部節點從新規劃IP地址的使用規則,從而使得不一樣節點上的容器可以得到「同屬一個內網」且」不重複的」IP地址,並讓屬於不一樣節點上的容器可以直接經過內網IP通訊。架構

Flannel實質上是一種「覆蓋網絡(overlaynetwork)」,也就是將TCP數據包裝在另外一種網絡包裏面進行路由轉發和通訊,目前已經支持udpvxlanhost-gwaws-vpcgcealloc路由等數據轉發方式,默認的節點間數據通訊方式是UDP轉發。併發

 

簡單總結Flannel的特色

1.使集羣中的不一樣Node主機建立的Docker容器都具備全集羣惟一的虛擬IP地址。socket

2.創建一個覆蓋網絡(overlay network),經過這個覆蓋網絡,將數據包原封不動的傳遞到目標容器。覆蓋網絡是創建在另外一個網絡之上並由其基礎設施支持的虛擬網絡。覆蓋網絡經過將一個分組封裝在另外一個分組內來將網絡服務與底層基礎設施分離。在將封裝的數據包轉發到端點後,將其解封裝。測試

3.建立一個新的虛擬網卡flannel0接收docker網橋的數據,經過維護路由表,對接收到的數據進行封包和轉發(vxlan)。

4.etcd保證了全部nodeflanned所看到的配置是一致的。同時每一個node上的flanned監聽etcd上的數據變化,實時感知集羣中node的變化

 

Flannel對網絡要求提出的解決辦法

互相不衝突的ip

1.flannel利用Kubernetes API或者etcd用於存儲整個集羣的網絡配置根據配置記錄集羣使用的網段

2.flannel在每一個主機中運行flanneld做爲agent,它會爲所在主機從集羣的網絡地址空間中,獲取一個小的網段subnet,本主機內全部容器的IP地址都將從中分配。

如測試環境中ip分配:

1.master節點

 

2.node1

 

3.node2

 

flannel network中,每一個pod都會被分配惟一的ip地址,且每一個K8s nodesubnet各不重疊,沒有交集。

 

Pod之間互相訪問

  1. flanneld將本主機獲取的subnet以及用於主機間通訊的Public IP經過etcd存儲起來,須要時發送給相應模塊。
  2. flannel利用各類backend mechanism,例如udpvxlan等等,跨主機轉發容器間的網絡流量,完成容器間的跨主機通訊。

 

Flannel架構原理

Flannel架構圖(根據我的理解畫的圖,和官網的圖有一些小差距)

 

各個組件的解釋:

Cni0:網橋設備,每建立一個pod都會建立一對 veth pair。其中一端是pod中的eth0,另外一端是Cni0網橋中的端口(網卡)。Pod中從網卡eth0發出的流量都會發送到Cni0網橋設備的端口(網卡)上。

 

 Cni0 設備得到的ip地址是該節點分配到的網段的第一個地址。

 

Flannel.1: overlay網絡的設備,用來進行 vxlan 報文的處理(封包和解包)。不一樣node之間的pod數據流量都從overlay設備以隧道的形式發送到對端。

 

 

Flanneldflannel在每一個主機中運行flanneld做爲agent,它會爲所在主機從集羣的網絡地址空間中,獲取一個小的網段subnet,本主機內全部容器的IP地址都將從中分配。同時Flanneld監聽K8s集羣數據庫,爲flannel.1設備提供封裝數據時必要的macip等網絡數據信息。

 

不一樣node上的pod的通訊流程:

  1. pod中產生數據,根據pod的路由信息,將數據發送到Cni0
  2. Cni0 根據節點的路由表,將數據發送到隧道設備flannel.1
  3. Flannel.1查看數據包的目的ip,從flanneld得到對端隧道設備的必要信息,封裝數據包。
  4. Flannel.1將數據包發送到對端設備。對端節點的網卡接收到數據包,發現數據包爲overlay數據包,解開外層封裝,併發送內層封裝到flannel.1設備。
  5. Flannel.1設備查看數據包,根據路由表匹配,將數據發送給Cni0設備。
  6. Cni0匹配路由表,發送數據給網橋上對應的端口。

 

通訊流程

1.Pod1中的容器到cni0

Pod1Pod3可以互相ping

 

Ping包的dst ip 192.20.1.43,根據路由匹配到最後一條路由表項,去往192.20.0.0/12的包都轉發給192.20.0.1

 

192.20.0.1cni0ip地址。

 

2.cni0flannel1.1

icmp包達到cni0以後,cni0發現dst192.20.1.43cni根據主機路由表來查找匹配項。

根據最小匹配原則,匹配到圖上的一條路由表項。去往192.20.1.0/24 網段的包,發送192.20.1.0網關,網關設備是flannel.1

 

3.Flannel.1

flannel.1vxlan設備,當數據包來到flannel.1時,須要將數據包封裝起來。此時的dst ip 192.20.1.43src ip192.20.0.51。數據包繼續封裝須要知道192.20.1.43 ip地址對應的mac地址。此時,flannel.1不會發送arp請求去得到192.20.1.42mac地址,而是由Linux kernel將一個「L3 Miss」事件請求發送的用戶空間的flanned程序。Flanned程序收到內核的請求事件以後,從etcd查找可以匹配該地址的子網的flannel.1設備的mac地址,即發往的pod所在hostflannel.1設備的mac地址。Flannel在爲Node節點分配ip網段時記錄了全部的網段和mac等信息,因此可以知道。交互流程以下圖所示:

 

 

flanned將查詢到的信息放入master node hostarp cache表中:

 

到這裏,vxlan的內層數據包就完成了封裝。格式是這樣的:

 

簡單總結這個流程:

  1. 數據包到達flannel.1,經過查找路由表,知道數據包要經過flannel.1發往192.20.1.0
  2. 經過arp cache表,知道了目的ip192.20.1.0mac地址。

kernel須要查看node上的fdb(forwarding database)以得到內層封包中目的vtep設備所在的node地址。由於已經從arp table中查到目的設備mac地址52:77:71:e6:4f:58,同時在fdb中存在該mac地址對應的node節點的IP地址。若是fdb中沒有這個信息,那麼kernel會向用戶空間的flanned程序發起」L2 MISS」事件。flanneld收到該事件後,會查詢etcd,獲取該vtep設備對應的node的」Public IP「,並將信息註冊到fdb中。

當內核得到了發往機器的ip地址後,arp獲得mac地址,以後就能完成vxlan的外層封裝。

 

4.對端flannel.1

Node節點的eth0網卡接收到vxlan設備包,kernal將識別出這是一個vxlan包,將包拆開以後轉給節點上的flannel.1設備。這樣數據包就從發送節點到達目的節點,flannel.1設備將接收到一個以下的數據包:

 

目的地址爲192.20.1.43flannel.1查找本身的路由表,根據路由表完成轉發。

根據最下匹配原則,flannel.1將去往192.20.1.0/24的流量轉發到cni0上去。

 

5.cnioPod

cni0是一個網橋設備。當cni0拿到數據包以後,經過veth pair,將數據包發送給pod。查看Node節點中的網橋。 

 

node節點上經過arp解析能夠開出,192.20.1.43mac地址爲 66:57:8e:3d:00:85

 

該地址爲pod的網卡eth0的地址。

 

同時經過veth pair的配對關係能夠看出,pod中的eth0veth pair的一端,另外一端在node節點行上,對應的網卡是vethd356ffc1@if3。因此,在cni0網橋上掛載的podveth pairvethd356ffc1,即:

 

eth0@if50vethd356ffc1@if3組成的一對vethpair。其效果至關於將pod中的eth0直接插在到cni0上。因此簡單總結cni0轉發流量的原理:

  1. 首先經過arp查找出ip地址對應的mac地址
  2. 將流量轉發給mac地址所在eth0網的對應的veth pair端口
  3. veth pair端口接收到流量,直接將流量注入到podeth0網卡上。

 

不一樣後端的封裝

Flannel能夠指定不一樣的轉發後端網絡,經常使用的有hostgwudpvxlan等。

Hostgw

hostgw是最簡單的backend,它的原理很是簡單,直接添加路由,將目的主機當作網關,直接路由原始封包。

例如,咱們從etcd中監聽到一個EventAdded事件subnet10.1.15.0/24被分配給主機Public IP 192.168.0.100hostgw要作的工做就是在本主機上添加一條目的地址爲10.1.15.0/24,網關地址爲192.168.0.100,輸出設備爲上文中選擇的集羣間交互的網卡便可。

優勢:簡單,直接,效率高

缺點:要求全部的pod都在一個子網中,若是跨網段就沒法通訊。

 

UDP

如何應對Pod不在一個子網裏的場景呢?將Pod的網絡包做爲一個應用層的數據包,使用UDP封裝以後在集羣裏傳輸。即overlay

 

上圖來自flannel官方,其中右邊Packer的封裝格式就是使用udp完成overlay的格式

 

當容器10.1.15.2/24要和容器10.1.20.2/24通訊時,

1.由於該封包的目的地不在本主機subnet內,所以封包會首先經過網橋轉發到主機中。

2.在主機上通過路由匹配,進入網卡flannel.1(須要注意的是flannel.1是一個tun設備,它是一種工做在三層的虛擬網絡設備,而flanneld是一個proxy,它會監聽flannel.1並轉發流量。)

3.當封包進入flannel.1時,flanneld就能夠從flanne.1中將封包讀出,因爲flanne.1是三層設備,因此讀出的封包僅僅包含IP層的報頭及其負載。

4.最後flanneld會將獲取的封包做爲負載數據,經過udp socket發往目的主機。

5.在目的主機的flanneld會監聽Public IP所在的設備,從中讀取udp封包的負載,並將其放入flannel.1設備內。

6.容器網絡封包到達目的主機,以後就能夠經過網橋轉發到目的容器了。

優勢:Pod可以跨網段訪問

缺點:隔離性不夠,udp不能隔離兩個網段。

 

Vxlan

vxlan和上文提到的udp backend的封包結構是很是相似的,不一樣之處是多了一個vxlan header,以及原始報文中多了個二層的報頭。

當初始化集羣裏,vxlan網絡的初始化工做:

主機B加入flannel網絡時,它會將本身的三個信息寫入etcd中,分別是:subnet 10.1.16.0/24Public IP 192.168.0.101vtep設備flannel.1mac地址 MAC B。以後,主機A會獲得EventAdded事件,並從中獲取上文中B添加至etcd的各類信息。這個時候,它會在本機上添加三條信息:

1) 路由信息:全部通往目的地址10.1.16.0/24的封包都經過vtep設備flannel.1設備發出,發往的網關地址爲10.1.16.0,即主機B中的flannel.1設備。

2) fdb信息:MAC地址爲MAC B的封包,都將經過vxlan發往目的地址192.168.0.101,即主機B

3arp信息:網關地址10.1.16.0的地址爲MAC B

 

事實上,flannel只使用了vxlan的部分功能,因爲VNI被固定爲1,本質上工做方式和udp backend是相似的,區別無非是將udpproxy換成了內核中的vxlan處理模塊。而原始負載由三層擴展到了二層,可是這對三層網絡方案flannel是沒有意義的,這麼作也僅僅只是爲了適配vxlan的模型。vxlan詳細的原理參見文後的參考文獻,其中的分析更爲具體,也更易理解。

 

總的來講,flannel更像是經典的橋接模式的擴展。咱們知道,在橋接模式中,每臺主機的容器都將使用一個默認的網段,容器與容器之間,主機與容器之間都能互相通訊。要是,咱們能手動配置每臺主機的網段,使它們互不衝突。接着再想點辦法,將目的地址爲非本機容器的流量送到相應主機:若是集羣的主機都在一個子網內,就搞一條路由轉發過去;如果不在一個子網內,就搞一條隧道轉發過去。這樣以來,容器的跨網絡通訊問題就解決了。而flannel作的,其實就是將這些工做自動化了而已。

存在問題

1.不支持pod之間的網絡隔離。Flannel設計思想是將全部的pod都放在一個大的二層網絡中,因此pod之間沒有隔離策略。

2.設備複雜,效率不高。Flannel模型下有三種設備,數量通過多種設備的封裝、解析,勢必會形成傳輸效率的降低。

 

對於flannel網絡介紹的文章也不少,其中有一個點有明顯的分歧,就是對於flanned的做用。分歧點在於:使用UDP做爲後端網絡時,flanned會將flanne.1設備的流量通過本身的處理髮送給對端的flanned。可是在分析vxlan做爲後端網絡時明顯不是這麼作的,在vxlan中flanned做用是獲取必要的mac地址,ip地址信息,沒有直接處理數據流。這裏要存疑,若是有讀者能告知,歡迎留言。

相關文章
相關標籤/搜索