KVM 集成 OpenvSwitch 虚拟交换机

KVM 集成 OpenvSwitch 虚拟交换机

KVM(Kernel-based Virtual Machine)是Linux内核中的一种虚拟化技术,它允许在同一台主机上运行多个虚拟机。

在默认情况下,KVM使用基于Linux bridge的网络虚拟化解决方案。Linux bridge是一种内核模块,可将多个网络接口桥接在一起,从而实现虚拟机与物理网络之间的通信。然而,Linux bridge功能相对有限,难以满足复杂网络虚拟化场景的需求。

与之相比,Open vSwitch是一种生产级别的软件交换机,被广泛应用于云计算、软件定义网络等领域。它提供了更加丰富和灵活的网络虚拟化功能,例如VLAN交换、QoS、镜像等,可以轻松实现网络隔离、负载均衡等高级功能。

因此,将KVM从默认的Linux bridge切换到Open vSwitch,可以大幅提升网络虚拟化的性能和功能。在接下来的博客中,我会详细介绍如何完成这一切换,包括Open vSwitch的安装、配置虚拟交换机、集成KVM等步骤。

在这里插入图片描述
操作系统版本:Ubuntu 22.04 LTS

安装 KVM

检查您的 CPU 是否支持虚拟化,运行以下命令,输出大于0,说明KVM与系统兼容,可以安装。

egrep -c 'vmx|svm' /proc/cpuinfo

使用apt命令安装qemu-kvm及相关工具

apt update -y
apt install -y qemu-kvm libvirt-daemon-system virtinst libvirt-clients bridge-utils

安装openvSwitch

apt update -y
apt install -y openvswitch-switch

创建KVM网络

默认KVM已经基于Linux Bridge 创建了一个名为default的NAT网络。

root@node1:~# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.525400f7e041       yes            root@node1:~# 
root@node1:~# virsh net-list Name      State    Autostart   Persistent
--------------------------------------------default   active   yes         yes

由于创建虚拟机时可以自由选择使用哪个网络,这里我们为KVM创建一个新的网络即可,原来的网络可以保持不变,或者配置后删除。

创建ovs网桥

在定义基于 OVS 的 libvirt 网络之前,您需要在 OVS 中创建虚拟交换机。

root@node1:~# ovs-vsctl add-br ovsbr0

然后验证它是否正确创建:

root@node1:~# ovs-vsctl show
654f0d05-ff5e-4979-a3ac-5b82b5f237a2Bridge ovsbr0Port ovsbr0Interface ovsbr0type: internalovs_version: "2.17.0"

现在你可以开始使用 libvirt 了。

定义 libvirt 网络

由于 libvirt 默认使用 Linux bridge,任何创建新网络的 virsh 子命令都会基于它创建一个网络,因此您需要创建一个包含基于 OVS 的网络定义的 XML 文件,并将其导入到库虚拟机。

生成一个随机UUID

root@node1:~# uuidgen 
c654bba4-224b-46a6-b9fb-99c71087cd05

创建ovs网络定义文件

cat >ovs-network.xml<<EOF
<network><name>ovs</name><uuid>c654bba4-224b-46a6-b9fb-99c71087cd05</uuid><forward mode='bridge'/><bridge name='ovsbr0'/><virtualport type='openvswitch'/>
</network>
EOF

注意:可以使用 uuidgen 为网络生成新的通用唯一标识符 (UUID)。

然后在libvirt中导入网络:

virsh net-define ovs-network.xml

仅在 libvirt 中定义网络不足以使网络可用。您必须启动网络并启用开机自动启动:

virsh net-start ovs
virsh net-autostart ovs

查看新创建的网络

# virsh net-list
Name    State   Autostart   Persistent
--------------------------------------------
default active  yes         yes
ovs     active  yes         yes

创建虚拟机

此时ovs网络已经准备就绪,我们使用精简的 cirros 镜像来创建2个虚拟机连接到该ovs网桥,该镜像仅有20M左右,非常适合用作测试。

下载镜像

wget https://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img

复制镜像到镜像模板目录

mkdir -p /var/lib/libvirt/images/templates/
cp cirros-0.6.2-x86_64-disk.img /var/lib/libvirt/images/templates/

创建镜像磁盘目录,并复制镜像

mkdir -p /var/lib/libvirt/images/{cirros01,cirros02}
cp /var/lib/libvirt/images/templates/cirros-0.6.2-x86_64-disk.img /var/lib/libvirt/images/cirros01/
cp /var/lib/libvirt/images/templates/cirros-0.6.2-x86_64-disk.img /var/lib/libvirt/images/cirros02/

创建镜像元数据文件:

cat >cirros.meta<<EOF
{
"instance-id": "10",
"local-hostname": "cirros"
}
EOFcat >cirros.user<<EOF
#!/bin/sh
echo DATASOURCE_LIST="nocloud" > /etc/cirros-init/config
EOF

说明:通过DATASOURCE_LIST="nocloud"参数指定cirros镜像在非云环境运行,防止连接不存在的元数据服务器出现启动缓慢问题:

checking http://169.254.169.254/2009-04-04/instance-id
failed 1/20: up 5.14. request failed
failed 2/20: up 7.18. request failed
failed 3/20: up 9.19. request failed

运行第一个虚拟机

virt-install \--name cirros01 \--vcpus 1 \--memory 256 \--disk path=/var/lib/libvirt/images/cirros01/cirros-0.6.2-x86_64-disk.img \--os-variant cirros0.5.2 \--import \--autostart \--noautoconsole \--network network:ovs \--cloud-init user-data="/root/cirros.user",meta-data="/root/cirros.meta"

运行第二个虚拟机

virt-install \--name cirros02 \--vcpus 1 \--memory 256 \--disk path=/var/lib/libvirt/images/cirros02/cirros-0.6.2-x86_64-disk.img \--os-variant cirros0.5.2 \--import \--autostart \--noautoconsole \--network network:ovs \--cloud-init user-data="/root/cirros.user",meta-data="/root/cirros.meta"

说明:

  • --network:必选,指定新建虚拟机使用ovs网络
  • --cloud-init:可选,防止cirros虚拟机启动过慢

查看创建的虚拟机

root@node1:~# virsh listId   Name       State
--------------------------5    cirros01   running6    cirros02   running

为cirros01虚拟机配置IP地址

root@node1:~# virsh console cirros01
Connected to domain 'cirros01'
Escape character is ^] (Ctrl + ])login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login: cirros
Password: 
$ 
$ sudo ip a add 10.0.0.10 dev eth0

为cirros02虚拟机配置IP地址

root@node1:~# virsh console cirros02
Connected to domain 'cirros02'
Escape character is ^] (Ctrl + ])login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login: cirros
Password: 
$ 
$ sudo ip a add 10.0.0.11 dev eth0

测试在cirros01虚拟机访问cirros02虚拟机

root@node1:~# virsh console cirros01
Connected to domain 'cirros01'
Escape character is ^] (Ctrl + ])login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login: cirros
Password: 
$ 
$ sudo ip a add 10.0.0.10 dev eth0
$ 
$ 
$ ping 10.0.0.11 -c 4
PING 10.0.0.11 (10.0.0.11) 56(84) bytes of data.
64 bytes from 10.0.0.11: icmp_seq=1 ttl=64 time=0.904 ms
64 bytes from 10.0.0.11: icmp_seq=2 ttl=64 time=0.729 ms
64 bytes from 10.0.0.11: icmp_seq=3 ttl=64 time=1.12 ms
64 bytes from 10.0.0.11: icmp_seq=4 ttl=64 time=0.847 ms--- 10.0.0.11 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.729/0.900/1.122/0.142 ms
$ 

ovs连接外网

上面我们测试了将两台虚拟机连接到同一个openvSwitch 虚拟交换机,两台虚拟机能够直接在二层相互通信,下面介绍将物理网卡添加到ovs网桥,实现ovs网桥下的虚拟机访问外网。

最终网络如下图所示:
在这里插入图片描述

查看主机网卡默认配置

root@node1:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:version: 2ethernets:ens33:dhcp4: falseaddresses:- 192.168.72.41/24nameservers:addresses:- 223.5.5.5- 223.6.6.6routes:- to: defaultvia: 192.168.72.8
root@node1:~# 

修改主机网卡配置,将ens33主网卡IP迁移到网桥端口,并且将ens33网卡加入ovs网桥中

root@node1:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:ethernets:ens33:dhcp4: falsedhcp6: falsebridges:ovsbr0:openvswitch: {}interfaces: [ ens33 ]dhcp4: falsedhcp6: falseaddresses: [192.168.72.41/24]routes:- to: defaultvia: 192.168.72.8nameservers:addresses: ["223.5.5.5","223.6.6.6"]parameters:stp: falseforward-delay: 4version: 2

验证配置文件,并应用配置使配置生效(谨慎操作,可能有SSH连接中断风险)

root@node1:~# netplan try
root@node1:~# netplan apply

查看OVS网桥,ens33网口成功添加到ovs网桥

root@node1:~# ovs-vsctl show
e2084c87-149e-428e-a7bd-89c644a0a9ceBridge ovsbr0fail_mode: standalonePort ens33Interface ens33Port ovsbr0Interface ovsbr0type: internalPort vnet1Interface vnet1Port vnet0Interface vnet0ovs_version: "2.17.9"

查看主机IP,已经配置到OVS网桥接口ovsbr0

root@node1:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000link/ether 00:50:56:aa:61:b5 brd ff:ff:ff:ff:ff:ffaltname enp2s1
3: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000link/ether da:1e:a6:0a:ff:8e brd ff:ff:ff:ff:ff:ff
4: ovsbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000link/ether 00:50:56:aa:61:b5 brd ff:ff:ff:ff:ff:ffinet 192.168.72.41/24 brd 192.168.72.255 scope global ovsbr0valid_lft forever preferred_lft foreverinet6 fe80::250:56ff:feaa:61b5/64 scope link valid_lft forever preferred_lft forever
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000link/ether 52:54:00:f7:e0:41 brd ff:ff:ff:ff:ff:ffinet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0valid_lft forever preferred_lft forever
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 1000link/ether fe:54:00:81:1d:ee brd ff:ff:ff:ff:ff:ffinet6 fe80::fc54:ff:fe81:1dee/64 scope link valid_lft forever preferred_lft forever
7: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UNKNOWN group default qlen 1000link/ether 0e:a2:61:58:2c:1a brd ff:ff:ff:ff:ff:ffinet6 fe80::ca2:61ff:fe58:2c1a/64 scope link valid_lft forever preferred_lft forever
root@node1:~# 

连接到虚拟机,查看虚拟机已经自动获取到外网IP地址(物理网络有提供DHCP服务,否则需要手动配置IP),并且能够正常与外网通信。

root@node1:~# virsh console cirros01
Connected to domain 'cirros01'
Escape character is ^] (Ctrl + ])$ 
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000link/ether 52:54:00:c7:81:b6 brd ff:ff:ff:ff:ff:ffinet 192.168.72.149/24 brd 192.168.72.255 scope global dynamic noprefixroute eth0valid_lft 42878sec preferred_lft 37478secinet6 fe80::5054:ff:fec7:81b6/64 scope link valid_lft forever preferred_lft forever
$ 
$ ping www.baidu.com -c 4
PING 183.2.172.185 (183.2.172.185) 56(84) bytes of data.
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=1 ttl=53 time=7.58 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=2 ttl=53 time=8.47 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=3 ttl=53 time=8.24 ms
64 bytes from 183.2.172.185 (183.2.172.185): icmp_seq=4 ttl=53 time=8.13 ms--- 183.2.172.185 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 7.576/8.104/8.472/0.329 ms
$ 

参考:https://www.redhat.com/sysadmin/libvirt-open-vswitch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280009.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程——预备知识

网络编程——预备知识 &#x1f343;套接字&#x1f33f;什么是套接字&#x1f33f;套接字的类型&#x1f33f;套接字的位置 &#x1f343;IP&#x1f343;端口号Port&#x1f343;字节序&#x1f343;地址信息结构&#xff08;结构体类型&#xff09; &#x1f343;套接字 &a…

【Python】: Django Web开发实战(详细教程)

Python Django全面介绍 Django是一个非常强大的Python Web开发框架&#xff0c;它以"快速开发"和"干净、实用的设计"为设计宗旨。本文将从Django的基本概念开始&#xff0c;逐渐引导大家理解如何使用Django构建复杂的web应用程序。 Django基本概念与原理…

浅谈前端路由原理hash和history

1、认识前端路由 本质 前端路由的本质&#xff0c;是监听 url 地址或 hash 值的改变&#xff0c;来切换渲染对应的页面组件 前端路由分为两种模式 hash 模式 history 模式 两种模式的对比 2、hash 模式 &#xff08;1&#xff09;hash 定义 hash 模式是一种把前端路由的路…

【MySQL】数据库的基础概念

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

【教程】rax3000m emmc刷机 支持硬件QOS MT7981到底值不值

为什么选择rax3000m&#xff1f; 1、恩山论坛237大佬放出了硬件QOS功能&#xff0c;而很多几百元路由器一旦开启QOS就会变软件NAT走CPU转发&#xff0c;效果还不如x86软路由。这样就非常适合刷机&#xff0c;在家里跑pt、迅雷等任务时候不会卡顿&#xff0c;实测&#xff0c;丢…

智慧公厕:卫生、便捷、安全的新时代厕所变革

在城市快速发展的背景下&#xff0c;公共厕所的建设和管理变得越来越重要。智慧公厕作为厕所变革的一项全新举措&#xff0c;通过建立公共厕所全面感知监测系统&#xff0c;以物联网、互联网、大数据、云计算、自动化控制技术为支撑&#xff0c;实现对公共厕所的智能化管理和运…

Fabric.js在vue2中使用

Fabric.js安装 这里我是基于vue来使用的&#xff0c;先安装上Fabric.js npm install fabric 在main.js中 import fabric from fabric Vue.use(fabric);Fabric 提供了 7 种基础形状&#xff1a; fabric.Circle (圆)fabric.Ellipse (椭圆)fabric.Line (线)fabric.Polyline (多条…

camunda 与 pycamunda学习

camunda 与 pycamunda 相关链接&#xff1a; camunda 官方社区&#xff1a;https://docs.camunda.org/manual/7.17/ 官方社区提供的REST_API:https://docs.camunda.org/manual/7.17/reference/rest/ GITHUB 社区&#xff1a;https://github.com/camunda-community-hub Git…

18.WEB渗透测试--抓包技术(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;17.WEB渗透测试--Kali Linux(五)-CSDN博客 网站协议抓包 1.BurpSuite Burp Suite 是用…

makefile基础与实战编译C++项目

从源码到执行程序 makefile运行流程 &#xff1a;这个符号用于在执行的命令之前&#xff0c;通常会告诉make不要输出命令本身&#xff0c;只输出命令的结果。但是当它位于命令行的开头时&#xff0c;它通常会让Make静默执行该命令&#xff0c;即不在命令行中显示该命令&#xf…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

MacBook使用——彻底卸载并删除软件:NTFS for Mac

问题 之前因MacBook读写NTFS格式移动硬盘&#xff0c;我安装并使用了 Paragon NTFS for Mac &#xff0c;试用期结束后将其从【应用程序】中卸载移除了。但之后每次开机启动时&#xff0c;系统还是会弹出【激活】通知&#xff0c;如下图 解决 Step1、在用户目录下的 Library 目…

STM32中MicroLIB的关闭为什么会导致卡死----解析

STM32MicroLIB 大家好我是 MHZ 。最近又开始往回捡单片机的知识了~ 之前大学的时候都没用过 STM 的 CubeMX&#xff0c;这会拿来用着感觉很方便啊~ 果然科技在进步&#xff01; 在开发使用 Keil 对 STM32 进行开发的时候在会有一个叫做 MicroLIB 的选项。 这个的具体原因我搜…

c++ 指针大小

C的一个指针占内存几个字节&#xff1f; 结论&#xff1a; 取决于是64位编译模式还是32位编译模式&#xff08;注意&#xff0c;和机器位数没有直接关系&#xff09; 在64位编译模式下&#xff0c;指针的占用内存大小是8字节在32位编译模式下&#xff0c;指针占用内存大小是4字…

联合和枚举

联合体类型的声明 联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在同一内存位置存储不同类型的数据。与结构体不同的是&#xff0c;联合体的所有成员共享同一块内存空间&#xff0c;因此联合体的大小取决于它最大的成员的大小。 所以联合体也叫…

基于python的变配电室运行状态评估与预警系统flask-django-nodejs-php

近年来,随着我国工业化、城镇化步伐的不断加快&#xff0c;城市配电网络取得令人瞩目的发展成果。变配电室是供配电系统的核心&#xff0c;在供配电系统中占有特殊的重要地位[1]。变配电室电气设备运行状态和环境信息缺乏必要的监测评估预警手段&#xff0c;如有一日遭遇突发情…

蓝桥杯之动态规划冲刺

文章目录 动态规划01背包小练一下01背包网格图上的DP完全背包 最长公共字符串最长递增子序列 动态规划 动态规划&#xff1a;确定好状态方程&#xff0c;我们常常是确定前 当状态来到 i 时&#xff0c;前 i 个物体的状态是怎么样的&#xff0c;我们并不是从一个点去考虑&#x…

Python爬虫获取接口数据

Python爬虫获取接口数据 正常人的操作​​​​​​​​​​爬虫的思路标题获取请求信息标题请求转换为代码完整代码请求返回信息执行程序获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获…

【计算机组成】27、有符号数和无符号数

文章目录 int 是有符号数 uint 是无符号数 所以 int8 的 范围是 -128 到 127 uint8 的范围是 0 到 255 同样的二进制 1000-0000 如果用 uint8 解释则为 255&#xff0c;但如果用 int8 解释则为 -128 同样的二进制 0111-1111 如果用 uint8 解释则为 127&#xff0c;但如果用…

云蜜罐技术(德迅猎鹰)诞生

数字化程度高且高价值信息密集的行业&#xff0c;如金融、能源、互联网、政府、教育、医疗、军工等行业&#xff0c;面对日益规模化、专业化的网络攻击&#xff0c;渐渐不再满足于一味的防守加固。除了巩固防线之外&#xff0c;他们愈发看重主动出击、感知更大范围内的攻击&…