赞
踩
tap
设备其实就是一个Linux内核虚拟化出来的一个网络接口,即虚拟网卡;br-int
:是由OpenvSwitch虚拟化出来的网桥,但事实上它已经充当了一个虚拟交换机的功能了。br-int的主要职责就是把它所在的计算节点上的VM都连接到它这个虚拟交换机上面,然后利用br-tun的穿透功能,实现了不同计算节点上的VM连接在同一个逻辑上的虚拟交换机上面的功能,在br-int上面还有另一个端口E,它总是以patch-tun的形式出现,从字面就可以看出它是用来连接br-tun的。;qbr
网桥。在qbr上还存在另一个设备C,这也是一个TAP设备。C和br-int上的D连接在一起,形成一个连接通道,使得qbr和br-int之间顺畅通信。C通常以qvb开头,D通常以qvo开头;br-tun
同样是OpenvSwitch虚拟化出来的网桥,但是它不是用来充当虚拟交换机的,它的存在只是用来充当一个通道层,通过它上面的设备G与其他物理机上的br-tun通信,构成一个统一的通信层。这样的话,网络节点和计算节点、计算节点和计算节点这样就会点对点的形成一个以GRE
(GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式。在openstack中一般是基于L3的gre)为基础的通信网络,互相之间通过这个网络进行大量的数据交换。这样,网络节点和计算节点之间的通信就此打通了。而图中的G、H正是描述这一通信;namespace
:用来实现隔离的一套机制,不同 namespace 中的资源之间彼此不可见),正如这两个namespace的名称所示,它们承担的就是router和dhcp的功能。br-ex
这个虚拟网桥上,而br-ex实际上是混杂模式加载在物理网卡上,实时接收着网络上的数据包。至此,我们的计算节点上的VM就可以与外部的网络进行自由的通信了。当然,前提是我们要给这个VM已经分配了float-ip。KVM
全称是 Kernel-Based Virtual Machine,即 KVM 是基于 Linux 内核实现的。KVM有一个内核模块叫kvm.ko
,只用于管理虚拟 CPU 和内存;IO 的虚拟化,比如存储和网络设备由Linux内核和Qemu来实现。Libvirt
是 KVM 的管理工具;Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。OpenStack 底层也使用 Libvirt,所以很有必要学习一下。libvirtd
、API 库
和命令行工具 virsh
;grep -E '(vmx|svm)' /proc/cpuinfo)
命令,找到flags部分,如果其中输出有VMX或SVM,即表明支持虚拟化技术。- 一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度,我们可以在运行一个虚拟机的宿主机上查看进程,先输入virsh list
查看宿主机中运行的虚拟机列表,再输入ps -elf | grep kvm1
查看结果:KVM 将宿主机目录 /var/lib/libvirt/images/ 作为默认的 Storage Pool。那么 Volume 是该目录下面的文件了,一个文件就是一个 Volume。
如在创建虚拟机kvm1时,将镜像文件 cirros-0.3.3-x8664-disk.img 放到了 /var/lib/libvirt/images/目录下,文件 cirros-0.3.3-x8664-disk.img 也就是Volume,对于 kvm1 来说,就是它的启动磁盘了。
那 KVM 是怎么知道要把 /var/lib/libvirt/images 这个目录当做默认 Storage Pool 的呢?实际上 KVM 所有可以使用的 Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每个 Pool 一个 xml 文件,默认有一个 default.xml,其内容如下:
注意:Storage Pool 的类型是 “dir”,目录的路径就是 /var/lib/libvirt/images。
在 virt-manager 中打开 kvm1 的配置页面,右键添加新硬件:
在默认 Pool 中创建一个 8G 的卷,点击 “Finish”:
可以看到新磁盘的信息:
在 /var/lib/libvirt/images/ 下多了一个 8G 的文件 kvm1.img:
使用文件做 Volume 有很多优点:存储方便、移植性好、可复制、可远程访问(远程访问:是镜像文件不一定都放置到宿主机本地文件系统中,也可以存储在通过网络连接的远程文件系统,比如 网络文件系统NFS,或者是分布式文件系统中,比如 GlusterFS。这样镜像文件就可以在多个宿主机之间共享,便于虚机在不同宿主机之间做 Live Migration;如果是分布式文件系统,多副本的特性还可以保证镜像文件的高可用。
)。
KVM 支持多种 Volume 文件格式:在添加 Volume 时可以选择raw 是默认格式,即原始磁盘镜像格式,移植性好,性能好,但大小固定,不能节省磁盘空间。
qcow2 是推荐使用的格式,cow 表示 copy on write,能够节省磁盘空间,支持 AES 加密,支持 zlib 压缩,支持多快照,功能很多。vmdk 是 VMWare 的虚拟磁盘格式,也就是说 VMWare 虚机可以直接在 KVM上 运行。
配置 Linux Bridge br0
vimdiff
展示了对 /etc/network/interfaces 的修改:bridge_ports eth0
,其作用就是将 eth0 挂到 br0 上;brctl show
查看当前 Linux Bridge 的配置,eth0 已经挂到 br0 上了:virsh list --all
命令查看:配置 VM1
配置 VM2
配置使用 virbr0
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。
在 virt-manager 打开 VM1 的配置界面,网卡 Source device 选择 “default”,将 VM1 的网卡挂在 virbr0 上
启动VM1,brctl show 可以查看到 vnet0 已经挂在了 virbr0 上:
用 virsh 命令确认 vnet 就是 VM1 的虚拟网卡:
virbr0 使用 dnsmasq 提供 DHCP 服务,可以在宿主机中查看该进程信息:在 /var/lib/libvirt/dnsmasq/ 目录下有一个 default.leases 文件
当 VM1 成功获得 DHCP 的 IP 后,可以在该文件中查看到相应的信息:
上面显示 192.168.122.6 已经分配给 MAC 地址为 52:54:00:75:dd:1a 的网卡,这正是 vnet0 的 MAC。
之后就可以使用该 IP 访问 VM1 了:
没有问题,可以访问外网,说明 NAT 起作用了。
需要说明的是,使用 NAT 的虚机 VM1 可以访问外网,但外网无法直接访问 VM1。 因为 VM1 发出的网络包源地址并不是 192.168.122.6,而是被 NAT 替换为宿主机的 IP 地址了。
这个与使用 br0 不一样,在 br0 的情况下,VM1 通过自己的 IP 直接与外网通信,不会经过 NAT 地址转换。
LAN 表示 Local Area Network,本地局域网:通常使用 Hub 和 Switch 来连接 LAN 中的计算机。一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。
VLAN 表示 Virtual LAN:一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。 简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。
比方说,有两组机器,Group A 和 B。我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问:
1)一种方法是使用两个交换机,A 和 B 分别接到一个交换机;
2)另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。
请注意,VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。概念上一定要分清。 现在的交换机几乎都是支持 VLAN 的。
通常交换机的端口有两种配置模式: Access 和 Trunk。看下图:
Access 口:
这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。
Trunk 口:
假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3那如何让 AB 上相同 VLAN 之间能够通信呢?办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。 VLAN1、2、3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。
KVM 虚拟化环境下是如何实现 VLAN?如下图:
1)eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备与之相连;
2)eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10;
3)eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上;
4)这样的配置其效果就是: 宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10;
eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。而 eth0 就是一个 Trunk 口。VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签;
5)eth0.10 的作用是:定义了 VLAN10;
6) brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中。
再增加一个 VLAN20,见下图:
这样虚拟交换机就有两个 VLAN 了,VM1 和 VM2 分别属于 VLAN10 和 VLAN20。对于新创建的虚机,只需要将其虚拟网卡放入相应的 Bridge,就能控制其所属的 VLAN。
VLAN 设备总是以母子关系出现,母子设备之间是一对多的关系。一个母设备(eth0)可以有多个子设备(eth0.10,eth0.20 ……),而一个子设备只有一个母设备。
在实验环境中实施和配置如下 VLAN 网络:
1)配置VLAN
编辑 /etc/network/interfaces,配置 eth0.10、brvlan10、eth0.20 和 brvlan20,下面用 vmdiff 展示了对 /etc/network/interfaces 的修改:
重启宿主机,ifconfig 各个网络接口:
用 brctl show 查看当前 Linux Bridge 的配置:eth0.10 和 eth0.20 分别挂在 brvlan10 和 brvlan20上 了
在宿主机中已经提前创建好了虚机 VM1 和 VM2,现在都处于关机状态
2)配置VM1
在 virt-manager 中将 VM1 的虚拟网卡挂到 brvlan10 上:
启动VM1:
查看 Bridge,发现 brvlan10 已经连接了一个 vnet0 设备:
通过 virsh 确认这就是 VM1 的虚拟网卡:
3)配置VM2
类似的,将 VM2 的网卡挂在 brvlan20 上:
启动VM2:
查看 Bridge,发现 brvlan20 已经连接了一个 vnet1 设备:
通过 virsh 确认这就是 VM2 的虚拟网卡:
4)验证 VLAN 的隔离性:为了验证 VLAN10 和 VLAN20 之间的隔离,我们为 VM1 和 VM2 配置同一网段的 IP。
配置 VM1 的 IP:
配置 VM2 的 IP:
Ping 测试结果: VM1 与 VM2 是不通的:
原因如下:
(1)VM2 向 VM1 发 Ping 包之前,需要知道 VM1 的 IP 192.168.100.10 所对应的 MAC 地址。VM2 会在网络上广播 ARP 包,其作用就是问 “谁知道 192.168.100.10 的 MAC 地址是多少?”
(2)ARP 是二层协议,VLAN 的隔离作用使得 ARP 只能在 VLAN20 范围内广播,只有 brvlan20 和 eth0.20 能收到,VLAN10 里的设备是收不到的。VM1 无法应答 VM2 发出的ARP包。
(3) VM2 拿不到 VM1 vnet0 的 MAC 地址,也就 Ping 不到 VM1。
5)Linux Bridge + VLAN = 虚拟交换机
现在对 KVM 的网络虚拟化做个总结
(1)物理交换机存在多个 VLAN,每个 VLAN 拥有多个端口。 同一 VLAN 端口之间可以交换转发,不同 VLAN 端口之间隔离。所以交换机其包含两层功能:交换与隔离。
(2)Linux 的 VLAN 设备实现的是隔离功能,但没有交换功能。一个 VLAN 母设备(比如 eth0),不能拥有两个相同 ID 的 VLAN 子设备,因此也就不可能出现数据交换情况。
(3)Linux Bridge 专门实现交换功能。
将同一 VLAN 的子设备都挂载到一个 Bridge 上,设备之间就可以交换数据了。
(4)总结起来,Linux Bridge 加 VLAN 在功能层面完整模拟现实世界里的二层交换机。eth0 相当于虚拟交换机上的 trunk 口,允许 vlan10 和 vlan20 的数据通过;eth0.10,vent0 和 brvlan10 都可以看着 vlan10 的 access 口;eth0.20,vent1 和 brvlan20 都可以看着 vlan20 的 access 口。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。