KVM+OpenvSwitch虚拟交换机

2023-12-12 17:18:06 浏览数 (2)

虚拟机网络

为了使虚拟机与外部进行网络通信,需要为虚拟机配置网络环境。KVM虚拟化支持Linux网桥、Open vSwitch网桥等多种类型的网桥。如图所示,数据传输路径为"虚拟机 -> 虚拟网卡设备 -> Linux网桥或Open vSwitch网桥 -> 物理网卡"。

虚拟网络结构图

Open vSwitch虚拟交换机

Open vSwitch(OVS)是一个开源的多层虚拟交换机,用于连接虚拟机(VMs)和物理网络。在虚拟化环境中起到关键作用,允许管理员在数据中心网络中创建、配置和管理虚拟网络。OVS 可以在多种虚拟化平台上运行,包括常见的虚拟化技术如 KVM、Xen、VMware 和 Hyper-V 等。

Open vSwitch软件定义的网络 (SDN) 解决方案提供了高度灵活性和可编程性,使管理员能够通过 OpenFlow 协议对网络流量进行动态控制。支持多种功能,包括 VLAN、GRE、VXLAN、QoS、流量镜像和流表编辑等,使网络管理员能够根据需要对网络进行自定义配置。Open vSwitch 还支持一些高级功能,如端口镜像、流量过滤和负载均衡等,使其成为了一个功能强大且灵活的网络交换机解决方案。

Open vSwitch核心概念

  • Bridge :网桥,对应一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。
  • Port :Port 与物理交换机的端口概念类似, 每个 Port 都属于一个特定的 Bridge 。端口类型:Normal、Internal、Patch、Tunnel。
  • Interface:接口,对应网卡,即可以是 ovs 生成的虚拟网卡,也可能是挂载在 ovs 的物理网卡。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。

一、安装Open vSwitch组件

安装Open vSwitch组件

代码语言:javascript复制
dnf  install openvswitch

启动Open vSwitch服务

代码语言:javascript复制
systemctl start openvswitch

二、验证Open vSwitch组件

查询openvswitch相关信息

代码语言:javascript复制
rpm -qi openvswitch

查询Open vSwitch版本

代码语言:javascript复制
rpm -qa openvswitch
openvswitch-2.12.4-5.oe2203sp1.x86_64

查看Open vSwitch服务状态

代码语言:javascript复制
systemctl status openvswitch

三、搭建Open vSwitch网桥

创建Open vSwitch网桥br0

代码语言:javascript复制
ovs-vsctl add-br ovs-br0

将物理网卡eth0添加网桥br0

代码语言:javascript复制
ovs-vsctl add-port ovs-br0 ens192

查看ovsdb配置内容

sudo ovs-vsctl show

代码语言:javascript复制
7f998583-4004-4114-8816-427f7ddba69a
    Bridge "ovs-br0"
        Port "ovs-br0"
            Interface "ovs-br0"
                type: internal
        Port "ens192"
            Interface "ens192"
    ovs_version: "2.12.4"

方式一:命令配置(临时生效)

代码语言:javascript复制
ip addr flush dev ens192
ip addr add 192.168.100.234/24 dev ovs-br0
ip link set dev ovs-br0 up
ip route add default via 192.168.100.1

方式二:网卡配置文件(永久生效)

OVS网桥ovs-br0

代码语言:javascript复制
cat > /etc/sysconfig/network-scripts/ifcfg-ovs-br0 <<EOF
TYPE=OVSBridge
BOOTPROTO=none
NAME=ovs-br0
DEVICE=ovs-br0
DEVICETYPE=ovs
ONBOOT=yes
NM_CONTROLLED=no
IPADDR=192.168.100.234
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
DNS1=114.114.114.114
EOF

物理网卡

代码语言:javascript复制
cat > /etc/sysconfig/network-scripts/ifcfg-ens192 <<EOF
TYPE=OVSPort
NAME=ens192
DEVICE=ens192
ONBOOT=yes
OVS_BRIDGE=ovs-br0
DEVICETYPE=ovs
EOF

重启网卡

代码语言:javascript复制
systemctl  restart  network

注意:OVS类型网桥不支持NetworkManager管理,nmcli内部使用device和connection的类型匹配判断,所有当前ovs-bridge的配置 NetworkManager暂不支持,需要使用network-scripts管理,在OVS网桥配置文件中使用"NM_CONTROLLED=no"参数指定不使用 NetworkManager管理。

安装network-scripts

代码语言:javascript复制
dnf   install  network-scripts

ovs-vsctl常用命令

  • show: 查看ovsdb配置内容;
  • add-br NAME: 添加桥设备;
  • list-br: 显示所有已定义的BRIDGE;
  • del-br BRIDGE: 删除
  • add-port BRIDGE PORT: 将PORT添加至指定的桥;
  • del-port [BRIDGE] PORT: 从指定BRIDGE移除指定的PORT;
  • list-ports BRIDGE: 显示指定BRIDEG上已添加的所有端口;
  • list TBL [REC]: 列出某个表(如Interface,port)的信息;
  • ovs-vsctl find Port name=”NAME”: 查找名称为NAME的Port信息;

方式一:创建虚拟机,指定openvswitch虚拟交换机网桥

virt-install --name openeuler22.03-temp --memory 1024,maxmemory=2048 --vcpus 1,maxvcpus=5 --disk /data/openeuler22.03-temp.qcow2,format=qcow2,bus=virtio --boot=hd --import --network bridge=ovs-br0,virtualport_type=openvswitch,model=virtio --boot loader=/usr/share/edk2/ovmf/OVMF.fd --graphics vnc,password='123@123',listen=0.0.0.0 --accelerate --noautoconsole --video=cirrus

方式二:编辑XML文件,指定openvswitch虚拟交换机网桥

virsh edit

代码语言:javascript复制
<interface type='bridge'>
      <source bridge='ovs-br0'/>
      <virtualport type='openvswitch'>
      </virtualport>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

查询虚拟机网卡列表信息

virsh domiflist openeuler22.03-temp

代码语言:javascript复制
 Interface   Type     Source    Model    MAC
------------------------------------------------------------
 vnet0       bridge   ovs-br0   virtio   52:54:00:d5:67:2b

查看mac地址对应IP

代码语言:javascript复制
arp -a |grep 52:54:00:d5:67:2b
? (192.168.100.92) at 52:54:00:d5:67:2b [ether] on ovs-br0

0 人点赞