虚拟机网络
为了使虚拟机与外部进行网络通信,需要为虚拟机配置网络环境。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