深入理解虚拟化
扫描二维码
随时随地手机看文章
-
虚拟化管理程序Hypervisor(VMM),位于虚拟机与底层硬件设备之间的虚拟层,直接运行于硬件设备之上,负责对硬件资源进行抽象,为上层虚拟机提供运行环境所需资源,并使每个虚拟机都能够互不干扰、相互独立地运行于同一个系统中。
-
计算虚拟化,针对CPU和内存资源虚拟化技术。
-
网络虚拟化,针对网络链路资源虚拟化技术。
-
IO虚拟化,针对IO资源虚拟化技术。
-
存储虚拟化,针对磁盘存储资源虚拟化技术。
|
全虚拟化
|
硬件辅助虚拟化
|
操作系统协助/半虚拟化
|
实现技术 |
二进制翻译,BT 和直接执行
|
遇到特权指令转到root模式执行
|
Hyper call
|
客户操作系统修改/兼容性 |
无需修改客户操作系统,最佳兼容性
|
无需修改客户操作系统,最佳兼容性
|
客户操作系统需要修改来支持hypercall,因此它不能运行在物理硬件本身或其他的hypervisor上,兼容性差,不支持Windows
|
性能 |
差
|
全虚拟化下,CPU需要在两种模式之间切换,带来性能开销;但是,其性能在逐渐逼近半虚拟化。
|
好。半虚拟化下CPU性能开销几乎为0,虚机的性能接近于物理机。
|
应用厂商 |
VMware Workstation/QEMU/Virtual PC
|
VMware ESXi/Microsoft Hyper-V/Xen 3.0/KVM
|
Xen
|
- Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
- KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
- QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。
处理器 | CPU 虚拟化 | 内存虚拟化 | PCI Pass-through |
Intel | VT-x | VPID,EPT | VT-d |
AMD | AMD-V | ASID,NPT | IOMMU |
内存虚拟化
-
AMD 平台上的 NPT (Nested Page Tables) 技术
-
Intel 平台上的 EPT (Extended Page Tables)技术
I/O虚拟化
-
I/O设备尽量使用准虚拟化(virtio 和 vhost_net)
-
如果需要实时迁移,不能使用 SR-IOV
-
对更高I/O要求又不需要实时迁移的,可以使用 SR-IOV
-
每种方案都有优势和不足,在特定环境下其性能有可能反而下降,因此在生产环境中使用各种虚拟化方式前需要经过完整测试
-
在传统网络环境中,一台物理主机包含一个或多个网卡(NIC),要实现与其他物理主机之间的通信,需要通过自身的 NIC 连接到外部的网络设施,如交换机上。
-
这种架构下,为了对应用进行隔离,往往是将一个应用部署在一台物理设备上,这样会存在两个问题,
-
datapath是负责数据交换的内核模块,其从网口读取数据,并快速匹配Flowtable中的流表项,成功的直接转发,失败的上交
vswitchd处理。它在初始化和
port binding的时候注册钩子函数,把端口的报文处理接管到内核模块。
-
vswitchd是一个守护进程,是ovs的管理和控制服务,通过unix socket将配置信息保存到
ovsdb,并通过
netlink和内核模块交互。
-
ovsdb则是
ovs的数据库,保存了
ovs配置信息。
虚拟网络实现技术-Overlay
虚拟网络实现技术-Overlay
当前主流overlay技术是 GRE 和 VXLAN技术. 通过增加扩展报文头来实现虚拟网络在物理网络之上传输报文。
GRE
网络虚拟化使用通用路由封装 (NVGRE) 作为虚拟化 IP 地址的机制。在 NVGRE 中,虚拟机的数据包封装在另一个数据包中。此新 NVGRE 格式数据包的标头具有相应的源和目标提供程序区域 (PA) IP 地址。此外,它还具有 VSID (24 位虚拟子网 ID) ,该 ID 存储在新数据包的 GRE 标头中。
VXLAN
Virtual eXtensible Local Area Network (VXLAN) 是一种将2层报文封装到UDP包(Mac in UDP)中进行传输的一种封装协议。VXLAN主要是由Cisco推出的,VXLAN的包头有一个24bit的ID段,即意味着1600万个独一无二的虚拟网段,这个ID通常是对UDP端口采取伪随机算法而生成的(UDP端口是由该帧中的原始MAC Hash生成的)。这样做的好处是可以保证基于5元组的负载均衡,保存VM之间数据包的顺序。
容器网络实现
CNI(Container Network Interface) 是 google 和 CoreOS 主导制定的容器网络标准,它 是在 RKT 网络提议 的基础上发展起来的,综合考虑了灵活性、扩展性、IP分配、多网卡等因素。CNI旨在为容器平台提供网络的标准化。不同的容器平台(比如目前的 Kubernetes、Mesos 和 RKT)能够通过相同的接口调用不同的网络组件。这个协议连接了两个组件:容器管理系统和网络插件,具体的事情都是插件来实现的,包括:创建容器网络空间(network namespace)、把网络接口(interface)放到对应的网络空间、给网络接口分配 IP 等。
Kubernetes本身并不负责网络通信,Kubernetes提供了容器网络接口CNI(Container Network Interface),具体的网络通信交给CNI插件来负责,开源的CNI插件非常多,像Flannel、Calico等
容器网络实现
存储虚拟化
存储虚拟化(Storage Virtualization)最通俗的理解就是对存储硬件资源进行抽象化表现。构建具有统一逻辑视图的存储资源池供用户按需使用。存储虚拟化将各个分散的存储系统 进行整合和统一管理,并提供了方便用户调用资源的接口。另外,存储虚拟化能够为后续的系统扩容提供便 利,使资源规模动态扩大时无需考虑新增的物理存储资源(如不同型号的存储设备)之间可能存在的差异。
实现
存储虚拟化的实现方式:
(1) 裸金属 逻辑卷
(2) 存储设备虚拟化
(3) 主机存储虚拟化 文件系统
存储虚拟化分类
文件、块和对象是三种以不同的方式来保存、整理和呈现数据的存储格式。这些格式各有各的功能和限制。
-
文件存储会以文件和文件夹的层次结构来整理和呈现数据;
-
块存储会将数据拆分到任意划分且大小相同的卷中;
-
对象存储会管理数据并将其链接至关联的元数据。
-
块存储:即提供裸的块设备服务,裸设备什么都没有,需要用户自己创建分区、创建文件系统、挂载到操作系统才能用,挂一个块存储设备到操作系统,相当于插一个新U盘。只实现了read、write、ioctl等接口。SAN、LVM、Ceph RBD、OpenStack Cinder等都属于块存储服务。
-
文件存储:可以简单理解为分布式文件系统,通常实现了POSIX接口,不需要安装文件系统,直接像NFS一样挂载到操作系统就能用。典型的文件存储如NAS、HDFS、CephFS、GlusterFS、OpenStack Manila等。
-
对象存储:提供Web存储服务,通过HTTP协议访问,只需要Web浏览器即可使用,不需要挂载到本地操作系统,实现的接口如GET、POST、DELETE等,典型的对象存储如百度网盘、S3、OpenStack Swift、Ceph RGW等。
虚拟化管理工具
虚拟化管理工具是指与虚拟化环境及背后的实体硬件对接的软件,它的作用是简化资源管理、分析数据并简化运维。每个虚拟化管理系统都各不相同,但大多数系统都会提供简单的用户界面,还能简化虚拟机(VM)创建流程、监控虚拟环境、分配资源、编译报告,以及自动执行规则。
libvirt是一套用于管理硬件虚拟化的开源API、守护进程与管理工具。此套组可用于管理KVM、Xen、VMware ESXi、QEMU及其他虚拟化技术。libvirt内置的API广泛用于云解决方案开发中的虚拟机监视器编排层(Orchestration Layer)。
- EOF -