手动模拟 flannel 的 vxlan 实现节点命名空间互通
2023-12-15
手动模拟 flannel 的 vxlan 实现节点命名空间互通
在flannel
网络插件中实现两个节点互通方式有host-gw
vxlan
ipip
等方式,之前已经手动模拟过host-gw
模式,此处再模拟一下vxlan
模式点对点访问。
手动实验两个命名空间通信
Node1节点操作
- 创建
vxlan
的模式的虚拟设备,设备名vxlan11
,网络表示符为32
,UDP
端口为4787
,远程访问地址192.168.209.130
,本机地址192.168.209.144
,底层设备ens33
,并给vxlan
设备一个隧道ip
,并启动
ip link add vxlan32 type vxlan id 32 dstport 4787 remote 192.168.209.144 local 192.168.209.130 dev ens33
ip addr add 10.244.1.0/32 dev vxlan32
ip link set vxlan32 up
- 创建网桥并启动,并且给网桥一个网关地址,并启动虚拟网桥设备
ip link add br1 type bridge
ip addr add 10.244.1.1/24 dev br1
ip link set br1 up
- 创建命名空间并且创建虚拟地址对实现对端绑定
ip netns add ns1
ip link add veth-ns1 type veth peer name veth-br1
ip link set veth-ns1 netns ns1
ip netns exec ns1 ip address add 10.244.1.2/24 dev veth-ns1
ip netns exec ns1 ip link set veth-ns1 up
ip link set veth-br1 master br1
ip link set veth-br1 up
- 创建命名空间出去的路由,创建流量从隧道出去的路由
ip r a 10.244.2.0/24 via 10.244.2.0 dev vxlan32 onlink
ip netns exec ns1 ip route add 10.244.2.0/24 via 10.244.1.1 dev veth-ns1
- 内核开启路由转发,路由转发意思是节点内不同设备之间允许路由转发
sysctl -w net.ipv4.ip_forward=1
Node2节点操作
在节点二创建vxlan
虚拟设备
ip link add vxlan32 type vxlan id 32 dstport 4787 remote 192.168.209.130 local 192.168.209.144 dev ens33
ip addr add 10.244.2.0/32 dev vxlan32
ip link set vxlan32 up
- 创建网桥并启动,并且给网桥一个网关地址,并启动虚拟网桥设备
ip link add br2 type bridge
ip addr add 10.244.2.1/24 dev br2
ip link set br2 up
- 创建命名空间并且创建虚拟地址对实现对端绑定
ip netns add ns2
ip link add veth-ns2 type veth peer name veth-br2
ip link set veth-ns2 netns ns2
ip netns exec ns2 ip address add 10.244.2.2/24 dev veth-ns2
ip netns exec ns2 ip link set veth-ns2 up
ip link set veth-br2 master br2
ip link set veth-br2 up
- 创建命名空间出去的路由,创建流量从隧道出去的路由
ip r a 10.244.1.0/24 via 10.244.1.0 dev vxlan32 onlink
ip netns exec ns2 ip route add 10.244.1.0/24 via 10.244.2.1 dev veth-ns2
- 内核开启路由转发
sysctl -w net.ipv4.ip_forward=1
测试连通性
节点1访问节点2vxlan
设备
[root@ns1 ~]# ping 10.244.2.0
PING 10.244.2.0 (10.244.2.0) 56(84) bytes of data.
64 bytes from 10.244.2.0: icmp_seq=1 ttl=64 time=0.223 ms
64 bytes from 10.244.2.0: icmp_seq=2 ttl=64 time=0.301 ms
节点1命名空间访问节点2命名空间
[root@ns1 ~]# ip netns exec ns1 ping 10.244.2.2
PING 10.244.2.2 (10.244.2.2) 56(84) bytes of data.
64 bytes from 10.244.2.2: icmp_seq=1 ttl=62 time=0.216 ms
数据包分析
Node1
下命名空间ns1
访问Node2
下命名空间ns2
,分析数据过经过各个设备mac
地址之间关系
Node1 br1 网桥数据分析
10.244.1.2
是Node1
命名空间下IP
,10.244.2.2
是Node2
命名空间下IP
,10.244.2.2
的mac
地址变成了br1
网桥mac
,这符合网络地址转换原则
Node1 vxlan 设备数据分析
10.244.1.2
的mac
地址变成了本端vxlan
设备mac
,10.244.2.2
的mac
地址也变成了对端vxlan
设备mac
,
Node1 物理网口数据分析
在物理口发现没有xvlan
设备的信息,只有本端口发送给对端的UDP
协议数据,经过解码数据包,发现数据包报头被封装成了vxlan
格式
Node2 vxlan 设备数据分析
数据包在到达对端的物理网口后会解包,根据vxlan
的vni
解析到需要发送给vxlan32
设备,并且发现mac
也都是vxlan
设备mac
,此时证明隧道成立
FAQ
- 为什么要先建立
vxlan
设备?
可以后建立vxlan
设备,但是这里用的是32
位主机地址10.244.1.0
,经测试发现主机地址与网桥下的10.244.1.0/24
端有冲突,所以需要先行创建,如果使用10.244.3.0
这种不同网段的则可以后创建网桥,经过分析发现flannel
也是先创建vxlan
设备
- 如果有3台机器走点对点是不是很麻烦?
如果有多台机器,可以走多播模式