1.ovirt介绍
Ovirt(openVirtualization)是一个基于KVM的开源IaaS项目,是redhat虚拟化管理平台RHEV的开源版本,其前身是Redhat的虚拟化商业产品。在架构设计上它使用了Node/Engine分离结构,以方便功能的划分与管理。
oVirt中的Engine通过HTTP协议向外提供HTTP API,同时提供内建的网页服务供用户和系统管理员使用。系统管理员通过网页可以创建、修改虚拟机及相关设备或用户权限,用户在拥有权限的情况下可以操作自己的虚拟机,并通过VNC或SSH登陆自己的虚拟机。
Engine在整个系统中充当管理者的角色并对外提供管理服务,它挂载了自己的数据库记录整个系统中所有的虚拟机配置,各个节点的自身状态,系统的网络状态,存储器状态。管理的逻辑,状态及策略全部在Engine中设置与实现。
Node只负责功能上的实现,不进行任何状态的记录和任何策略的实现。
Engine与Node之间的关系十分像Linux中驱动程序与应用程序的功能分割关系:驱动仅仅负责功能的实现,如设备的读、写、开启与关闭,如何使用这些功能留给应用层。同样Node仅仅负责实现虚拟机器与设备的创建与修改,资源的共享与保护,如何使用这些功能交给Engine处理。
VDSM的功能主要有:负责Node的自动启动与注册;虚拟机的操作与生命周期管理;网络管理;存储管理;Host与VM状态监视与报告;提供对虚拟机的外部干涉功能;提供内存与存储的合并与超支功能(OverCommitment)。
Ovirt体系架构
一个标准的oVirt部署包括三部分,主要有:
1.ovirt-engine,这个被用于部署,监管,移除,停止和创建VM镜像,配置存储,网络,等等。
2.一个或多个ovirt-node,我们在node上运行虚拟机(VMs)。node上安装了VDSM和libvirt以及安装了一些额外的包,这些包可以实现网络和其他系统服务的虚拟化。
3.一个或多个存储节点,其上保存着对应虚拟机的磁盘镜像和ISO镜像。存储节点可以使用块和文件存储,并且可以通过NFS在本地或者远程进行访问。通过POSIXFS存储类型是可以支持Gluster这样的存储技术的。存储节点被分在一个存储池中,这样可以保证高可用和冗余。
Ovirt Engine
oVirtengine是一个基于JBoss的java应用程序(由C#演变过来),它作为web服务来运行。这个服务直接指挥node上的VDSM去部署,启动,停止,迁移和监控虚拟机,以及从模板中创建新的镜像至存储中。
engine提供的一些功能:
- 虚拟机生命周期管理
- 通过LDAP(微软的AD或IPA)进行身份验证
- 网络管理-增加本地网络并且将其附加至主机上。
- 存储管理-管理存储域(NFS/iSCSI/Local)和虚拟VM磁盘。
- 高可用-在其它主机中失败的主机上自动重启客户虚拟机
- 在线迁移-在零停机的情况下移动主机之间的虚拟机。
- 系统调度-基于资源使用/政策持续负载均衡虚拟机。
- 节能优化-在非高峰时期将续集你集中到较少的服务器上。
- 维护管理器-在计划的维护期间,无需为虚拟机停机。
- 镜像管理-基于模板管理,自动精简配置和快照。
- 监控-为系统中的所有对象-虚拟客户机,主机,网络,存储等等。
- 导出/导入-使用OVF文件导入和导出虚拟机和模板。
- V2V-可以将VMware或RHEL或Xen环境下的虚拟机轻松转换到oVirt环境中
Core
enginecore中的主要组件有:
- -负责所有与之相关的DB操作。
- VDS Broker -负责所有需要与VDSM交互的操作。
- LDAP Broker -负责验证和抓取LDAP目录下用户/组的属性(当前支持AD,IPA和RHDS)
- Backend Bean-一个Singletonbean ,负责运行不同实体的指令,查询和监控。
VDSM
VDSM是一个以Python开发的组件,它可以为主机,虚拟机,网络和存储管理提供所需要的所有功能。
- VDSMAPI是基于XML-RPC的(计划转移到RESTAPI)。这就是ovirt-engine如何与VDSM进行通信的。
- 配置主机,网络和共享的存储。
- 使用libvirt,进行虚拟机的生命周期操作
- 多线程,多进程
- 通过virtio-serial和客户代理对话。
- 添加自定义的对扩展到数以百计的node的LVM的集群支持
- 在所支持的存储类型(本地目录,FCP, FCoE, iSCSI, NFS, SAS)的基础上实现一个分布式镜像库。
- 多主机系统,一个并发的元数据写入器。
- 在数据写入器中进行扩展。
Hooks机制
- 允许管理员定义修改虚拟机操作的脚本,例如,添加额外的操作像CPU定位,watchdog设备,直接访问LUN
- 允许在集成完成前为新的KVM特性扩展oVirt。
- 有一种简单的方式来测试新的kvm/libvirt/linux特性。
- 在VDSM利用libvirt开始启动虚拟机之前调用hook机制。
- hook改变了虚拟机定义,并且VDSM通过定义至libvirt以开启虚拟机。
MoM集成
VDSM是和MoM集成在一起的。MOM的行为配置了策略。随着这些策略的使用者可以微调主机的高内存过量使用或安全操作。为了控制它的mom实例,vdsm确实传递了一个mom配置文件并且mom策略文件可以设置mom的缺省行为。刚开始,vdsmd利用配置和策略文件导入了mom并将其初始化。从那时起,mom通过API.py中定义好的API与vdsm进行交互并且控制了运行在主机上的每个虚拟机的内存。mom实例作为vdsm守护进程内的线程运行。
VDSM对存储器的管理
存储器的管理是oVirt的重点,本节将介绍oVirt是如何组织与分配各种存储器的,用户应该如何使用它。每一个Node上都会运行一个VDSM,实现网络、存储器、虚拟机的创建与修改的功能。VDSM的大部分代码用在了存储系统上,其功能包括数据的组织,集群下的数据共享与保护,故障恢复。通常情况下每一个物理机器当作一个Node,运行一个VDSM,Node本身只携带少量存储器用以保存配置。一个集群中通常有一个Engine和数个Node,这些Node通过网络连接到SAN(StorageArea Network) 上,VDSM把Node上运行的虚拟机存储数据保存在SAN上,Node本身为无状态的节点,重新启动后状态消失,从而保证了系统整体的可用性,一般情况下不会因用户的操作而使Node失效。一旦问题发生,通常一次重启即可恢复工作状态。
在云计算环境中,SAN中往往存储着大量虚拟机器使用的virtualimage,同时每一个virtualimage在任何时候都可能被任意Node访问,同时出于性能的考虑virtualimage可能以文件或者数据块的形式出现,这些对存储系统的设计提出了挑战。
为此,VDSM基于以下原则设计了自己的存储系统:
1高可用性:一群安装有VDSM的Node在组建集群的时候,没有潜在的单点故障存在,任何一个Node崩溃不会影响整个集群的功能,它的角色会被其他Node取代。Engine不可用的情况下,Node将继续工作,用户对虚拟机的操作可以继续进行。
2高伸缩性:添加Node和SAN几乎不需要用户的设置,Node上的VDSM会自己注册自己。
3集群安全性:一个VDSM对正在操作的virtualimage进行排它性保护。
4备份与恢复:virtualimage之间有相互关连的特性记录可进行一系列引用/备份操作。
5性能优化:利用多线程与多进程减少操作堵塞状况。
存储域
StorageDomain(以下简程SD)是VDSM中的最基本存储实体,所有的virtualimage和virtualimage对应的元数据都会保存在其中。和VDSM中的StorageImage概念不同,这里的virtualimage表示的是虚拟机程序用到的虚拟磁盘数据,特指虚拟机程序最终能够操作的文件或设备文件对象。元数据是描述virtualimage相关数据大小、状态、锁等内容的一组数据集合。SD包括两种类型:FileDomain和BlockDomain。FileDomain使用文件系统存储数据并同步操作,主要针对NFS(NetworkFile System) 和LOCALFS(LocalFile System) 文件系统。在文件系统的帮助下,FileDomain拥有良好的virtualimage操作能力,每一个虚拟机的存储数据(称为Volume)和对应的元数据都以文件的方式保存。每一个Domain实际对应于Host文件系统上的一个目录,针对NFS文件系统VDSM还有额外的逻辑来处理相关意外与错误情况。而BlockDomain直接操作原始的块数据,使用Linux的LVM(LogicalVolume Manager) 功能来组织数据,主要针对iSCSI(InternetSmall Computer System Interface),FCoE(FibreChannel over Ethernet ) 等块设备。由于目标设备上通常没有一个文件系统来保证访问的安全性,VDSM使用了邮箱机制来保证任意时刻,只有一个Node可以修改Block上的内容,而其他Node则通过Socket邮箱发送自己的修改请求。因此它的操作请求速度和监视功能都会比FileDomain弱一些。通常设备将使用Linux的devicemapper机制进行一次映射,每一个Domain实际上是一个Linux中的VolumeGroup(lun),元数据保存在其中的一个LogicVolume及其tag上,虚拟机的Volume保存在另一个LogicVolume中。
StoragePool(以下简称SP)是一组SD的组合,目标是管理跨越SD之间的操作,也就是说SD之间互相的引用、备份、恢复,合并一般发生在一个SP之中。在数据中心里,一个SP抽象了一组SD的集合供外界的Node访问或者Engine管理,并且一个SP中的所有SD必须是同一类型,如NFS或者iSCSI。
为了保证SP中的数据安全,一组SP中需要选择一个SD作为主存储域MasterDomain。这个Domain的不同之处在于它会保存SP中所有的元数据,保存一些异步请求或者任务的数据,保存所在SP的集群存储用到的锁。
为了简化管理,oVirt中抽象出了DataCenter概念,一个DataCenter将拥有一组NodeCluster用来运行虚拟机,一个StoragePool用来保存虚拟磁盘数据。NodeCluster是一组专门用来运行虚拟机的Node的集合,运行在其中的虚拟机可以动态迁移到NodeCluster中的另外一个Node上。一个DataCenter是一个完成oVirt所有功能的实体,在这个DataCenter中用户可以创建虚拟机、备份虚拟机、配置虚拟机的StorageDomain,动态迁移虚拟机。NodeEngine有一些算法在开启的时候可以自动平衡DataCenter中的Node的负载。概括起来一个DataCenter是一个管理NodeCluster与StoragePool的集合。
由于DataCenter中所有的Node都拥有对DataCenter中的StoragePool的访问权限,因此VDSM实现了一个称为SPM(StoragePool Manager) 的功能角色。在一个DataCenter中,所有的Node启动后会自动选举出一个Node充当SPM的角色,被选举者将运行VDSM上的SPM逻辑,SPM负责完成以下功能:创建/删除/缩放所在DataCenter中的Image,快照,模板。这些操作的共同点是会影响StoragePool中的元数据,如SAN上松散块设备的分配。为了保证元数据不被多个Node同时修改,SPM拥有对StoragePool中元数据的排它性操作权限,SPM使用集中式邮箱接受其他Node的相关请求,其他Node只能通过给SPM发送操作请求的方式修改元数据,最终的操作都由SPM线性完成,从而避免了存储器操作竞态的出现。为了兼顾效率,不修改元数据的普通操作,如数据读写,Node可以不同过SPM,自己直接访问StoragePool完成。由于SPM是由一个普通Node选举出来的,因此当它因为外部原因失效后,系统将会选举出另外的Node充当SPM,从而保证系统能继续运行。
Ovirt guest agent
Ovirt-guest-agent是一个python编写的运行在虚拟机内部的守护程序(可执行文件为/usr/share/ovirt-guest-agent/ovirt-guest-agent.py),通过宿主机的VDSM为虚拟化管理器(ovirt-engine或rhev-m)提供虚拟机的信息,在虚拟机上通过虚拟串口virtio-serial(默认首选方式)或者isa-serial使用json协议与宿主机上的unixsocket文件进行交互。
guest agent它提供了虚拟机的一些信息和一些无法从虚拟机操作系统外部来执行的预设操作
Engine将发给guestagent的请求重定向到VDSM,VDSM通过 VirtIO通道使用JSON格式的纯文本命令与guest通信
获取linux系统的信息可以参考guest agent的实现,参考源博客内容的代码分析。