当前位置: 首页 > 科技观察

说说NovaComputeDriver的趣事

时间:2023-03-18 18:19:24 科技观察

Openstack设计指南OpenStack是一个开源的云计算平台项目,旨在为公有云和私有云的建设和管理提供软件的开源实现。可扩展性和弹性是Openstack的设计原则之一,即Openstack的每个组件和组件内部的模块都应该是可插拔的,可以随意添加插件,而不需要修改现有的接口。驱动机制就是一个很好的例子。Nova通过不同的驱动支持不同的hypervisor,Cinder通过不同的驱动支持不同的存储后端,Neutron通过各种代理支持不同的网络类型,Sahara通过各种插件支持不同类型的hypervisor。不同的Hadoop发行版等等,在Openstack中几乎处处都有这样的影子。所有驱动程序都是可配置的。通过配置不同的驱动程序,每个组件可以注册不同的驱动程序来支持不同的资源类型。什么是ComputeDriver说到Nova,相信大家都会想到它的作用就是管理虚拟机,甚至会不自觉地自动联想到Libvirt、QEMU、KVM等概念。我基本每次面试都会问nova的实现原理。大多数受访者都能回答:Nova的原理是调用Libvirt的API来管理QEMU/KVM虚拟机。是的,我们大部分人在部署Openstack的时候都会用到libvirt驱动,所以很多人误以为Nova只是对Libvirt的一个封装,Nova只能管理虚拟机。但实际上,Nova的功能远不止于此。我特别需要强调的是:Libvirt只是众多计算驱动程序中的一个。Nova可以管理的不仅仅是虚拟机。要理解以上两点,我们首先需要了解什么是ComputeDriver?司机的概念相信大家都懂。当我们购买新相机或U盘时,我们需要将其连接到笔记本上。我们需要做的第一件事是安装驱动程序。很多驱动是通用的,比如U盘,插入USB接口就可以使用,因为内核已经内置了这类存储设备的驱动。某些设备的驱动程序不是通用的。通常,当您购买设备时,您会得到一张带有驱动程序的小光盘,需要将其安装到您的计算机上才能使用该设备。因此,这里的驱动程序可以认为是设备与操作系统的交互接口,或者说是一个代理。虽然硬件设备多种多样,但操作系统定义的接口通常是固定的,比如open()、read()、write()、ioctl()、close()等,只要驱动程序实现了这些接口,它可以被操作系统识别和管理。同样,Nova相当于一个操作系统,各种hypervisor相当于各种设备,ComputeDriver相当于一个驱动程序。ComputeDriver定义了近120个接口,都在nova/virt/driver.py上定义和描述,如:spawn:创建实例。destroy:删除一个实例。start:对应虚拟机,即开机操作。stop:对应虚拟机,是关机操作。reboot:对应虚拟机,是重启操作。……这些接口通常是固定的,也是所有具体实现必须遵循的规范。它们描述了所有接口的函数、参数、返回类型等信息,比如spawn接口:defspawn(self,context,instance,image_meta,injected_files,admin_password,network_info=None,block_device_info=None):"""Createanewinstance/VM/domainonthevirtualizationplatform.Oncethissuccessfullycompletes,theinstanceshouldberunning(power_state.RUNNING).Ifthisfails,anypartialinstanceshouldbecompletelycleanedup,andthevirtualizationplatformshouldbeinthestatethatitwasbeforethiscallbegan.:paramcontext:securitycontext:paraminstance:nova.objects.instance.InstanceThisfunctionshouldusethedatatheretoguidethecreationofthenewinstance.:paramnova.objects.ImageMetaimage_meta:Themetadataoftheimageoftheinstance.:paraminjected_files:Userfilestoinjectintoinstance.:paramadmin_password:Administratorpasswordtosetininstance.:paramnetwork_info:instancenetworkinformation:paramblock_device_info:Informationaboutblockdevicestobeattachedtotheinstance."""...注意:定义的接口并不要求全部实现,根据根据具体的后端实现,只实现一部分接口即可,其他未实现的接口只需要简单抛出NotImplementedError异常即可。LibvirtDriver是其中一种实现,位于nova/virt/libvirt/driver.py,其中的spawn()方法相当于调用了libvirt的define()和start()方法。destroy()相当于调用了libvirt的destroy()方法和undefine方法,其他方法也可以找到对应的调用关系。了解什么是ComputeDriver,并思考前两个问题:Libvirt只是众多计算驱动程序中的一个。相信只要深入了解Nova,阅读Nova源码,就不会有疑惑。最新版本的Nova项目原生支持的计算驱动程序包括:libvirthypervxenapivmwareapiironicNova不仅可以管理虚拟机。这很有趣,甚至令人难以置信,但这是真的。Nova管理的虚拟机以外的东西,有些可能只是一次尝试,有些已经成为历史,有些是独立的入口。怀着好奇心,不妨好好盘点一下,除了虚拟机,Nova还能管理哪些有趣的东西。Openstack有人看到这里开始质疑是不是这里的标题写错了。这显然是在谈论Nova可以管理什么。为什么他们突然转移话题来谈论Openstack?Nova不是Openstack的组件之一吗?Nova管理Nova吗?信不信由你,这是真的。其实原理很简单,将ComputeDriver的所有实现换成另外一个NovaAPI调用即可。例如,spawn()方法被转换为对另一个NovaAPI的“POST/servers”请求。我们称这种模式为级联Openstack。这有什么用?我们知道Openstack越来越成熟稳定,但是一直未能很好地支持大规模扩展。当规模达到一定程度时,数据库、消息队列等都会成为性能瓶颈,限制单个Openstack规模的增长。社区也为此想过一些解决方案。分区域,分小区,前面提到的级联Openstack,都是社区的一些尝试。这些尝试都是可行的,但都存在各自的问题。Region和Cell将在后续文章中介绍。这里只介绍级联Openstack。官方文档参考OpenStack级联方案。原理如图:其实不仅是Nova,其他所有组件都可以通过类似的方式进行级联,实现大规模扩展:理论上,这种方式可以无限扩展Openstack节点,没有规模限制。其实在部署和实现上还有很多挑战,比如如何同步各个子集群的信息,网络通信等。目前社区已经把这部分实现逻辑单独拿出来,新开了两个相关项目[Tricircle]((https://wiki.openstack.org/wiki/Tricircle)和Trio2o,这两个项目基本都开发好了华为的,一个负责网管,一个负责级联,目前这两个项目还不是特别成熟,但是对支持大规模Openstack集群还是有借鉴意义的。多年来,甚至有人说Docker将取代虚拟机,K8S将取代Openstack,虽然这种描述过于夸张和不合理,但足以证明Docker的火爆程度,因此社区长期以来一直在尝试整合Docker。在Openstack的K版本中,Nova已经支持Docker驱动,可以通过Nova启动Docker容器,实现原理并不难,spawn()方法相当于调用Docker的run接口(实际上是调用create()和start()API),以及destroy()方法,然后调用Docker的rm接口。其他接口类似。Nova的Docker驱动项目地址为nova-docker。不过Docker毕竟是容器,和虚拟机还是有区别的。使用Nova集成Docker很难支持Docker的一些Advanced特性,比如link,volume等,于是有人提出集成Heat,通过Heat可以充分利用DockerAPI,但是缺少调度机制。于是新建了一个项目,提供容器服务,支持多租户和资源调度,这个项目的名字叫magnum。后来magnum想专注于容器编排服务,整合K8S、DockerSwarm等容器编排服务,而单体容器服务是一个独立的项目Zun。既然裸机Nova可以管理虚拟机,那肯定有人在思考,我们能不能管理我们的物理机呢?好吧,诺瓦做到了。Nova很早就支持裸机管理了。原理是现在调用IPMI接口代替原来的Libvirt接口,从而实现裸机管理。所以Nova的裸机驱动相当于封装了ipmitool命令。其实也是shell调用ipmitool。起初,裸机管理的代码实现直接放在Nova源码中,后来又单独独立出一个Ironic项目,提供裸机管理服务。原始IPMI包放在ironic-conductor服务中,所有裸机操作都必须通过ironic-api调用。因此,原来的Nova裸机驱动实现被带有ironic-api包的直接IPMI包所取代。总结除了上面提到的虚拟机,Openstack本身,Docker容器,物理机,Nova以后可能会支持更多的东西,现在可能想不到,以后会怎么样谁又说不准。【本文为专栏作家“傅光平”原创文章,如需转载请get联系】点击查看更多该作者好文