Linux KVM 虚拟机使用Vxlan通讯
本文的实验环境:
两台物理服务器:浪潮
服务器操作系统:Centos8 Server
Linux 内核版本:4.18.0-147.el8.x86_64
虚拟机系统:centos8 mini
一、点对点的VXLAN :
过程介绍:一台物理服务器架vxlan 虚拟网卡,将其绑定在物理网卡上,物理网卡负责传输报文,从而能够正常通讯;
最简单的vlxan ,直接用两台服务器构成一个vxlan 网络,每台机器有一个 vtep,vtep 通过它们的 IP 互相通信;
流程如下:
vxlan1(192.168.8.101/24)---->eth0(10.20.1.2)----->eth0(10.20.1.3)----->vxlan1(192.168.8.100)
1、物理服务器设置IP
过程在这里不进行叙述;
2、建vxlan 网络
这里我们全部采用IP 命令;
[root@centos111 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 remote 192.168.8.101 local 192.168.8.100 dev ens47f1
相关参数解释:
Id:vxlan 里的VNI 值,理解为tag 值即可;
Remote:远端vtep IP,这个IP 是指的对端的网卡IP;
Local: 当前节点 vtep 要使用的 IP 地址;
dstport:vtep 通信的端口,linux 默认使用 8472(为了保持兼容,默认值一直没有更改),而 IANA 分配的端口是 4789,所以我们这里显式指定了它的值;
dev ens47f1:当节点用于 vtep 通信的网卡设备,用来读取 IP 地址;
查看vxlan 虚拟机网卡的相关信息:
[root@centos111 ~] # ip -d link show vxlan0
20: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1550 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether ea:5a:4c:51:85:cf brd ff:ff:ff:ff:ff:ff promiscuity 1
vxlan id 42 remote 192.168.8.100 local 192.168.8.101 dev ens47f1 srcport 0 0 dstport
3、为创建的虚拟网卡设置IP
[root@centos111 ~]# ip addr add 10.20.1.2/24 dev vxlan0
4、启动网卡
[root@centos111 ~]# ip link set vxlan0 up
5、服务器2 设置
第二台进行与第一台相同的过程,需要注意的是IP 要设置成规划中的,要保证 VNI 也是 42,dstport 也是 4789,比如物理服务器网卡IP 需要设置成192.168.8.100 ,虚拟网卡IP 要设置成10.20.1.3即可;
6、测试vxlan 之间是否能通讯
ping 测试:
在一台服务器上进行pingd 对端:如在10.20.1.2 上ping 10.20.1.3;
[root@centos111 ~]# ping -c 3 10.20.1.3
PING 10.20.1.3 (10.20.1.3) 56(84) bytes of data.
64 bytes from 10.20.1.3: icmp_seq=1 ttl=64 time=1.84 ms
64 bytes from 10.20.1.3: icmp_seq=2 ttl=64 time=0.462 ms
64 bytes from 10.20.1.3: icmp_seq=3 ttl=64 time=0.427 ms
二、多播模式的 vxlan
多播组本来的功能就是把网络中的某些节点组成一个虚拟的组,所以 vxlan 最初想到用多播来实现是很自然的事情。
这个实验和前面一个非常相似,只不过主机之间不是点对点的连接,而是通过多播组成一个虚拟的整体;
流程:
流程如下:
vxlan1(192.168.8.101/24)---->eth0(10.20.1.2)---mulcast group(239.1.1.1)-->eth0(10.20.1.3)----->vxlan1(192.168.8.100)
1、物理服务器设置IP
过程在这里不进行叙述;
2、创建vxlan 网络
这里我们全部采用IP 命令;
[root@centos111 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 group 239.1.1.1 dev ens47f1
参数:
参数 group 239.1.1.1 表示把 vtep 加入到这个多播组;
运行上面的命令之后,一样添加了对应的路由,不同是的 fdb 表项:
[root@centos111 ~]# bridge fdb
00:00:00:00:00:00 dev vxlan0 dst 239.1.1.1 via enp0s8 self permanent
这里默认表项的 dst 字段的值变成了多播地址 239.1.1.1,而不是之前对方的 vtep 地址。
3、为创建的虚拟网卡设置IP
[root@centos111 ~]# ip addr add 10.20.1.2/24 dev vxlan0
4、启动网卡
[root@centos111 ~]# ip link set vxlan0 up
对端需要同样进行设置;
5、测试vxlan 之间是否能通讯
ping 测试:
在一台服务器上进行pingd 对端:如在10.20.1.2 上ping 10.20.1.3;
[root@centos111 ~]# ping -c 3 10.20.1.3
PING 10.20.1.3 (10.20.1.3) 56(84) bytes of data.
64 bytes from 10.20.1.3: icmp_seq=1 ttl=64 time=1.84 ms
64 bytes from 10.20.1.3: icmp_seq=2 ttl=64 time=0.462 ms
64 bytes from 10.20.1.3: icmp_seq=3 ttl=64 time=0.427 ms
三、利用 bridge 来连接虚拟机之间通讯
尽管上面的方法能够通过多播实现自动化的 overlay 网络构建,但是通信的双方只有 vtep,在实际的生产中,每台主机上都有几十台甚至上百台的虚拟机或者容器需要通信,因此我们需要找到一种方法能够把这些通信实体组织起来。
在 linux 中把同一个网段的 interface 组织起来正是网桥(bridge,或者 switch,这两个名称等价)的功能,因此这部分我们介绍如何用网桥把多个虚拟机或者容器放到同一个 vxlan overlay 网络中;
流程:
vm1 --->br1 --->vxlan1(192.168.8.101/24)---->eth0(10.20.1.2)---mulcast group(239.1.1.1)-->eth0(10.20.1.3)----->vxlan1(192.168.8.100)--->br1 --->vm2
1、网桥与vxlan 虚拟IP设置
[root@centos111 ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 group 239.1.1.1 dev ens47f1
[root@centos111 ~]# ip addr add 10.20.1.2/24 dev vxlan0
[root@centos111 ~]# ip link add br0 type bridge
[root@centos111 ~]# ip link set vxlan0 master br0
[root@centos111 ~]# ip link set vxlan0 up
[root@centos111 ~]# ip link set br0 up
2、网桥与Vxlan 相关配置查看
[root@centos111 ~]# ip -d link show vxlan0
30: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1550 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether de:6a:ea:48:19:54 brd ff:ff:ff:ff:ff:ff promiscuity 0
vxlan id 42 group 239.1.1.1 dev ens39f1 srcport 0 0 dstport 4789 ttl inherit ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
[root@centos111 ~]# ip route
default via 192.168.107.254 dev eno4 proto static metric 103
10.20.1.0/24 dev vxlan0 proto kernel scope link src 10.20.1.2
192.168.8.0/24 dev ens39f1 proto kernel scope link src 192.168.8.100
192.168.107.0/24 dev eno4 proto kernel scope link src 192.168.107.111 metric 103
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
[root@centos111 ~]# ip -d link show br0
31: br0: <BROADCAST,MULTICAST> mtu 1550 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether de:6a:ea:48:19:54 brd ff:ff:ff:ff:ff:ff promiscuity 0
bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 0 priority 32768 vlan_filtering 0 vlan_protocol 802.1Q bridge_id 8000.de:6a:ea:48:19:54 designated_root 8000.de:6a:ea:48:19:54 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer 0.00 tcn_timer 0.00 topology_change_timer 0.00 gc_timer 0.00 vlan_default_pvid 1 vlan_stats_enabled 0 group_fwd_mask 0 group_address 01:80:c2:00:00:00 mcast_snooping 1 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 4 mcast_hash_max 512 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125 mcast_stats_enabled 0 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
mac 地址转发表
[root@centos111 ~]# bridge fdb
01:00:5e:00:00:01 dev dev eno1 self permanent
01:00:5e:00:00:01 dev dev eno2 self permanent
01:00:5e:00:00:01 dev dev eno3 self permanent
01:00:5e:00:00:01 dev dev eno4 self permanent
33:33:00:00:00:01 dev dev eno4 self permanent
33:33:ff:47:c8:92 dev dev eno4 self permanent
33:33:00:00:00:fb dev dev eno4 self permanent
01:00:5e:00:00:fb dev dev eno4 self permanent
01:00:5e:00:00:01 dev dev ens39f0 self permanent
33:33:00:00:00:01 dev dev ens39f0 self permanent
01:00:5e:00:00:01 dev dev ens39f1 self permanent
33:33:00:00:00:01 dev dev ens39f1 self permanent
01:00:5e:00:00:fb dev dev ens39f1 self permanent
01:00:5e:01:01:01 dev dev ens39f1 self permanent
01:00:5e:00:00:01 dev dev virbr0 self permanent
01:00:5e:00:00:fb dev dev virbr0 self permanent
52:54:00:ef:fa:d0 dev dev virbr0-nic vlan 1 master virbr0 permanent
52:54:00:ef:fa:d0 dev dev virbr0-nic master virbr0 permanent
33:33:00:00:00:01 dev dev vnet0 self permanent
01:00:5e:00:00:01 dev dev vnet0 self permanent
33:33:ff:ba:7c:55 dev dev vnet0 self permanent
33:33:00:00:00:fb dev dev vnet0 self permanent
de:6a:ea:48:19:54 dev dev vxlan0 vlan 1 master br0 permanent
de:6a:ea:48:19:54 dev dev vxlan0 master br0 permanent
00:00:00:00:00:00 dev dev vxlan0 dst 239.1.1.1 via ens39f1 self permanent
33:33:00:00:00:01 dev dev br0 self permanent
3、第二台主机配置
[root@localhost ~]# ip link add vxlan0 type vxlan id 42 dstport 4789 group 239.1.1.1 dev ens39f1
[root@localhost ~]# ip addr add 10.20.1.3 dev vxlan0
[root@localhost ~]# ip link set vxlan0 up
[root@localhost ~]# ip link add br0 type bridge
[root@localhost ~]# ip link set vxlan0 master br0
[root@localhost ~]# ip link set br0 up
4、将虚拟机配置
网卡架在br0 上,启动虚拟机,随后对两台服务器上的虚拟机设置同网段的IP,进行Ping 测试,如果可以正常ping 通,那么证明配置成功;
具体操虚拟机配置使用网桥请参照虚拟机使用网桥的说明文档;