在对使用Marathon、Mesos以及Docker构建简单云平台有了一定的了解之后,我打算再来学习一下OpenStack的架构,简单的学习笔记,记录在此,如文中有不正确的地方,还望前辈不吝指出。
OpenStack核心抽象模块
在我看来,每一个系统一开始在设计的时候都是从实际使用的分层结构开始,而OpenStack也是如此
从宏观上看,我将我对OpenStack核心架构的理解分为四个层次,即用户接入层、服务控制层、贯穿用户接入层和服务控制层的权限认证层以及硬件资源层,而这四个层级又分别有如下几个具体的模块:
- 用户接入层: 用户接入层主要有提供普通用户使用的DashBoard操作界面和管理员或高级用户使用的api模块
- 服务控制层: 这一层有控制层的api,通过这些api接收用户接入层传递过来的操作并执行相应的命令;调度模块用来执行不同任务的调度操作;还有网络管理、计算节点管理、存储管理等模块;还有一个特别重要的消息模块,在各个模块之间通信比较频繁的时候,一个独立的消息队列能够有效的防止阻塞
- 权限认证层: 权限认证当然主要就是token下发、管理与验证以及授权等功能模块
- 硬件资源层: 硬件资源主要就是计算资源(CPU、内存 or 服务器)和存储资源(可以是本地磁盘,也可以是NAS、S3等网络存储资源或其它存储资源)
OpenStack抽象模块对应的具体组件
OpenStack和许多其它复杂系统一样,也是一个基于组件的架构,上文提到的模块,可能由OpenStack的多个组件组成,也可能一个组件包含了上述的多个模块,那么具体究竟是什么样子?我们先贴一张OpenStack官方文档的概念图
我们从上往下看,依次介绍:
- Horizon就是上文中的Dashboard,用于给用户提供界面上的操作
- Neutron充当的是网络管理模块的角色,它管理着整个OpenStack环境中包括虚拟网络设备和接入层的物理网络设备在内的所有和网络相关的方面,自从Neutron这个网络管理模块独立出来以后,租户就可以通过dashboard自己进行网络的配置管理,包括创建子网、虚拟局域网等。
- Cinder和Swift都是充当的硬件资源,这里指的都是存储,Cinder为虚拟机实例提供磁盘资源,而Swift是用来存储虚拟机镜像的对象存储系统,官方文档中解释说也可以选择使用其它存储系统(可以但不限于普通文件系统、Amazon S3等存储资源)
- Nova充当了上文服务控制层的多个模块,包括控制层api、调度模块、计算节点管理、消息模块、存储管理以及网络管理,可以说是占有了大部分服务控制层的角色
- Glance充当的是存储管理模块,但是Glance的存储管理和Nova以及Cinder的存储管理不一样,Glance主要负责虚拟机镜像的存储管理以及保存虚拟机镜像的元数据和状态信息,并在创建虚拟机实例时提供镜像,而Nova的存储管理主要负责虚拟机实例需要使用的硬盘存储的管理
- Ceilometer是用来进行资源监控和计费的模块,这个在上文的分层中没有涉及
- Keystone充当的就是上文分层中的整个权限认证模块
Nova介绍
如上文所言,Nova占有了大部分服务控制层的角色,实现了控制api、调度模块、计算节点管理以及消息模块,是整个OpenStack的核心控制模块,可以发现组件中的绝大多数可以分为两种自定义编写的python守护进程:接收和协调API调用的WSGI应用(nova-api, glance-api)和执行部署任务的worker守护进程(nova-compute, nova-schedule, nova-network等),但是除此之外,nova有两个重要的部分却不属于以上两种类型,它们是消息队列和数据库。通过消息传递和信息共享使得复杂任务的异步部署变得更简单,这里用到的消息队列是各个组件之间通信的核心。
- nova-api 它为所有API查询提供入口,初始化绝大多数部署活动(比如运行实例),以及实施一些策略(绝大多数的配额检查)
- nova-compute 主要用来创建和终止虚拟机实例,虽然其过程复杂,但是因为有了消息队列,其原理却很简单,就是从相应的队列中取任务执行就好了
- nova-network 主要进行网络配置管理(比如创建网桥或者配置防火墙规则等),工作原理也是从消息队列中获取任务,然后执行
- nova-volumn 管理虚拟机实例的物理卷的创建、挂载和取消等操作,这个操作也可由后来独立出来的cinder来执行
- nova-scheduler 负责从多宿主机中调度最适合的宿主机生成云主机。即传入需要启动的云主机列表,nova-scheduler根据云主机的数量、参数等进行调度,选择合适的物理机(hypervisor,宿主机,即运行nova-compute的节点)启动这些云主机。
总结
OpenStack集群的核心模块还是nova、glance、swift,屡清各个模块之间的关系以及各自的功能,才能更好的在环境搭建以及使用的过程中更得心应手。