kubernetes flannel之Vxlan原理

kubernetes網絡通信

  • 容器間的通信 pod內的容器通信(lo)
  • Pod之間的通信 pod IP <-----> pod IP(flannel、calico)
  • Pod與Service之間的通信 podIP <-----> ClusterIP(iptables、ipvs)
  • Service與集羣外部的通信 ClusterIP <-----> 集羣外部

CNI插件:

  • flannel
  • calico
  • canel
  • kube-route

Flannel

Flannel本身是一個框架,真正提供網絡功能是他的後端實現。目前支持三種後端實現:

  • VXLAN
  • host-gw
  • UDP

kubernetes flannel之Vxlan原理

從圖裏看每個宿主機都有一個flannel1的設備,就是VXLAN所需的VTEP設備(就是flannel1 設備),它既有IP地址也有MAC地址。現在我們是container1 訪問 container2,當container1發出請求後,這個目的的地址是10.244.1.3的IP包,會先出現在cni0網橋,然後被路由到本機flanner1設備上處理,也就是說,來到了“隧道”的出口。既目的宿主機的VTEP設備(就是flannel1 設備)。

-

當所有Node啓動後,我們可以在Node1 上可以看到多個flannel1 網卡的路由信息,是因爲flanneld啓動後創建的。

[root@node-0 ~]# ifconfig
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.244.0.0  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 8a:bf:bf:7e:b7:f6  txqueuelen 0  (Ethernet)
        RX packets 28929  bytes 1676230 (1.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12085  bytes 42372533 (40.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@node-0 ~]# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
...
10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1
....

從上圖看到10.244.1.0就是Node2的VTEP設備(就是flannel1 設備)的IP地址,而這些VTEP設備之間就需要想辦法組成一個虛擬的二層網絡,既:通過二層數據幀進行通信,而Node1上的VTEP設備收到原始IP包後,就要想辦法把原始IP包加一個目的MAC地址,封裝成二層數據幀,然後發送給目的VTEP設備。這裏需要解決一個問題目的VTEP設備的MAC地址是什麼?

-

根據路由表信息我們知道了目的VTEP設備的IP地址,而根據三層IP地址查詢二層MAC地址正是ARP表的功能。而這裏用ARP表的記錄,也就是flanneld進程在Node2節點啓動時,自動添加到Node1上的。如下:

[root@node-0 ~]# ip neigh show dev flannel.1
10.244.1.0 lladdr b2:ba:aa:a5:10:1a PERMANENT

有了這個MAC地址linux內核就可以開始二層封包了,上面提到的MAC地址,對宿主機的二層網絡沒有任何意義,所以上述封裝的數據幀不能在宿主機的二層網絡裏傳輸,爲了方便概述,我們把上述數據幀稱爲內部數據幀。所以Linux內核還要把內部數據幀進一步封裝成宿主機網絡的一個普通數據幀,好讓他載着內部數據幀,通過eth0網卡進行傳輸。這次封裝我們稱爲外部數據幀,爲了實現這個搭便車的機制,Linux內核在封裝內部數據幀前面,加上特殊的VXLAN頭,用來表示這個乘客實際上是VXLAN使用的數據幀。而這個VXLAN頭裏有一個重要的標誌VNI,它是識別某個數據幀是不是應該歸屬自己處理的標誌。而flannel中,VNI的值是1,這也是爲什麼宿主機的VTEP設備都叫做flannel1的原因。這個時候linux內核會把這數據幀封裝一個UDP包裏發出去。雖然node1的flannel1知道node2的flannel2的MAC地址,但是不知道node2MAC的地址,也就是UDP該發往那臺主機,實際上flannel1還要扮演一個網橋的角色,在二層網絡進行UDP轉發,而在Linux內核裏面,網橋設備進行轉發的依據來自FDB的轉發數據庫。這個flannel網橋對應的FDB信息,就是flannel進程維護的,他的內容如下:

[root@node-0 ~]# bridge fdb show flannel.1  | grep b2:ba:aa:a5:10:1a
b2:ba:aa:a5:10:1a dev flannel.1 dst 172.16.138.41 self permanent

我們可以看到發往的IP地址是172.16.138.41的主機,顯然這臺主機就是 Node2,UDP要轉發的目的也找到了。接下來就是宿主機網絡封包的過程了。

Vxlan

首先,我們對vxlan的基本原理進行簡單的敘述。從下圖所示的封包結構來看,vxlan和上文提到的udp backend的封包結構是非常類似的,不同之處是多了一個vxlan header,以及原始報文中多了個二層的報頭。

kubernetes flannel之Vxlan原理

下面讓我們來看看,當有一個EventAdded到來時,flanneld如何進行配置,以及封包是如何在flannel網絡中流動的。

kubernetes flannel之Vxlan原理

如上圖所示,當主機B加入flannel網絡時,它會將自己的subnet 10.1.16.0/24和Public IP 192.168.0.101寫入etcd中,它還會將vtep設備flannel.1的mac地址也寫入etcd中。

-

之後,主機A會得到EventAdded事件,並從中獲取主機B添加至etcd的各種信息。這個時候,它會在本機上添加三條信息:

  • 路由信息:所有通往目的地址10.1.16.0/24的封包都通過vtep設備flannel.1設備發出,發往的網關地址爲10.1.16.0,即主機B中的flannel.1設備。
[root@node-0 ~]# ip route list
...
10.1.16.0/24 via 10.1.16.0 dev flannel.1 onlink 
...
  • fdb信息:MAC地址爲flannel的mac地址,發往10.1.16.0的數據包都將通過vxlan首先發往目的地址192.168.0.101,即主機B
[root@node-0 bin]#  ip neigh show dev flannel.1
10.1.16.0 lladdr b2:ba:aa:a5:10:1a PERMANENT
[root@node-0 bin]#  bridge fdb show flannel.1  | grep b2:ba:aa:a5:10:1a
b2:ba:aa:a5:10:1a dev flannel.1 dst 192.168.0.101 self permanent
  • arp信息:網關地址10.1.16.0的MAC地址爲flannel的mac地址
[root@node-0 bin]# arp -v
Address                  HWtype  HWaddress           Flags Mask            Iface
...
10.1.16.0               ether   b2:ba:aa:a5:10:1a   CM                    flannel.1
...

參數說明:

  • SubnetLen表示每個主機分配的subnet大小,我們可以在初始化時對其指定,否則使用默認配置。在默認配置的情況下,如果集羣的網絡地址空間大於/24,則SubnetLen配置爲24,否則它比集羣網絡地址空間小1,例如集羣的大小爲/25,則SubnetLen的大小爲/26
  • SubnetMin是集羣網絡地址空間中最小的可分配的subnet,可以手動指定,否則默認配置爲集羣網絡地址空間中第一個可分配的subnet。例如對於”10.1.0.0/16″,當SubnetLen爲24時,第一個可分配的subnet爲”10.1.1.0/24″。
  • SubnetMax表示最大可分配的subnet,對於”10.1.0.0/16″,當subnetLen爲24時,SubnetMax爲”10.1.255.0/24″
  • BackendType爲使用的backend的類型,如未指定,則默認爲“udp”
  • Backend中會包含backend的附加信息,例如backend爲vxlan時,其中會存儲vtep設備的mac地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章