OpenStack:Nova组件介绍
云计算的概念
云计算的概念:按需分配,高扩展性
“云”是一个庞大的资源池,你按需购买;云可以像自来水,电,煤气那样计费,用多少买多少。如果你是一个网站站主,比方说12306.cn,你不必一开始就把所有的服务器和计算资源都买好,而是可以在网站的平常时段保持一个较低的云计算配置,在网站高峰期(春运)再进行弹性的扩展,用多少买多少。
正是由于这样的扩展性,出现了很多节点数量不同的云平台:
两节点云平台:
三节点云平台:
多节点云平台:
随需而变,按需分配,这是所有云平台典型的特征!
理解Nova
Nova简述
弹性云中,谁掌控全局?谁开谁关? --Nova
Compute Service Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。
OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的。
Nova的主要功能如果用5个字概括一下:就是管理云主机。
Nova:提供按需分配的虚拟机,处理虚拟机的启动、挂起、重启等操作。
它类似于Rackspaces的cloud servers和亚马逊的Amazon Elastic Compute Cloud(EC2)
Nova在OpenStack中的位置
Openstack是一系列开源技术组合在一起提供了一个可扩展性很强的云操作系统,我们可以把它想象成一个软件可以把你的硬件资源像亚马逊的Amazon Web Services提供给大家使用,它主要有三部分组成[3]OpenStack的三个模块计算组件(nova)、镜像管理组件(glance)、存储组件 (swift,ceph,sheepdog等)被连接成一个整体。
在上图中可以看到,Nova 处于 Openstak 架构的中心,其他组件都为 Nova 提供支持:
- Glance 为 VM 提供发现,存储和检索虚机镜像的功能
- Cinder 和 Swift 分别为 VM 提供块存储和对象存储
- Neutron 为 VM 提供网络连接
- Nova:提供按需分配的虚拟机,处理虚拟机的的启动、挂起、重启等操作。它类似于Rackspaces的cloud servers和亚马逊的Amazon Elastic Compute Cloud(EC2)
Nova的主要功能
资源的虚拟化
Nova是 OpenStack云计算架构的控制器,负责管理整个云的计算资源、网络、授权及测度。它是用 Python 编写的,创建一个抽象层,让 CPU、内存、网络适配器和硬盘驱动器等服务器资源实现虚拟化,并具有提高利用率和自动化的功能。
云主机的各种操作
OpenStack云主机实例生命期所需的各种动作都将由Nova进行管理和支撑,根据用户的需求来提供具体的虚拟服务。比如说,虚拟机的的启动、调整大小、挂起、停止和重新引导、迁移、重启、销毁等功能,这些操作通过集成一组受支持的虚拟机管理程序来实现的。还有一个机制可以在计算节点上缓存 虚拟机的镜像,以实现更快的配置。在运行镜像时,可以通过应用程序编程接口(API)以编程方式存储和管理文件。
Nova操作实例:
启动云主机
重启云主机
调整云主机大小
终止云主机
Nova本身并不提供任何虚拟能力
说明一点,虽然Nova负责管理虚拟机、云实例,但是Nova本身并不提供任何虚拟能力,但是它将使用libvirt 虚拟机管理工具来与虚拟机的宿主机进行交互。同时,Nova通过Web服务API来对外提供处理接口,而且这些接口与Amazon的Web服务接口是兼容的。
功能和特点:
- 实例生命周期管理
- 管理计算资源
- 网络和认证管理
- REST风格的API
- 异步的一致性通信
- Hypervisor透明:支持Xen,XenServer/XCP, KVM, UML, VMware vSphere and Hyper-V
Nova的内部结构
OpenStack计算的组成:
Nova 云架构包括以下主要组件:[1][2]
- API服务器(nova-api)
- 消息队列 (rabbit-mq server)
- 运算工作站 (nova-compute)
- 网络控制器 (nova-network)
- 卷工作站 (nova-volume)
- 调度器 (nova-scheduler)
这些组件以子服务(后台 deamon 进程)的形式运行.
nova-api(API服务器)
接收和响应客户的 API 调用。
除了提供 OpenStack 自己的API,nova-api 还支持 Amazon EC2 API。
也就是说,如果客户以前使用 Amazon EC2,并且用 EC2 的 API 开发了些工具来管理虚机,那么如果现在要换成 OpenStack,这些工具可以无缝迁移到 OpenStack,因为 nova-api 兼容 EC2 API,无需做任何修改。
名词解释:API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
Message Queue (消息队列)
在前面我们了解到 Nova 包含众多的子服务,这些子服务之间需要相互协调和通信。
为解耦各个子服务,Nova 通过 Message Queue 作为子服务的信息中转站。
所以在架构图上我们看到了子服务之间没有直接的连线,它们都通过 Message Queue 联系。
OpenStack 节点之间通过消息队列使用AMQP(Advanced Message Queue Protocol)完成通信。Nova对请求应答进行异步 调用,当请求接收后便则立即触发一个回调。由于使用了异步通信,不会有用户的动作被长置于等待状态。例如,启动一个实例或上传一份镜像的过程较为耗 时,API调用就将等待返回结果而不影响其它操作,在此异步通信起到了很大作用,使整个系统变得更加高效。
同步通信和异步通信:
- 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 (你叫我之后如果不响应你就一直的叫)
- 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。(你叫我之后如果不响应你就继续干别的)
OpenStack 默认是用 RabbitMQ 作为 Message Queue。MQ 是 OpenStack 的核心基础组件,我们后面也会详细介绍。
nova-scheduler( 调度器 )
虚机调度服务,负责决定在哪个计算节点上运行虚拟机
Nova- Scheduler主要完成虚拟机实例的调度分配任务,创建虚拟机时,虚拟机该调度到哪台物理机上,迁移时若没有指定主机,也需要经过 scheduler。资源调度是云平台中的一个很关键问题,如何做到资源的有效分配,如何满足不同情况的分配方式,这些都需要nova- scheduler来掌控,并且能够很方便的扩展更多的调度方法,可能我需要虚拟机调度到空闲的机器,可能还需要将某类型的虚拟机调度到固定的机架等等。
创建 云主机实例时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。nova-scheduler 起的作用,就是从众多的计算节点资源池中,选择哪一个计算节点上来满足用户这些需求,选择哪一个计算节点上来启动这个云主机实例(instance),也就是我们所说的实现云计算资源的调度[8][9][10]对计算资源进行调度的时候,nova-scheduler会根据诸如负载、内存、子节点的远近、CPU架构等作出调度决定。目前nova调度器使用了几种基本的调度算法:
- 随机算法:主机随机选择可用节点;
- 可用域算法:跟随机算法相仿,但是计算主机在指定的可用域内随机选择。
- 简单算法:应用这种方式,主机选择负载最小者来运行实例。负载数据可以从负载均衡服务器处获得。
nova-compute(运算工作站)
管理虚机的核心服务,通过调用 Hypervisor API 实现虚机生命周期管理
- 运行实例
- 结束实例
- 重启实例
- 接触卷
- 断开卷
运算工作站的主要任务是管理实例的整个生命周期。他们通过消息队列接收请求并执行,从而对实例进行各种操作。在典型实际生产环境下,会架设许多运算工作站,根据调度算法,一个实例可以在可用的任意一台运算工作站上部署。
Hypervisor
计算节点上跑的虚拟化管理程序,虚机管理最底层的程序。
不同虚拟化技术提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等.
说明一点,虽然Nova负责管理虚拟机、云实例,但是Nova本身并不提供任何虚拟能力,但是它将使用libvirt 虚拟机管理工具来与虚拟机的宿主机进行交互。
nova-network(网络控制器)
网络控制器处理主机的网络配置,例如IP地址分配,配置项目VLAN,设定安全群组以及为计算节点配置网络。[11]
网络模型:nova network实现了三种网络模型,允许管理员根据自己的需要进行组网,让虚拟机之间可以相互通信。这三种模式分别是:flat、flatdhcp、vlan,后面会对这三种模型进行更加详细的介绍。
IP地址管理:nova network需要管理虚拟机使用的IP地址,这些地址包含两类,一类是fixed ip,在虚拟机的整个生命周期中该IP地址都不会发生变化;另一类是floating ip,是动态的分配给虚拟机的,随时都可以收回。
dhcp功能:在flatdhcp和vlan模式下,虚拟机是通过DHCP来获取其fixed ip的;nova network会启动dnsmasq作为虚拟机的DHCP服务器,该虚拟机分配ip。
安全防护:出于安全的考虑,nova中的虚拟机可以防止IP/MAC洪泛,不能随便修改虚拟机的MAC地址,修改后虚拟机就不能上网了,这项功能主要是通过ebtables/iptables实现的。
nova-volume(卷工作站)
卷工作站管理基于LVM的 实例卷,它能够为一个实例创建、删除、附加卷,也可以从一个实例中分离卷。卷管理为何如此重要?因为它提供了一种保持实例持续化存储的手段,比如当结束一个 实例后,根分区如果是非持续化的,那么对其的任何改变都将丢失。可是,如果从一个实例中将卷分离出来,或者为这个实例附加上卷的话,即使实例被关闭,数据 仍然保存其中。这些数据可以通过将卷附加到原实例或其他实例的方式而重新访问。因此,为了日后访问,重要数据务必要写入卷中。这种应用对于数据服务器实例的存储而言,尤为重要。
这里卷管理涉及到的持续化存储和非持续化存储,类似于我们个人电脑的内存和硬盘,如果数据存到内存中,那么电脑一关机数据就丢失,如果保存到硬盘里,即使电脑关机数据也不会丢失。卷管理就相当于我们个人电脑上的硬盘。
但是,这里的卷存储和我们电脑的硬盘有有点不太一样。电脑硬盘它是用的物理卷,单纯的按磁盘本身的分区来管理的,云主机的卷存储是用的逻辑卷LVM.lVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和 分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。[7]
Database
Nova 会有一些数据需要存放到数据库中,一般使用 MySQL。
数据库安装在控制节点上。
Nova 使用命名为 “nova” 的数据库。
nova-conductor
nova-compute 经常需要更新数据库,比如更新虚机的状态。
出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库,而是将这个任务委托给 nova-conductor,这个我们在后面会详细讨论。
Console Interface
nova-console
用户可以通过多种方式访问虚机的控制台:
- nova-novncproxy,基于 Web 浏览器的 VNC 访问
- nova-spicehtml5proxy,基于 HTML5 浏览器的 SPICE 访问
- nova-xvpnvncproxy,基于 Java 客户端的 VNC 访问
nova-consoleauth
负责对访问虚机控制台请求提供 Token 认证
nova-cert
提供 x509 证书支持