OpenStack Hands on lab 4-1: Nova介绍
Nova (OpenStack Compute), 是OpenStack三大核心组件之一, 是所谓的云计算的“计算平台”, 它类似Amazon EC2的概念, 但是它不包含虚拟化的软件, 只是它提供了支持多种虚拟机的兼容, 和提供的一系列的API。 本文不会详细阐述Nova的概念, 具体的信息, 可以在Nova的网站上查询。 不过我个人认为在安装和部署Nova之前, 有必要了解一下Nova中的一些概念, 否则, 你在做试验的时候可能会一头雾水。 所以, 这次试验和之前不太一样, 我把它分成了两个部分, 第一部分是对Nova的一些概念的介绍, 第二部分才是真正的动手试验。 由于本人能力有限, 文中不免出现错漏, 希望有高手看过, 能够指点一二。
相关阅读:
简介
Nova和其他OpenStack中的项目差不多, 只是它应该是最复杂的部分, 涵盖的内容最多, 也是让大伙儿寝食难安的一个硬骨头。 它涵盖了虚拟化、网络、存储、调度和云计算控制等专业领域知识, 它的架构如下图所示。
一些概念
我觉得还是非常有必要简单描述一下Nova中的一些概念, 如果你曾经了解过这些, 可以直接跳过这部分, 或者你觉得需要更进一步了解, 可以查看 Nova Concepts and Introduction, 来自Nova dev documentation project. 本文的大多数内容是我对该文档的翻译并加上我自己的理解, 如果你觉得我的理解有失偏颇, 我建议你最好能看一下原文。
Users, Projects
Nova也支持多种验证支持, 包括Ldap, 数据库, Keystone等, 因为我们的试验建立在一个完整的OpenStack POC的基础上, 所以本文使用的是Keystone的验证。
- Projects, 用来分隔资源, 在我写这篇文章的时候, Nova已经在ESSEX中支持Keystone里的Tenant, 所以如果我们使用Keystone的话, 这里的Project可以理解为Tenant
- Users, 每个用户可以通过自己的账号密码或者是EC2兼容的ACCESS_KEY和SECRET_KEY来访问Nova, 同样也可以有自己的Keypaires.
Virtualization (虚拟化)
Nova中提供对虚拟化的兼容支持, 但是虚拟化本身是一个复杂的概念, 好在我们平时也都或多或少的接触过一些虚拟化的技术, 例如我们租用的Virtual Private Server(VPS), 桌面用的虚拟机和应用程序虚拟化。 如果你是Linux、Unix死忠, 或者是Mac用户, 那么你一定或多或少的去尝试过虚拟一个Windows来解决网上银行、密码控件之类的问题。 这里顺便吐槽一下, 我觉得这些完全依赖Windows的并且是日常生活必须的应用软件这样设计完全没有道理, 标准的安全解决方案同样很多, 而不是通过一个ActiveX控件来解决, 况且, 这样就真的安全了吗? 至于你信不信, 反正我不信。
Ok,刚才跑题了, 现在来说说Nova中的虚拟化。 Nova本身不提供一个虚拟化的平台, 而是借助目前已有的例如Xen、KVM、qemu、LXC和Vmware, Hyper-V曾经也支持, 但是邮件列表里讨论由于无人维护, 所以官方考虑取消对其的支持。 Anyway, OpenStack是一个建立在Linux环境上的平台, 那么我们使用对Linux更加友好的虚拟化Hypervisor是不是更加好?
Instance (运行实例)
一个Instance就是运行在OpenStack中的一个虚拟机。
Instance Type (实例类型)
这个概念描述了一个虚拟机的配置, 实例通过Image来启动, 在启动的时候我们会配置将要运行实例的CPU、内存、存储空间等等。
Storage (存储)
- Volumes
- Local Storage
Quotas (限额)
Nova支持每个项目(Project)一个限额, 它表示该项目可以使用的资源。 例如可以使用Instance的数量、CPU的核心数、内存、Volume和Floating ip的数量等。
RBAC (Role based access control)
Nova提供基于角色的访问控制(RBAC), 来控制对API的访问。 一个用户可以拥有一个或多个角色, 一个角色用来定义了哪些API可以被用户使用。
API
Nova支持EC2兼容的API和使用自己的API(OpenStack/Rackspace)
Networking
Nova中有Fixed IPs和Floating IPs的概念。 Fixed IP是虚拟机实例在创建的时候, 分配到虚拟机的系统中的, 并且一直维持这个地址直到虚拟机实例被终止。 Floating IPs是可以被动态加载到已经在运行的虚拟机实例上的, 并且Floating IP是可以随时分配到其他虚拟机实例上的。
在Nova中可以通过下面三种网络模式来实现Fixed IPs:
- Flat – 一种简单的网络模式, 虚拟机通过一个地址池(Pool)来获得IP地址。 所有的虚拟机通过搭载相同的桥接(Bridge)网卡(默认是br100)进行网络通信。 虚拟机的网络配置是在其启动之前被注入到interfaces文件中的。 所以它仅支持Linux风格的操作系统, 就是通过/etc/network/interfaces来配置网络的操作系统。
- Flat DHCP – 类似Flat模式,虚拟机通过桥接的方式接入到网络, 通过这种模式Nova需要多做一些配置, 来尝试桥接到物理网卡(默认eth0)。 它还需要运行一个DHCP服务器监听在桥接网卡上。 虚拟机通过DHCP来获得Fixed IPs。
- VLAN DHCP – 支持最多功能的模式。 一般用于多节点的部署。 它需要一个支持vlan的可管理的交换机, Nova会为每个项目创建一个vlan, 改项目会获得一个私有网段, 并只能通过该网段访问虚拟机。 用户如果需要访问该项目下的虚拟机, 需要创建一个特殊的VPN实例(cloudpip), Nova会生成一对证书/Key用于连接VPN.
Binaries
Nova提供了一些可执行的文件用于手动运行各项服务。 这些文件可运行在同一台机器上, 或者单独运行在不同的机器上。
- nova-api: 用于接收xml请求,并将请求发送给其他的服务。 它是一个wsgi的程序, 由paste实现。 并用来处理身份验证。 它也同时支持EC2和OpenStack的API.
- nova-objectstore: 是一个简单的基于文件的存储系统, 用于兼容大多数Amazon S3的api. 根据OpenStack的开发计划, 这个服务很快会被Glance取代。 所以现在, 我们不需要开启这项服务。
- nova-compute: 负责管理所有的虚拟机, 它将ComputeManager的服务的接口暴露出来, 通过RPC协议对外提供服务。
- nova-volume: 负责管理加载block存储设备, 同样通过RPC协议提供VolumeManager服务.
- nova-network: 用于管理fixed IPs、floating IPs、dhcp、网桥和vlan。 他提供对NetworkManager的服务。
nova-manage
nova-manage 是一个命令行程序, 用于执行一些内部的管理指令。 例如管理项目、管理用户、管理网络等等, 详细的使用方法可以参考 官方nova-manage手册 。
Flags
Nova使用python-gflags来处理命令系统, 它可以通过命令行参数或者一个flag文件来做为参数的输入。 例如nova-manage –flagname=flagvalue。 最新的Nova使用nova.conf作为flag文件,也就是我们后面会用到的nova配置文件。 根据不同的版本, 配置文件的风格也不一样, 有的配置是以–开头, 而后面都是以flag=value这种格式为准。
Plugins
Nova的一些服务/功能可以通过插件的形式提供, 例如身份验证、数据库、virt、网络、Volume等.
- Managers/Drivers: utils.import_object from string flag
- virt/Connections: 通过配置文件来设置
- 数据库
- 验证管理
- Volumes: 可以通过插件替代默认的, 例如Nexenta、NetApp这些存储系统作为Volumes设备。
- Network, 上面介绍过Nova的三种网络模式。
- Compute, 可以通过插件来连接不同的计算节点。
IPC/RPC
Nova使用AMQP消息标准来处理各服务之间的通讯, 它默认支持RabbitMQ作为消息队列系统, RabbitMQ是一个基于Erlang程序的消息队列服务器, 使用非常简单。 一个消息队列可以提供本地服务之间的消息交换, 也可以提供多台服务器之间的消息交换。 你可以将RabbitMQ单独部署在一台服务器上, 为其他例如Glance, Nova提供消息服务。
Fakes
由于官方文档对Fakes的资料比较少, 这里我就写我自己对Fakes的理解。 因为我还没有完整的读Nova的代码, 只是大致过了一下。 所以这里Fakes可以理解为一个实现了接口但是却没有完整实现功能的用于测试的适配器。 例如fakeldap, 它实现了模拟python ldap模块对nova的支持。所以你可以通过这个模块来测试nova对ldap(非真实环境)的支持。
Scheduler
Nova的调度器(Scheduler)现在作为一个单独的服务, 可以通过nova-scheduler来启动。 它用于实现对Nova中的一些Task进行调度执行,你可以通过filter来筛选任务, 例如compute_filter, all_host_filter等。 目前Nova中自带了:
- affinity_filter
- all_hosts_filter
- availability_zone_filter
- compute_filter
- core_filter
- isolated_hosts_filter
- json_filter
- ram_filter
Security Groups
一个安全组(Security Groups)是一系列网络访问规则的集合, 类似防火墙规则,例如我们可以指定某个网段可以访问一个Nova项目中所有虚拟机的22端口, 而其他网段或者访问其他端口将被拒绝掉。 用户可以随时修改这些组策略, 当一个新的策略被定义, 那么该项目的虚拟机启动后会自动应用于这个访问规则集合。
Certificate Authority
Nova目前支持vpn、images bundle的证书认证。
总结
嗯, 一开始以为很快就能完成这个文章, 后来, 慢慢发现Nova里的一些东西还是非常有趣, 所以在写这个文章的时候, 我又思想开小差了。 呵呵。 正好在完成这个动手试验系列的时候出现了一个小插曲, 我的试验机器的硬盘坏掉了, 尝试修复数据未果, 所以就搁置了几天。 新的硬盘今天到了, 于是我就一边重复原来的步骤将Keystone, Swift, Glance等服务部署好, 一边写这个文章, 通过翻译官方的一些内容, 自己也学习到了很多知识。 我是一个程序员出身的工程师, 所以对很多概念只是理解一些皮毛, 例如网络、存储之类的东西。 好在平时工作的时候也接触过一些, 所以表象还是可以看得很清楚, 深入进去, 我就像白痴一样了。 哈哈。
Nova其实算是OpenStack框架中最复杂的一个项目了, 它涉及到的内容如此之广, 越加让我对Nova项目喜爱有加。 如果有时间(当然时间挤挤总会有的:D)我会将Nova中的所有组件都好好的过一遍。 如果有试验条件, 我也很想对Nova的存储、网络部分做一些测试。 也欢迎各位高手指点一二, 让我少走些弯路 =D