kubernetes之flannel 網絡分析

Flannel是kubernetes的CNI網絡插件之一,實質上是一種主機 overlay網絡 。flannel支持多種網絡轉發模式,經常使用的是vxlan、hostgw等,咱們這裏以經常使用的 udp VXLAN協議講解。node

kubernetes之flannel 網絡分析

1. Flannel 特色

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

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

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

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

2. 各個組件的解釋:

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

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

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

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

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

  1. pod中產生數據,根據pod的路由信息,將數據發送到Cni0 bash

  2. Cni0 根據節點的路由表,將數據發送到隧道設備flannel.1網絡

  3. Flannel.1查看數據包的目的ip,從flanneld得到對端隧道設備的必要信息,封裝數據包。

  4. Flannel.1將數據包發送到對端設備。對端節點的網卡接收到數據包,發現數據包爲overlay數據包,解開外層封裝,併發送內層封裝到flannel.1設備。

  5. Flannel.1設備查看數據包,根據路由表匹配,將數據發送給Cni0設備。

  6. Cni0匹配路由表,發送數據給網橋上對應的端口。

測試集羣 k8s定義的flannel網絡(POD CIDR) 爲172.20.0.0/16。

下面用用案例解釋網絡內不一樣POD間通訊的一個網絡實現吧

kubernetes之flannel 網絡分析

10.19.114.100 - pod1 路由
#kubectl -n stack exec -it api-0 -- bash
#ip route show
default via 172.20.0.1 dev eth0 
172.20.0.0/24 dev eth0 proto kernel scope link src 172.20.0.73
172.20.0.0/16 via 172.20.0.1 dev eth0

kubernetes之flannel 網絡分析

10.19.114.101 - pod2 路由
#kubectl -n stack exec -it redis-64c6c549ff-5plcq -- bash
#ip route show
default via 172.20.1.1 dev eth0 
172.20.0.0/16 via 172.20.1.1 dev eth0 
172.20.1.0/24 dev eth0 proto kernel scope link src 172.20.1.11

kubernetes之flannel 網絡分析

由此可看出,默認POD 網卡網關走 .1 網關,而網關即爲cni0 的IP,下一步分析流量到了宿主機以後的走向~~

10.19.114.100 宿主機路由
#ip route -n
default via 10.19.114.1 dev eth0 
10.19.114.0/24 dev eth0 proto kernel scope link src 10.19.114.100 
10.250.250.0/24 dev eth1 proto kernel scope link src 10.250.250.100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
172.20.0.0/24 dev cni0 proto kernel scope link src 172.20.0.1 
172.20.1.0/24 via 172.20.1.0 dev flannel.1 onlink 
172.20.2.0/24 via 172.20.2.0 dev flannel.1 onlink
10.19.114.101 宿主機路由
#ip route -n
default via 10.19.114.1 dev eth0 
10.19.114.0/24 dev eth0 proto kernel scope link src 10.19.114.101 
10.250.250.0/24 dev eth1 proto kernel scope link src 10.250.250.101 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
172.20.0.0/24 via 172.20.0.0 dev flannel.1 onlink 
172.20.1.0/24 dev cni0 proto kernel scope link src 172.20.1.1 
172.20.2.0/24 via 172.20.2.0 dev flannel.1 onlink

由如上路由可知,據最小匹配原則,匹配到上面的一條路由表項。從10.19.114.100 上去往172.20.1.0/24 網段的包,發送172.20.1.0 網關,網關設備是flannel.1
flannel.1爲vxlan設備,當數據包來到flannel.1時,須要將數據包封裝起來。此時的dst ip 爲172.20.1.11,src ip爲172.20.0.73。數據包繼續封裝須要知道172.20.1.11 ip地址對應的mac地址。

此時,flannel.1不會發送arp請求去得到172.20.1.11 的mac地址,而是由Linux kernel將一個「L3 Miss」事件請求發送的用戶空間的flanned程序。

Flanned程序收到內核的請求事件以後,從etcd查找可以匹配該地址的子網的flannel.1設備的mac地址,即發往的pod所在host中flannel.1設備的mac地址。Flannel在爲Node節點分配ip網段時記錄了全部的網段和mac等信息,因此可以知道。

#ip neigh |grep 172
172.20.2.0 dev flannel.1 lladdr 82:c4:0e:f2:00:6f PERMANENT
172.20.1.0 dev flannel.1 lladdr 42:6e:8b:9b:e2:73 PERMANENT

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

kubernetes之flannel 網絡分析

VXLAN的轉發過程主要依賴於FDB(Forwarding Database)實現, VXLAN設備根據MAC地址來查找相應的VTEP IP地址,繼而將二層數據幀封裝發送至相應VTEP。

#/sbin/bridge fdb show dev flannel.1
42:6e:8b:9b:e2:73 dst 10.19.114.101 self permanent
ba:8b:ce:f3:b8:51 dst 10.19.114.101 self permanent
42:6f:c7:06:3e:a0 dst 10.19.114.102 self permanent
82:c4:0e:f2:00:6f dst 10.19.114.102 self permanent

kernel須要查看node上的fdb(forwarding database)以得到內層封包中目的vtep設備所在的node地址。由於已經從arp table中查到目的設備mac地址爲42:6e:8b:9b:e2:73,同時在fdb中存在該mac地址對應的node節點的IP地址。

若是fdb中沒有這個信息,那麼kernel會向用戶空間的flanned程序發起」L2 MISS」事件。flanneld收到該事件後,會查詢etcd,獲取該vtep設備對應的node的」Public IP「,並將信息註冊到fdb中。

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

kubernetes之flannel 網絡分析

具體能夠經過wireshark抓包分析

kubernetes之flannel 網絡分析

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

kubernetes之flannel 網絡分析

目的地址爲172.20.1.11,到達10.19.114.101 flannel.1後查找本身的路由表,根據路由表完成轉發,由下圖可知,flannel.1將去往172.20.1.0/24的流量轉發到cni0上去。

kubernetes之flannel 網絡分析

查看cni0網橋信息, cni0 網絡經過綁定pod 的網卡和宿主機網卡,經過veth實現通訊

#brctl show
bridge name     bridge id               STP enabled     interfaces
cni0            8000.a656432b14cf       no              veth1f7db117
                                                        veth3ee31d24
                                                        veth521bc030
                                                        veth5a59ced4
                                                        veth649412bd
                                                        veth65bbf59f
                                                        veth6ed62916
                                                        veth7e8e7733
                                                        veth9787b6ba
                                                        veth98c762b8
                                                        vethaf05d94b
                                                        vethc07c69cd
                                                        vethdf62bded
                                                        vethe2cf7392
                                                        vethf4995a29
docker0         8000.024216a031b6       no

由下圖可知 172.20.1.11 的POD 網卡 對應 link-netnsid 0

kubernetes之flannel 網絡分析

由下圖可知 172.20.1.11 的POD 網卡 在宿主機上的veth 爲 vethf4995a29

kubernetes之flannel 網絡分析

因此在cni0網橋上掛載的pod的veth pair爲vethf4995a29 , eth0@if21和vethf4995a29@if3組成的一對veth,pair。從而將流量注入到pod的eth0網卡上。

文章轉自:360雲計算

相關文章
相關標籤/搜索