vxlan 分布式网关数据包转发过程_本文详解之flannel-Vxlan模式

805b4414ec2447359a1c1ab83dfc8541

VXLAN简介 工作在内核态

VXLAN全称Virtual Extensible LAN,是一种虚拟化隧道通信技术,主要是为了突破VLAN的最多4096个子网的数量限制,以满足大规模云计算数据中心的需求。VLAN技术的缺陷是VLAN Header预留的长度只有12 bit,故最多只能支持2的12次方即4096个子网的划分,无法满足云计算场景下主机数量日益增长的需求。当前VXLAN的报文Header内有24 bit,可以支持2的24次方个子网,并通过VNI(Virtual Network Identifier)来区分不同的子网,相当于VLAN当中的VLAN ID。

不同于其他隧道协议,VXLAN是一个一对多的网络,并不仅仅是一对一的隧道协议。一个VXLAN设备能通过像网桥一样的学习方式学习到其他对端的IP地址,也可以直接配置静态转发表。

当采用VXLAN模式时,flanneld在启动时会通过Netlink机制与Linux内核通信,建立一个VTEP(Virtual Tunnel Access End Point)设备flannel.1 (命名规则为flannel.[VNI],VNI默认为1),类似于交换机当中的一个网口。

可以通过ip -d link查看VTEP设备flannel.1的配置信息,从以下输出可以看到,VTEP的local IP为172.16.130.244,destination port为8472。

[root@10-10-88-192 ~]# ip -d link show flannel.15: flannel.1:  mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT link/ether a2:5e:b0:43:09:a7 brd ff:ff:ff:ff:ff:ff promiscuity 0 vxlan id 1 local 172.16.130.244 dev eth1 srcport 0 0 dstport 8472 nolearning ageing 300 addrgenmode eui64[root@10-10-88-192 ~]#

在UDP模式下由flanneld进程进行网络包的封包和解包的工作

VXLAN模式下解封包的事情交由内核处理,那么此时FlannnelD的作用是什么呢?带着这个疑问我们先来简单看一下VXLAN Backend是如何工作的。

VXLAN Backend工作原理

当flanneld启动时将创建VTEP设备(默认为flannel.1,若已经创建则跳过),并将VTEP设备的相关信息上报到etcd当中,而当在Flannel网络中有新的节点发现时,各个节点上的flanneld将依次执行以下流程:

1. 在节点当中创建一条该节点所属网段的路由表,主要是能让Pod当中的流量路由到flannel.1接口。

通过route -n可以查看到节点当中已经有两条flannel.1接口的路由:

[root@10-10-88-192 ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 10.10.88.254 0.0.0.0 UG 0 0 0 eth010.10.88.0 0.0.0.0 255.255.255.0 U 0 0 0 eth010.244.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cni010.244.1.0 10.244.1.0 255.255.255.0 UG 0 0 0 flannel.110.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1172.16.130.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0[root@10-10-88-192 ~]#

2. 在节点当中添加一条该节点的IP以及VTEP设备的静态ARP缓存。

可通过arp -n命令查看到master节点当中已经缓存了另外两个节点以及VTEP的ARP信息(已删除无关ARP缓存信息)

[root@10-10-88-192 ~]# arp -nAddress HWtype HWaddress Flags Mask Iface10.244.2.0 ether 42:7f:69:c7:cd:37 CM flannel.110.244.1.0 ether 7a:2c:d0:7f:48:3f CM flannel.1172.16.130.140 ether fa:89:cf:03:e3:01 C eth1172.16.130.164 ether fa:88:2a:44:2b:01 C eth1

3. 在节点当中添加一条该节点的转发表。

通过bridge命令查看节点上的VXLAN转发表(FDB entry),MAC为对端VTEP设备即flannel.1的MAC,IP为VTEP对应的对外IP(可通过flanneld的启动参数--iface=eth1指定,若不指定则按默认网关查找网络接口对应的IP),可以看到已经有两条转发表。

[root@10-10-88-192 ~]# bridge fdb show dev flannel.142:7f:69:c7:cd:37 dst 172.16.130.164 self permanent7a:2c:d0:7f:48:3f dst 172.16.130.140 self permanent[root@10-10-88-192 ~]#

VXLAN Backend配置

跟UDP Backend一样,将Flannel Backend修改为VXLAN只需要将Flannel ConfigMap当中的Backend type字段修改为VXLAN即可。由于VXLAN类型相对UDP复杂并且有较好的灵活性,这里简单说一下VXLAN当中的几个配置选项:

  • VNI(Number):VXLAN Identifier,默认为1
  • Port(Number):用于发送VXLAN UDP报文的端口,默认为8472
  • DirectRouting(Boolean):当两台主机处于同一个网段当中时,启用后将采用直接路由的方式进行跨节点网络通信(此时工作模式跟后面要讲的host-gw Backend一样),只有当两台主机处于不同的网段当中时才会采用VXLAN进行封包,默认为关闭状态。
root@10-10-88-192 ~]# kubectl get cm -o yaml -n kube-system kube-flannel-cfgapiVersion: v1data: cni-conf.json: | { "name": "cbr0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值