声明:
本博客欢迎转载,但请保留原作者信息!
作者:华为云计算工程师 林凯
团队:华为杭州研发中心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)
图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方法,作为参数
3) 在service.service.create是在/nova/nova/service.py的create方法,我们来看下其中都做了什么事情:
a) →根据binary参数的后半部分nova-scheduler和_manager拼接作为key
b) →manager从nova.conf中取对应的实现类
c) →将这些作为参数调用Service的_int_方法,生成Service实例
4) Service的_init_方法中根据这些参数值,import scheduler_manager class并实例化manager
5) 实例化完成之后,回到scheduler.py的main方法中看看service.serve(server)做了什么
6) Service.serve(server)方法内将刚才创建的RpcService实例启动
执行launch方法,因为workers = none,所以走else逻辑,会在当前进程中启动一个新的线程,在线程中启动服务,WsgiServer使用的是ProcessLauncher,会单独启动进程
启动进程的过程中,会将self.run_service方法,当做参数传递给add_thread方法
接下来从线程池中spawn出一个新的线程,此线程执行callback方法,也就是刚才做参数传递进来的run_service方法。
7) 看下run_service中的service.strat方法,其最重要的任务是建立了AMQP(高级队列消息)连接,并创建了三个consumer来接收消息队列的消息,start执行完成之后,当前进程就能够从AMQP队列中接收消息了。
……
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) 启动虚拟机
启动虚拟机的整体流程如下:
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获取请求处理函数
2) →处理要求后调用nova.compute_api.live_migrate(nova/compute/api.py)函数
3) →compute调用comductor中的live_migrate_intance(nova/conductor/api.py中的LocalComputeTaskAPI类)函数进行虚拟机迁移,compute将任务交给conductor完成
4) →conductor调用rpcapi中的migrate_server迁移服务器函数,通过RPC调用conductor/managr.py中的migrate_server函数
5) →在conductor中manager.py中经过一系列函数的调用,_live_migrate→live_migrate.execute→建立LiveMigrationTask类实例
6) →实例中调用compute_rpcapi.live_migration发送信息给目的主机的nova-compute处理请求
7) →在目的主机的nova/compute/manager.py上发起迁移过程,调用了两个方法pre_live_migration和live_migration
8) →pre方法是通过compute_rpc发送一个pre_live_migration的请求目的主机的nova_compute进行动态迁移的预处理
9) →live_migration是调用libvirt驱动(/nova/virt/driver.py)进行实际的迁移过程
10)→调用nova/virt/libvirt/driver.py中的live_migration,_live_migration/migrateToURI完成目标主机的虚拟机迁移
最后,交由驱动程序完成虚拟机迁移
----------------------------分割线-------------------------------
在Nova的基本解析到此告一段落,下篇文章将对Rabbitmq模块进行分析,后期还将会对Openstack的其他模块进行逐一分析、总结和梳理。