openvswitch+libvirtd+vm

1 在物理机上安装openvswitch

1.1 编译成rpm包

#yum -y install wget openssl-devel gcc make python-devel openssl-devel kernel-devel kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool

#mkdir -p rpmbuild/SOURCES
#wget https://www.openvswitch.org/releases/openvswitch-2.5.10.tar.gz
#cp openvswitch-2.5.10.tar.gz  rpmbuild/SOURCES/
#cd rpmbuild/SOURCES/
#tar zxf openvswitch-2.5.10.tar.gz
#rpmbuild --bb --nocheck openvswitch-2.5.10/rhel/openvswitch.spec

1.2 安装并启动openvswitch

#cd ../RPMS/
#rpm -ivh openvswitch-2.5.10-1.x86_64.rpm 
#rpm -ivh openvswitch-debuginfo-2.5.10-1.x86_64.rpm
#systemctl start openvswitch

2 将此物理机上的vm加入到openvswitch网络中

2.1创建ovs网桥

#ovs-vsctl add-br ovsbr

2.2 编辑vm的XML文件

#virsh edit <vm>

修改前类似这样,vm是连接到网桥virbr0的,需要修改为刚才创建的网桥ovsbr

   <interface type='bridge'>
      <mac address='52:54:00:06:32:bf'/>
      <source bridge='virbr0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

修改后类似这样

<interface type='bridge'>
 <mac address='52:54:00:71:b1:b6'/>
 <source bridge='ovsbr'/>
 <virtualport type='openvswitch'/>
 <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

2.3 查看openvswitch网络

#ovs-vsctl show

2.4 文档

https://docs.openvswitch.org/en/latest/howto/libvirt/

3 配置ovsbr的IP地址,并修改物理机路由规则

在将vm加入到ovsbr之前, vm连接的是virbr0

virbr0的IP是192.168.122.1/24

vm的IP是192.168.122.10

将vm从virbr0加入到ovsbr后,从物理机上是无法ping通vm的,原因是ovsbr没有配置IP

11: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 52:54:00:7f:ba:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
12: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
    link/ether 52:54:00:7f:ba:1c brd ff:ff:ff:ff:ff:ff
22: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 36:28:6b:c1:fc:e6 brd ff:ff:ff:ff:ff:ff
23: ovsbr: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 5a:d8:c5:0c:3f:43 brd ff:ff:ff:ff:ff:ff
28: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UNKNOWN qlen 1000
    link/ether fe:54:00:69:f7:87 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe69:f787/64 scope link 
       valid_lft forever preferred_lft forever

3.1 ovsbr配置IP

#ifconfig ovsbr 192.168.122.254/24 up

3.2 修改路由规则

此时仍不能访问vm,原因是由于路由规则,之前的192.168.122.0/24网段都是通过virbr0转发的,现在要修改为ovsbr

#route del -net 192.168.122.0/24
#route add -net 192.168.122.0/24 gateway ovsbr

4 不同物理上的vm互相访问

4.1 文档

https://docs.openvswitch.org/en/latest/howto/tunneling/

4.2 场景

物理机IPvm名称vm IPvm tap name on ovsovs bridge nameovs bridge iproute
192.168.6.42vm5192.168.122.14vnet0ovsbr192.168.122.254route add -net 192.168.122.0/24 gateway ovsbr
192.168.6.42vm6192.168.122.15vnet1ovsbr192.168.122.254同上
192.168.6.43vm1192.168.122.10vnet0ovsbr192.168.122.253同上
192.168.6.43vm2192.168.122.11vnet1ovsbr192.168.122.253同上

目前vm1和vm2可以互访, vm5和vm6可以互访,现在我们将使用 GRE tunnel来实现2台物理机上vm的互访

4.3 添加GRE Tunnel或VXLAN

在192.168.6.42上添加:

GRE Tunnel

#ovs-vsctl add-port ovsbr gre0 -- set interface gre0 type=gre options:remote_ip=192.168.6.43

VXLAN Tunnel

#ovs-vsctl add-port ovsbr vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.6.43

在192.168.6.43上添加:

GRE Tunnel

#ovs-vsctl add-port ovsbr gre0 -- set interface gre0 type=gre options:remote_ip=192.168.6.42

VXLAN Tunnel

#ovs-vsctl add-port ovsbr vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.6.42

查看192.168.6.42上

#ovs-ofctl show ovsbr
OFPT_FEATURES_REPLY (xid=0x2): dpid:00006622c9835846
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 2(gre0): addr:fe:0b:96:27:ca:a9
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 4(vnet1): addr:fe:54:00:e3:33:34
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 5(vnet0): addr:fe:54:00:ed:ec:b1
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 LOCAL(ovsbr): addr:66:22:c9:83:58:46
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
#ovs-vsctl show
f730d99a-0e87-4ae2-a1ce-626e7aac4517
    Bridge ovsbr
        Port ovsbr
            Interface ovsbr
                type: internal
        Port "vnet1"
            Interface "vnet1"
        Port "vnet0"
            Interface "vnet0"
        Port "gre0"
            Interface "gre0"
                type: gre
                options: {remote_ip="192.168.6.43"}
    ovs_version: "2.5.10"
#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 em1
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.0.0     0.0.0.0         255.255.0.0     U     100    0        0 em1
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 ovsbr

查看192.168.6.43上

#ovs-vsctl show
ece10d3a-41bd-493a-8914-96e502dee08b
    Bridge ovsbr
        Port "vnet1"
            Interface "vnet1"
        Port "gre0"
            Interface "gre0"
                type: gre
                options: {remote_ip="192.168.6.42"}
        Port ovsbr
            Interface ovsbr
                type: internal
        Port "vnet0"
            Interface "vnet0"
    ovs_version: "2.5.10"
#ovs-ofctl show ovsbr
OFPT_FEATURES_REPLY (xid=0x2): dpid:00005ad8c50c3f43
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: output enqueue set_vlan_vid set_vlan_pcp strip_vlan mod_dl_src mod_dl_dst mod_nw_src mod_nw_dst mod_nw_tos mod_tp_src mod_tp_dst
 2(gre0): addr:2a:07:02:70:79:b4
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
 3(vnet0): addr:fe:54:00:69:f7:87
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 4(vnet1): addr:fe:54:00:98:17:63
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max
 LOCAL(ovsbr): addr:5a:d8:c5:0c:3f:43
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
OFPT_GET_CONFIG_REPLY (xid=0x4): frags=normal miss_send_len=0
#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.10.254  0.0.0.0         UG    100    0        0 em1
192.168.0.0     0.0.0.0         255.255.0.0     U     100    0        0 em1
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 ovsbr

4.4 跨主机间虚拟机不能使用scp拷贝文件

原因是由于增加了一层Tunel后,增加了一层协议栈,导致包大小超过了MTU最大字节,所以需要修改主机的MTU大小,修改为1400,即可以实现跨主机间虚拟机的文件拷贝。

修改虚拟机网卡的MTU大小:

#ifconfig -v ens3 mtu 1400


版权声明:本文为shif_l原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。