flannel网络vxlan模式原理及使用

一.Flannel—VXLAN模式:
什么是vxlan:
vxlan,即Virtual Extensible LAN(虚拟可扩展局域网),是Linux内核本身就支持的一种网络虚拟化技术。
所以说,VXLAN完全可以在内核态实现封装和解封装的工作,构建出覆盖网络(Overlay Network)。
在这里插入图片描述
1.修改flannel-pod所挂载的configmap文件,网络类型修改成vxlan模式
kubectl edit cm kube-flannel-cfg -n kube-system

Please edit the object below. Lines beginning with a ‘#’ will be ignored,

and an empty file will abort the edit. If an error occurs while saving this file will be

reopened with the relevant failures.

apiVersion: v1
data:
cni-conf.json: |
{
“cniVersion”: “0.2.0”,
“name”: “cbr0”,
“plugins”: [
{
“type”: “flannel”,
“delegate”: {
“hairpinMode”: true,
“isDefaultGateway”: true
}
},
{
“type”: “portmap”,
“capabilities”: {
“portMappings”: true
}
}
]
}
net-conf.json: |
{
“Network”: “10.244.0.0/16”,
“Backend”: {
“Type”: “vxlan” #修改成vxlan模式
}
}

2.重建flanneld所有的pod使其配置生效(configmap支持热更新,前提是应用也需要支持)
kubectl delete pod -n kube-system app=flannel #删除标签为app=flannel的pod

3.查看pod日志是否成功启动并修改成vxlan模式
kubectl logs -f kube-flannel-ds-amd64-cntt5 -n kube-system

I1225 12:54:45.245784 1 main.go:514] Determining IP address of default interface
I1225 12:54:45.270054 1 main.go:527] Using interface with name enp0s3 and address 192.168.1.239
I1225 12:54:45.270068 1 main.go:544] Defaulting external address to interface address (192.168.1.239)
I1225 12:54:45.371170 1 kube.go:126] Waiting 10m0s for node controller to sync
I1225 12:54:45.371210 1 kube.go:309] Starting kube subnet manager
I1225 12:54:46.545438 1 kube.go:133] Node controller sync successful
I1225 12:54:46.545456 1 main.go:244] Created subnet manager: Kubernetes Subnet Manager - node01
I1225 12:54:46.545460 1 main.go:247] Installing signal handlers
I1225 12:54:46.651141 1 main.go:386] Found network config - Backend type: vxlan #这里已经成功修改成了vxlan模式

4.原理过程介绍
Flanneld在启动时会通过Netlink机制与Linux内核通信,建立一个VTEP设备flannel.1,类似于交换机当中的一个网口。我们可以
通过ip -d link命令查看VTEP设备flannel.1的配置信息
[root@master ~]# ip -d link show flannel.1
6: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/ether 66:d1:2c:85:ea:0d brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 1 local 192.168.1.237 dev enp0s3 srcport 0 0 dstport 8472 nolearning ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
从上面的输出可以看到,VETP的local IP为192.168.1.237,destination port为8472。同样我们也可以在

节点上查看进程监听情况:
[root@master ~]# netstat -ulnp | grep 8472
udp 0 0 0.0.0.0:8472 0.0.0.0:* —
最后一栏显示的不是进程的id和名称,而是一个破折号“-”,这说明了UDP的8472端口不是由用户态的进程在监听的,
也证实了VXLAN模块工作在内核态模式下。

VXLAN模式下解封包的事情交由内核处理,当Flanneld启动时将创建VTEP设备flannel.1,并将VTEP设备的相关
信息上报到etcd当中,而当在Flannel网络中有新的节点发现时,各个节点上的Flanneld进程将依次执行一下流程:

(1)、在节点当中创建一条该节点所属网段的路由表,主要是能让Pod当中的流量路由到flannel.1接口。
通过route -n可以查看到节点当中已经有两条flannel.1接口的路由:
[root@node01 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp0s3
10.244.0.0 10.244.0.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.1.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
比如这个10.244.2.0这条路由规则,他的意思就是发往10.244.2.0/24网段的ip包,都需要经过flannel.1设备发出,
而且最后被发送到的网关就是地址10.244.0.0。而这个网关地址就是node2节点上的flannel.1设备的ip地址

(2)、上面知道了目的VTEP设备的ip地址了,这个时候就需要知道目的MAC地址,才能吧数据包发送过去,
这个时候其实Flanneld进程就会在节点当中维护所有节点的IP以及VTEP设备的静态ARP缓存。可通过arp -n命令
查看到当前节点中已经缓存了另外两个节点以及VTEP的ARP信息。
[root@node01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.244.2.0 ether 82:46:46:7e:5e:bb CM flannel.1 #node2节点的flannel.1网卡IP地址和mac地址
10.244.0.0 ether 66:d1:2c:85:ea:0d CM flannel.1 #master节点的flannel.1网卡IP地址和mac地址

这里我们可以看到ip地址10.244.2.0对应的mac地址是82:46:46:7e:5e:bb,这样我们就知道了目的VTEP设备的mac地址。
但是现在我们只是知道了目标设备的mac地址,却不知道对应的宿主机的地址是什么?

(3)、这个时候Flanneld进程还会在节点当中添加一条该节点的转发表,通过bridge命令查看节点上的VXLAN转发表(FDB entry),MAC为VTEP设备即flannel.1的MAC地址,
ip为VTEP对应的对外IP(可通过Flanneld的启动参数–iface=eth0指定)
82:46:46:7e:5e:bb dst 192.168.1.240 self permanent #node2\MAC地址对应的是宿主机的对外ip地址
66:d1:2c:85:ea:0d dst 192.168.1.237 self permanent #master\MAC地址对应的是宿主机的对外ip地址
这里的ip地址就是我们要发往的目的地址。

完整流程:
1.pod-a(10.244.1.2)当中的ip包通过pod-a内的路由表(route -n)被发送到cni0

2.到达cni0当中的ip包通过匹配node1宿主机当中的路由表(route -n)发现通过10.244.2.3的ip应该交给
flannel.1接口

3.flannel.1作为一个VTEP设备,收到报文后将按照VTEP的配置进行封包,通过node1节点上的arp(arp -n)和转发表(bridge fdb show dev flannel.1)
得知10.244.2.3属于节点node2,并且会将node2节点对应的VTEP设备的MAC地址根据flannel.1设备创建
时的设置的参数(VNI、local IP、Port)进行VXLAN封包
注释:(这里需要注意,如果是通过cni接口进行pod之间的通信是直接通过apiserver走的;如果flannel是直接配置到docker上面
这种方式是通过etcd来得知对端pod的相关信息的)

4.通过节点node2跟node1之间的网络链接,VXLAN包到达node2的eth0接口网卡

5.通过端口8472,VXLAN包被转发给VTEP设备flannel.1进行解包

6.解封装后的IP包匹配节点node2当中的路由表(10.244.2.0),内核将IP包转发给cni0

7.cni0将ip包转发给链接在cni0上的pod-b

备注:
route -n #查看路由表
arp -n #查看arp信息表
bridge fdb show dev flannel.1 #查看VXLAN转发表
VTEP #VXLAN Tunnel End Point (虚拟隧道端点)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值