OpenStack学习笔记之——OpenStack Nova解析

声明:

本博客欢迎转载,但请保留原作者信息!

作者:华为云计算工程师 林凯

团队:华为杭州研发中心OpenStack社区团队


       由于工作原因接触OpenStack不久,下面对自己的Openstack的学习资料进行简单的总结和梳理,之前对于云计算及Openstack几乎没有接触过,这方面的学习也几乎是从零开始,所以有一些理解错误和不全面的地方,望不吝赐教和指正。

本文主要是对Openstack核心组件Nova进行初步的分析和解读。

 

1.      基础概念

Openstack云中实例(instances)生命周期的所有活动都由组件Nova处理。这样使得Nova成为一个负责管理计算资源、网络、所需可扩展性的平台。其功能和特点在于:

1)  实例生命周期

2)  管理计算

3)  REST(Representional StateTransfer表征状态转移软件架构风格,具有CS结构,连接协议无状态性等特点,适合云计算环境)风格的API

4)  异步的一致性通信

5)  Hypervisor透明:支持Xen,XenServer/XCP,KVM,UML,VMware vSphere and Hyper-V

 

2.      Nova组件构成

Nova组件有以下六部分组成:

1)  API服务器 API Server(Nova-api)

2)  计算工作者Compute Workers(Nova-compute)

3)  网络控制器Network Controller(Nova-network)

4)  卷工作者Volume Worker(Nova-volume)

5)  调度器Schedule(Nova-schedule)

6)  消息队列Message Queue(rabbitmq server)

OpenStack学习笔记之——OpenStack Nova解析_第1张图片

图1 Nova软件框架图

上图是Nova的软件架构图,Nova中的各个组件(除了消息队列组件以外)都是有Python代码编写的守护进程,由上图可以看出每个进程之间通过队列(Queue)和数据库(Nova database)来交换信息。

 

下面对Nova的组件进行介绍。

1)  API服务器 API Server(Nova-api)

Nova-API对外提供一个与云基础设施交互的接口,也是外部可用于管理基础设施的唯一组件。它负责发起相应的类似运行新虚拟机实例这样的资源调度活动。

在实现层面上,nova-api是Python实现的WSGI应用。(WSGI即Web服务器网关接口是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受,它已基本达成可移植性方面的目标)

 

2)  计算工作者Compute Workers(Nova-compute)

Nova-compute处理管理实例生命周期,负责对虚拟机实例进行创建、终止、迁移、Resize的操作。

工作原理:队列中接收请求→执行→更新数据库状态

 

3)  网络控制器Network Controller(Nova-network)

Nova-network负责处理主机的网络配置,其中包括:IP地址分配,配置vlan,实现安全组,配置计算节点网络等任务。

工作原理:队列中接收网络任务→控制虚拟机的网络(创建桥接网络、改变iptables规则)

 

4)  卷工作者Volume Worker(Nova-volume)

Nova-volume提供卷管理,为虚拟机实例提供额外的volume访问

用来管理基于逻辑卷管理的实例卷。一个实例的重要数据总是要写在卷上,这样确保能在以后访问。

5)  调度器Schedule(Nova-schedule)

Nova-Scheduler负责为虚拟机实例指定运行的物理服务器,主要负责调度资源,有多种调度方法供选择

通过适当的调度算法从可用资源池获得一个计算服务。

 

6)  消息队列Message Queue(rabbitmq server)

Openstack节点之间通过消息队列使用AMQP(高级消息队列协议)完成通信(异步通信)。

Rabbitmq是对这个协议的一个实现,默认使用kombu消息框架,该部分本文不进行详细展开,将在另外一篇文章中进行讲述。

 

3.      Nova服务启动流程

Nova的服务类型分为两种,WsgiService和RcpService,每一种服务类型都会根据nova.conf的配置启动一个或多个进程。

现在来讲Nova进程的启动过程,以服务器上的代码为例:在/nava/bin目录下为所有的启动脚本入口,以RpcService Nova-scheduler为例对源代码进行走读分析

1)  /nova/bin/nova-sch

2)  main方法会创建一个RpcService,并将AMPQ的topic传入create方法,作为参数

OpenStack学习笔记之——OpenStack Nova解析_第2张图片

3)  在service.service.create是在/nova/nova/service.py的create方法,我们来看下其中都做了什么事情:

a)  →根据binary参数的后半部分nova-scheduler和_manager拼接作为key

b)  →manager从nova.conf中取对应的实现类

c)  →将这些作为参数调用Service的_int_方法,生成Service实例

OpenStack学习笔记之——OpenStack Nova解析_第3张图片

OpenStack学习笔记之——OpenStack Nova解析_第4张图片

4)  Service的_init_方法中根据这些参数值,import scheduler_manager class并实例化manager

OpenStack学习笔记之——OpenStack Nova解析_第5张图片

5)  实例化完成之后,回到scheduler.py的main方法中看看service.serve(server)做了什么

OpenStack学习笔记之——OpenStack Nova解析_第6张图片

6)  Service.serve(server)方法内将刚才创建的RpcService实例启动

OpenStack学习笔记之——OpenStack Nova解析_第7张图片

执行launch方法,因为workers = none,所以走else逻辑,会在当前进程中启动一个新的线程,在线程中启动服务,WsgiServer使用的是ProcessLauncher,会单独启动进程

OpenStack学习笔记之——OpenStack Nova解析_第8张图片

启动进程的过程中,会将self.run_service方法,当做参数传递给add_thread方法

OpenStack学习笔记之——OpenStack Nova解析_第9张图片

接下来从线程池中spawn出一个新的线程,此线程执行callback方法,也就是刚才做参数传递进来的run_service方法。

OpenStack学习笔记之——OpenStack Nova解析_第10张图片

OpenStack学习笔记之——OpenStack Nova解析_第11张图片

7)  看下run_service中的service.strat方法,其最重要的任务是建立了AMQP(高级队列消息)连接,并创建了三个consumer来接收消息队列的消息,start执行完成之后,当前进程就能够从AMQP队列中接收消息了。

OpenStack学习笔记之——OpenStack Nova解析_第12张图片

……

OpenStack学习笔记之——OpenStack Nova解析_第13张图片

8)  能够接收消息之后,进程就可以根据消息进行消息处理,服务至此启动成功。

9)  上面讲的是RpcService的启动过程,WsgiService和其差不多,只不过是会通过ProcessLaucher启动一个WsgiService,然后根据nova.conf和api-paste.ini配置文件在当前进程中fork出几个子进程,然后每个子进程有不同的端口处理不同的请求,例如:nova-api会fork出三个nova-api子进程,分别处理nova-ec2-api(8773端口),nova-os-compute-api(8774端口),nova-metadata-api(8775端口)

 

4.      虚拟机群集管理(生命周期管理)

Nova作为一个虚拟机群集管理组件,管理虚拟机的创建停止等生命周期全过程,指定虚拟机的分配策略(虚拟机如何选择要运行的物理机),进行虚拟机的迁移等等。

接下来分析nova管理创建虚拟机、启动虚拟机以及将虚拟机进行迁移的具体过程。

1)  创建虚拟机

创建一个虚拟机实例设计到Nova内部的多个组件,其创建的逻辑过程如下:

a)  API服务(Nova-api):处理用户请求并转发到云控制器

b)  消息控制器(Rabbitmq Cloud controller):处理计算节点、网络控制器服务、API服务和调度之间的通信

c)  调度器(Nova-computer/Nova-volume):管理实例:启动、终止实例,连上/卸下逻辑卷

d)  网络控制器(Nova-network(quantum-server)):管理网络资源:分配fixed IP地址、配置VLAN

 

2)  启动虚拟机

启动虚拟机的整体流程如下:

OpenStack学习笔记之——OpenStack Nova解析_第14张图片

a)  Nova-api接收启动instance请求,发送给Cloud controller

b)  Controller协调各组件,通知compute api完成调度前的数据准备和创建后的数据存储

c)  Scheduler向一个compute节点传递启动instance消息

d)  Compute启动虚拟机,有compute manager实现

e)  Networkcontroller为虚拟机配置网络,有quantum实现

 

3)  虚拟机迁移

在云数据中心,虚拟机要迁移,可能的原因有:

调整资源部署,比如临时需要规整出资源,用于新的业务,原来的VM要迁移到其他物理服务器上。再比如共有云在用户释放之后,希望将碎片回收规整,这样省出来的物理服务器甚至可以短时间下电,节省资源。

备份,原来的物理服务器是可以备份的,同样,虚拟化之后VM也有备份的需求,此类备份VM通常用在不同的物理服务器上。

负载调整,比如某个业务在一个VM上负载太重,需要扩,或者这个物理服务器上压力太大,需要调整负载到其他物理服务器等等。

虚拟机的迁移有很多原因,以上只是部分原因,因此虚拟机的迁移在Nova任务是一个非常重要的部分,同时在很多时候我们可能更需要关注更加严苛的情况,即热迁移或者叫动态迁移,也就是在VM上有业务运转的情况下如何迁移到新的备份虚拟机上,业务最好不中断,或者少中断。

以下是Openstack提供虚拟机迁移的流程:

1)  →live_migrateAPI获取请求处理函数

OpenStack学习笔记之——OpenStack Nova解析_第15张图片

2)  →处理要求后调用nova.compute_api.live_migrate(nova/compute/api.py)函数

OpenStack学习笔记之——OpenStack Nova解析_第16张图片

3)  →compute调用comductor中的live_migrate_intance(nova/conductor/api.py中的LocalComputeTaskAPI类)函数进行虚拟机迁移,compute将任务交给conductor完成

OpenStack学习笔记之——OpenStack Nova解析_第17张图片

OpenStack学习笔记之——OpenStack Nova解析_第18张图片

4)  →conductor调用rpcapi中的migrate_server迁移服务器函数,通过RPC调用conductor/managr.py中的migrate_server函数

OpenStack学习笔记之——OpenStack Nova解析_第19张图片

5)  →在conductor中manager.py中经过一系列函数的调用,_live_migrate→live_migrate.execute→建立LiveMigrationTask类实例

OpenStack学习笔记之——OpenStack Nova解析_第20张图片

OpenStack学习笔记之——OpenStack Nova解析_第21张图片

 

6)  →实例中调用compute_rpcapi.live_migration发送信息给目的主机的nova-compute处理请求

OpenStack学习笔记之——OpenStack Nova解析_第22张图片

OpenStack学习笔记之——OpenStack Nova解析_第23张图片

7)  →在目的主机的nova/compute/manager.py上发起迁移过程,调用了两个方法pre_live_migration和live_migration

OpenStack学习笔记之——OpenStack Nova解析_第24张图片

8)  →pre方法是通过compute_rpc发送一个pre_live_migration的请求目的主机的nova_compute进行动态迁移的预处理

OpenStack学习笔记之——OpenStack Nova解析_第25张图片

9)  →live_migration是调用libvirt驱动(/nova/virt/driver.py)进行实际的迁移过程

 OpenStack学习笔记之——OpenStack Nova解析_第26张图片

10)→调用nova/virt/libvirt/driver.py中的live_migration,_live_migration/migrateToURI完成目标主机的虚拟机迁移

OpenStack学习笔记之——OpenStack Nova解析_第27张图片

最后,交由驱动程序完成虚拟机迁移

 

 

 

----------------------------分割线-------------------------------

在Nova的基本解析到此告一段落,下篇文章将对Rabbitmq模块进行分析,后期还将会对Openstack的其他模块进行逐一分析、总结和梳理。

你可能感兴趣的:(云计算,Openstack,Nova,OpenStack技术专刊)