第3章
OpenStack组织结构一览
3.1 组件关系
OpenStack是一个构建云环境的工具集,所有的OpenStack组件都可以单独部署,而组件中的模块也可以单独部署。OpenStack领先的分布式架构,可以让部署人员以类似搭积木的方式,按需求选取所需要的组件,灵活地构建云环境。使用OpenStack搭建的云环境可大可小,大至成千上万台的服务器,小至一台ARM手机都可以用OpenStack来构建云。通过前面两章,读者了解了OpenStack的基本内容,也熟悉了OpenStack的安装、使用,现在将带领读者更深入地学习OpenStack组件架构。
OpenStack组件如图3-1所示。
· 所有OpenStack组件都是用Python编写的。
· 最终用户可以通过Web界面(Horizon)、命令行来使用组件服务或直接调用每个组件的API。
· 每个组件都通过同一个认证源(Keystone)。
· 通过公共的REST API来实现各个组件间的交互。
· 大部分组件通过Message Queue来实现组件内部交互(官方推荐使用RabbitMQ)。
· 所有组件都用DataBase来存放数据信息(官方推荐使用MariaDB,MariaDB为MySQL的分支)。
· OpenStack的守护进程大多由WSGI中间件来实现(Paste),OpenStack中广泛使用paste.ini为其配置文件。
图3-1 OpenStack组件图
OpenStack组件特点:
· 分布式,OpenStack可以分开部署在多个服务器上,通过网络联通,是建立在网络之上的软件系统。正是因为这种软件的特性,所以分布式系统具有高度的内聚性和透明性。
· 无状态,当前的请求不依赖于之前请求状态。各个请求都相对独立,可扩展性强。
· RESTful(Representational State Transfer,具象状态传输风格),是指满足REST约束和风格的程序设计。OpenStack对外接口都是RESTful风格。
· RPC(Remote Procedure Call Protocol,远程过程调用协议),OpenStack内部通信机制大量使用RPC,RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
· Plugin(插件式设计),把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。
3.1.1 Nova组件
Nova组件是最早的OpenStack组件之一,熟悉了Nova组件结构,其他组件可以轻松学习。
Nova架构非常成熟,最早由RackSpace贡献,也可以称之为RackSpace架构。novaapi支持OpenStack原生API、AWS EC2 API,或者特殊的管理员API(为特权用户执行管理操作)。它可强制执行一些默认的配额策略;可以通过Keystone认证,认证处理优先于内部任务处理;支持多种后端Hypervisor创建虚拟机,如KVM、Xen、LXC、VMware、Hyper-V等。
Grizzly版本之前的Nova组件架构如图3-2所示。
图3-2 原有Nova组件架构
Grizzly版本的Nova组件架构如图3-3所示。
图3-3 现有Nova组件架构
在Grizzly版本Nova组件架构中,nova-compute组件不再直接与database交互,而是通过nova-conductor组件做代理,nova-compute所有数据操作均通过消息队列交由novaconductor写入或读取数据库。由于nova-compute组件是分布式部署的,在OpenStack环境中,每一台做虚拟机容器的物理服务器都需要部署nova-compute。如果nova-compute都能访问数据库,则无疑加大了数据库的访问风险。数据库可访问对象的增加,意味着数据安全指数降低。之所以采用代理模式来访问,是为了避免数据库被非法入侵,这大大降低了数据库访问风险;并且,所有的数据库操作通过Message-Queue都可以持久化,不必担心当节点死机时,访问数据会丢失。从可用性、健壮性、安全性各个方面来说,Grizzly版本的Nova组件在架构上无疑更先进。
3.1.2 Swift组件
Swift组件架构如图3-4所示,其特点如下。
· 提供文件的对象存储及服务。
· 采用对象级别的复制,以保障数据。
· swift-proxy的横向部署,可以保证接收的API请求分布式地维护account DB和container DB。
· ext4或XFS文件系统作为对象存储的文件系统。
图3-4 Swift组件架构
3.1.3 Keystone组件
Keystone组件架构如图3-5所示,其特点如下。
· Keystone提供统一的、完整的OpenStack身份验证、服务目录、令牌、访问策略服务。
· Keystone处理所有的API请求,提供可配置的身份验证、服务目录、令牌、访问策略服务。
· Keystone标准的后端包括SQL、LDAP、K&V等。
· 大多数用户会使用定制化的Keystone作为OpenStack的认证服务。
图3-5 Keystone组件架构
3.1.4 Glance组件
Glance组件架构如图3-6所示,其特点如下。
图3-6 使用多种存储后端的Glance服务
· 数据库中存放镜像文件的元数据。
· 存储镜像文件的实际后端可以有多种选择,可以使用OpenStack本身的组件Swift、Cinder,也可以使用本地存储,或者使用AWS的S3等。
3.1.5 Neutron组件
Neutron组件架构如图3-7所示,其特点如下。
· Neutron由Quantum更名而来。因为涉及商标侵权,所以OpenStack社区将Quantum更名为Neutron。
· neutron-server接收API请求,然后将请求路由到各个agent组件,执行具体的操作。
· agent由各种厂商支持,在Neutron中的agent角色类似于nova-compute、cindervolume,Nova面对不同的Hypervisor,Cinder面对不同存储,而Neutron面对各种不同的网络设备。
· 通常agent是L3、L2、DHCP和一些特殊插件式agent。
· agent目前有Cisco agent、Nicira nvp agent、NEC agent、Open vSwitch agent、Linux bridging agent等。
图3-7 Neutron组件架构
3.1.6 Cinder组件
Cinder组件架构如图3-8所示,其特点如下。
· Cinder就是nova-volume需求的扩展,是从Nova分离出来的一个集中式的块存储服务。
· Cinder组件架构完全是镜像式地复制Nova的架构,看过Nova代码再看Cinder代码会有似曾相识的感觉。
· cinder-api负责接收和分发API的请求信息。
· cinder-volume有多个后端存储可以支持,存储厂商以编写driver的方式加入到OpenStack开发行列,目前Cinder的存储驱动支持IBM、SolidFire、NetApp、Nexenta、Zadara和华为等商业存储。
· cinder-scheduler类似于nova-scheduler,决定在哪个存储上创建cinder-volume实例,但目前版本支持的调度策略很少,算法也并不完善。
· Cinder仍需完善,它的功能也可以用nova-volume代替。从Folsom版本到现在,Cinder本身的架构进展并不尽如人意,但是存储厂商的积极参与给了Cinder更多实际的意义。
图3-8 Cinder组件架构
3.2 OpenStack目录组织结构
3.2.1 Nova目录结构
下面来了解一下Nova的目录结构:
· bin:Nova服务执行文件。
· contrib:第三方贡献包。
· doc:技术文档。
· etc:Nova配置文件样例。
· nova:Nova代码目录。
· plugins:Nova插件。
· smoketests:冒烟测试代码。
· tools:工具。
· babel.cfg:Flask-Babel配置。
· CONTRIBUTING.rst:贡献指南。
· HACKING.rst:Hack指南。
· LICENSE:Apache2 LICENSE。
· MANIFEST.in:打包规则。
· openstack-common.conf:OSLO配置。
· pylintrc:Pylint代码分析配置。
· README.rst:Nova简介。
· run_tests.sh:测试案例。
· setup.cfg:setup.py配置。
· setup.py:Nova安装脚本。
· tox.ini:Python的标准化测试。
3.2.2 Swift目录结构
下面是Swift的目录结构:
· bin:Swift服务执行文件。
· doc:技术文档。
· etc:Swift配置文件样例。
· locale:Swift国际化模板。
· swift:Swift代码目录。
· test:Swift测试。
· tools:工具。
· AUTHORS:作者。
· babel.cfg:Flask-Babel配置。
· CHANGELOG:更新日志。
· CONTRIBUTING.md:贡献指南。
· LICENSE:Apache2 LICENSE。
· MANIFEST.in:打包规则。
· README.md:Swift简介。
· setup.cfg:setup.py配置。
· setup.py:Swift安装脚本。
· tox.ini:Python的标准化测试。
3.2.3 Keystone目录结构
下面是Keystone的目录结构:
· bin:Keystone服务执行文件。
· doc:技术文档。
· etc:Keystone配置文件样例。
· examples:Keystone使用样例。
· httpd:Keystone使用Apache配置。
· keystone:Keystone代码目录。
· tests:Keystone测试。
· tools:工具。
· babel.cfg:Flask-Babel配置。
· HACKING.rst:Hack指南。
· LICENSE:Apache2 LICENSE。
· MANIFEST.in:打包规则。
· openstack-common.conf:OSLO配置。
· README.rst:Keystone简介。
· run_tests.sh:测试案例。
· setup.cfg:setup.py配置。
· setup.py:Keystone安装脚本。
· TODO:代办列表。
· tox.ini:Python的标准化测试。
3.2.4 Glance目录结构
下面是Glance的目录结构:
· bin:Glance服务执行文件。
· doc:技术文档。
· etc:Glance配置文件样例。
· glance:Glance代码目录。
· tools:工具。
· babel.cfg:Flask-Babel配置。
· HACKING.rst:Hack指南。
· LICENSE:Apache2 LICENSE。
· MANIFEST.in:打包规则。
· openstack-common.conf:OSLO配置。
· pylintrc:Pylint代码分析配置。
· README.rst:Glance简介。
· run_tests.sh:测试案例。
· setup.cfg:setup.py配置。
· setup.py:Glance安装脚本。
· tox.ini:Python的标准化测试。
3.2.5 Neutron目录结构
下面是Neutron的目录结构:
· bin:Neutron服务执行文件。
· contrib:第三方贡献包。
· doc:技术文档。
· etc:Neutron配置文件样例。
· quantum:Neutron代码目录。
· tools:工具。
· babel.cfg:Flask-Babel配置。
· HACKING.rst:Hack指南。
· LICENSE:Apache2 LICENSE。
· MANIFEST.in:打包规则。
· openstack-common.conf:OSLO配置。
· README:Neutron简介。
· run_tests.py:测试案例。
· run_tests.sh:测试案例。
· setup.cfg:setup.py配置。
· setup.py:Neutron安装脚本。
· TESTING:测试方法简介。
· tox.ini:Python的标准化测试。
3.2.6 Cinder目录结构
下面是Cinder的目录结构:
· bin:Cinder服务执行文件。
· cinder:Cinder代码目录。
· contrib:第三方贡献包。
· doc:技术文档。
· etc:Cinder配置文件样例。
· tools:工具。
· babel.cfg:Flask-Babel配置。
· CONTRIBUTING.md:贡献指南。
· HACKING.rst:Hack指南。
· LICENSE:Apache2 LICENSE。
· MANIFEST.in:打包规则。
· openstack-common.conf:OSLO配置。
· pylintrc:Pylint代码分析配置。
· README.rst:Cinder简介。
· run_tests.sh:测试案例。
· setup.cfg:setup.py配置。
· setup.py:Cinder安装脚本。
· tox.ini:Python的标准化测试。
3.3 OpenStack配置文件
本节列出了各个OpenStack组件对应的配置文件和日志文件的位置并对各个文件进行了说明。具体的配置信息将会在后续章节中详细介绍。
3.3.1 Nova配置文件及日志
Nova的配置文件默认存放在/etc/nova,各文件描述如图3-9所示。
图3-9 Nova的配置文件
Nova的日志文件默认存放在/var/log/nova,各文件描述如图3-10所示。
图3-10 Nova的日志文件
3.3.2 Swift配置文件及日志
Swift的配置文件默认存放在/etc/swift,各文件描述如图3-11所示。
图3-11 Swift的配置文件
Swift的日志文件默认存放在/var/log/swift,文件描述如图3-12所示。
图3-12 Swift的日志文件
3.3.3 Keystone配置文件及日志
Keystone的配置文件默认存放在/etc/keystone,文件描述如图3-13所示。
Keystone的日志文件默认存放在/var/log/keystone,文件描述如图3-14所示。
图3-13 Keystone的配置文件
图3-14 Keystone的日志文件
3.3.4 Glance配置文件及日志
Glance的配置文件默认存放在/etc/glance,各文件描述如图3-15所示。
图3-15 Glance的配置文件
Glance的日志文件默认存放在/var/log/glance,各文件描述如图3-16所示。
图3-16 Glance的日志文件
3.3.5 Neutron配置文件及日志
Neutron的配置文件默认存放在/etc/neutron,各文件描述如图3-17所示。
Neutron的日志文件默认存放在/var/log/neutron,各文件描述如图3-18所示。
3.3.6 Cinder配置文件及日志
Cinder的配置文件默认存放在/etc/cinder,各文件描述如图3-19所示。
Cinder的日志文件默认存放在/var/log/cinder,各文件描述如图3-20所示。
图3-17 Neutron的配置文件
图3-18 Neutron的日志文件
图3-19 Cinder的配置文件
图3-20 Cinder的日志文件
3.4 小结
本章带领读者学习了各个组件的关系,从整体上把握各个组件的结构、配置文件、日志文件等。由于OpenStack是分布式架构,基本上所有的通信都是基于AMQP的,数据库使用MySQL,所以了解AMQP组件及MySQL的相关知识是非常重要的。
如果只是想要部署OpenStack,那么正确理解每个组件的关系是非常重要的。而对于那些想要加入OpenStack开源建设,为OpenStack“添砖加瓦”的开发人员来说,更需要详细了解各个组件之间的关联关系。OpenStack开发简单来说就是Python开发,但是需要丰富的背景知识做支撑,硬件、软件都需要有相应的了解。云计算是IT技术发展到一定阶段的必然产物,IT领域各种技术融合、碰撞,出现了新的技术革新与新的展现形式。其实云计算在技术上并没有任何特别的地方,只是传统技术的再次整合,但云计算改变了传统的IT思维,将一切虚拟化、自动化、弹性化,最终达到服务化的目的,按需取用,自助服务。“云化”看似很神秘,其实深入理解了云计算就会发现,这是IT技术发展过程顺理成章的事情。