KVM 虚拟机使用Vxlan通讯

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 通,那么证明配置成功;

具体操虚拟机配置使用网桥请参照虚拟机使用网桥的说明文档;

原文地址:https://www.cnblogs.com/juzib/p/12895823.html