Libvirt虚拟化技术
边缘计算平台需要解决传统工作负载的接入。现有企业中仍有众多存量虚拟机的场景,需要通过统一的运维入口,同时管理容器和虚拟机。这也是从虚拟机迈向容器这个变迁过渡期中,企业最为关心的方案之一。
Libvirt是一个C语言库,有着其他编程语言的绑定,如Python、Golang、Ruby、Java、JavaScript等。这些编程语言的Libvirt是由另一个名为libvirtmod的类/包的包装器组成的。libvirtmod的实现与C/C++语言的实现在语法和功能上密切相关。Libvirt目前已被业界广泛应用,应用场景包括各种命令行工具、GUI工具、持续集成、IaaS服务(如OpenStack)、Web应用程序等等。Libvirt起初是专门为Xen设计的一种管理API,后来被扩展为可支持多个虚拟机监视器。
Libvirt主要支持的功能:
(1)虚拟机管理:包括不同类型客户机的生命周期操作,例如启停、暂停、保存、恢复、迁移等。
(2)远程机器支持:支持多种网络远程连接和传输方式。需要远程机器上运行着Libvirt Daemon,即可以通过本地访问和使用Libvirt功能。
(3)存储管理:创建与转换不同格式的虚拟机镜像文件,如RAW、QCOW2、VMDK等格式。挂载iSCSI磁盘共享、挂载NFS共享目录、LVM卷组管理、磁盘分区等等。
(4)网络接口管理:管理物理和逻辑的网络接口,以及创建和管理虚拟网络。
Libvirt支持了众多的虚拟化技术,例如LXC、OpenVZ、QEMU/KVM、Xen、User-mode Linux、VirtualBox、VMware ESXi and GSX、VMware Workstation and Player、Hyper-V、PowerVM、Parallels Workstation、Bhyve等。
如图2.6 Libvirt用例模型所示,Libvirt将物理主机称作节点(Node),其上运行着宿主操作系统(Host OS)也称作域(Domain)0,虚拟化管理程序(Hypervisor)上运行着虚拟机也称作客户操作系统(Guest OS)。Libvirt及其管理工具在域0中运行。
图2.6 Libvirt用例模型
使用Libvirt,我们有两种不同的控制方式。第一种如图2.6所示,管理应用程序(Management application)和域运行在同一个节点上,其通过调用Libvirt库控制本地虚拟机。第二种如图2.7所示,需要进行远程通信。远程节点上需要运行着libvirtd守护进程,一般安装Libvirt时就会安装和自动启动该守护进程,它能够自动辨别本地Hypervisor。远程通信模式下管理应用程序通过一类通用协议从本地libvirt连接到远程libvirtd。
图2.7 使用libvirtd控制远程虚拟机监控程序
Libvirt库高层API可划分为5个部分:虚拟机监控程序连接API、域API、网络API、存储卷API、存储池API。
为了可扩展地支持各种Hypervisor,Libvirt采取一种基于驱动程序的架构。该架构通过抽象一组通用的API提供服务,来屏蔽各种Hypervisor操作细节的不同。这样有利有弊,弊端是一些Hypervisor的某些特有功能在Libvirt API中是没有的。如图2.8所示,展示了Libvirt API与相关驱动程序的层次结构。
图2.8 基于驱动程序的Libvirt架构
Nomad中原先以qemu命令行参数的方式勉强提供了对运行虚拟机的支持。QEMU是全软件模拟网卡、磁盘等IO设备,同时借助KVM对CPU和内存的硬件虚拟化实现虚拟机加速。Nomad QEMU驱动可以通过KVM内核模块使用硬件虚拟化功能来获得更好的性能。直接用qemu-kvm的接口太繁琐,且qemu命令行参数的方式,需要配置大量繁琐的参数,不便于运维管理,所以本文研发了Nomad Libvirt驱动管理虚拟机,便捷和统一了虚拟机管理方式,并根据业务场景,提供了网络地址转换(Network Address Translation,NAT)和桥接(Bridge)网络模式的支持。