openstack实战指南


云计算与虚拟化技术丛书 OpenStack 实战指南 黄 凯 毛伟杰 顾骏杰 著 图书在版编目(CIP)数据 OpenStack 实战指南 / 黄凯等著 . —北京:机械工业出版社,2014.8 (云计算与虚拟化技术丛书) ISBN 978-7-111-47632-0 I. O… II. 黄… III. 计算机网络-指南 IV. TP393-62 中国版本图书馆 CIP 数据核字(2014)第 185949 号 OpenStack 实战指南 出版发行:机械工业出版社(北京市西城区百万庄大街 22 号 邮政编码:100037) 责任编辑:佘 洁 责任校对:董纪丽 印  刷: 版  次:2014 年 9 月第 1 版第 1 次印刷 开  本:186mm×240mm 1/16 印  张:18 书  号:ISBN 978-7-111-47632-0 定  价:69.00 元 凡购本书,如有缺页、倒页、脱页,由本社发行部调换 客服热线:(010)88378991 88361066 投稿热线:(010)88379604 购书热线:(010)68326294 88379649 68995259 读者信箱:hzjsj@hzbook.com 版权所有 • 侵权必究 封底无防伪标均为盗版 本书法律顾问:北京大成律师事务所 韩光 / 邹晓东 Preface 前  言 在 2007 年前后,许多网站站长发现当时一部分主流机托管商开始逐步使用虚拟化技术 提供云主机的托管服务,而当时的虚拟化程度还停留在半虚拟化或类似 OpenVZ 这样的伪虚 拟化的水平。即便如此,一台服务器已经可以承载数十台甚至上百台虚拟主机的负荷,而且 安全性更好,价格也更低。通过更加有效的隔离和封装,虚拟主机的创建和恢复也变得更加 迅速和可靠。与此同时,像 Eucalyptus 和 OpenNebula 这样的云计算管理工具也开始逐步进 入人们的视野。 次年,笔者机缘巧合地加入了 EMC(也就是 VMware 的母公司)在中国的研发实验室。 此后几年,以 VMware ESX 为主的私有云在中国的各个数据中心遍地开花。与此同时,存储 超配、内存去重、SDN 等技术也纷至沓来,使得云计算更加集约化,各种硬件资源的管理也 更加合理。笔者正是在这种“天时地利”的条件下在实验室里开展了各项研究,让 P2P 计算、 Hadoop 计算和 HPC 在虚拟化和云计算技术的辅助下更加灵活和高效。 后来笔者加入了 IBM 中国实验室,负责 x86 架构下的云计算解决方案的设计和开发。 作为 OpenStack 的主要代码贡献者,IBM 公司的资源让笔者对 KVM 和 OpenStack 等开源的 云计算方案有了零距离接触和本质了解,为了让每 GB 级别的存储和每 MB 级别的带宽给用 户带来更多的价值,笔者也经常不断地将方案推翻重来。也就是在这段时间,OpenStack 逐 渐步入了它的成熟期。 从 OpenStack 早期的 Essex 版本一直到最新的 IceHouse 版本,笔者在不同的环境下都部 署过,深深体验到了由于早期 OpenStack 不成熟导致的各种问题和障碍,有时候两天或三天 也找不到解决方案,只能硬着头皮“挖”StackOverflow 的帖子,甚至一行行地从 OpenStack 代码中“抠”Bug。虽然在这期间笔者增长了知识,也学会了苦中作乐,但笔者却不想读者 也为同样的问题徒增几根白发或加班熬夜。幸运的是,随着 OpenStack 版本的不断升级,无 论是代码质量还是文档的详尽度,都在一步步走向成熟,变得更加易用,而对于企业级应用 IV 中亟待解决的问题和需求,OpenStack 都逐渐有了清晰的答案和参考解决方案。随之而来的 是许多早期云计算用户的态度,也从最早的 FUD(Fear/Uncertainty/Doubt,即害怕、不确定、 怀疑的英文缩写 ) 到逐渐接受甚至主动申请往 OpenStack 上迁移。 时至今日,国内用户对 OpenStack 的兴趣与日俱增,2013 年的“ OpenStack 大会”更是 破格在中国香港举办。本书的出版对于帮助读者学习和了解 OpenStack 应该是非常及时的。 2014 年将是 OpenStack 加速进入生产环境和应用的元年,撇开 Mirantis、Rackspace 和 Softlayer 这些典型的云主机服务商,各大电信企业、电商也在跃跃欲试,使用 OpenStack 部 署私有云或公有云环境。举个例子,笔者就见证了国内某金融服务商的数百台服务器、几千 个虚拟机的 OpenStack 群集应用。据估计,到 2015 年,全球将会有约 50 亿美元投入到云计 算建设或升级中,这其中以 OpenStack 为基础的云计算平台和应用肯定会大放异彩;而随着 亚马逊云计算在中国的落地和国内大小云计算提供商的纷纷上马,好戏还在后头。 云计算并不只是虚拟化,实际是由虚拟化引出的所谓“软件定义的数据中心”。它不仅 包括网络的虚拟化、计算的虚拟化和存储的虚拟化,还对传统数据中心的运维、管理,甚至 硬件选型都产生了深刻的影响,因此,读者在学习和应用 OpenStack 云平台部署的时候,最 好同时了解一下:哪些功能是在硬件层提供的,哪些功能是在协议层提供的,哪些功能是在 虚拟层提供的,哪些功能是在 OS 层甚至应用层提供的。思考这些问题不仅可以帮助优化系 统的整体性能,也会帮助系统管理员更加高效和简单地管理整体云计算环境。同时读者也需 要对 Linux 操作系统有更深的了解。限于篇幅,本书无法对上述问题一一给出解答,笔者推 荐读者参看由机械工业出版社出版的 Kai Hwang 所著的《云计算与分布式系统:从并行处理 到物联网》,这本书是开始着手学习 OpenStack 之前的一本非常好的基础及进阶读物。 OpenStack 社区和各大网站上关于 OpenStack 配置和运维的文档和讨论繁多,有时笔者 觉得本书中某些内容无非是在做搬运工兼翻译的活计,但回头想想,当有人向自己虚心请教 OpenStack 的问题时若被回复一句“自己看文档去”,他心里会是何等失落。所以在写作中, 笔者将体力和脑力活动一并进行,把良莠不齐的文档甄选一番,省去很多初涉 OpenStack 云 计算读者的麻烦,让他们把时间花在更有意义的开发上,这也算是一件很有意义的事情。我 希望本书的出版能让更多的人掌握 OpenStack 的原理和操作,广泛了解目前处于云计算前沿 的技术。我还希望借此推动国内高校云计算的教学——不仅作为一门选修课,更要帮助学生 将其作为 IT 领域的核心技能之一来掌握。 随着越来越多的开发者投入 OpenStack 这个生态圈,笔者也特别希望分享自己总结 的成功或失败的经验,避免其他人走同样的弯路,帮助他们进入 OpenStack 开发的“快车 道”。虽然笔者已经在企业级计算、存储及服务器领域辗转十余年,对于数据中心的建设与 V 运维稍有心得,但一人智短,三人智长,我特别要感谢 Frank、杨海明、Mark Zhu,他们在 本书的创作过程中,为笔者解惑释疑,帮助扫除知识的死角,使笔者可以从系统的高度去 阐述 OpenStack,避免局限在技术细节而忽视了全系统的协同。这里笔者也要感谢奋战在一 线的同事,他们给予的许多宝贵的现场反馈让笔者重新思索如何将 OpenStack 与用户实际需 求相结合,避免纸上谈兵和教条主义。他们其中很多人是 OpenStack 的核心代码开发者,对 专业知识的深入理解让笔者钦佩,也深深感到设计 OpenStack 这样一个通用云计算框架的不 易。最后,笔者也要感谢无私地将 OpenStack 学习笔记分享出来的 lvsaloon、nc_triin 等技 术爱好者。 黄 凯 2014 年 4 月于上海 目  录 Contents 前 言 第一部分 基 础 篇 第 1 章 OpenStack 简介 2 1.1 OpenStack 概述 2 1.2 OpenStack 的结构 3 1.3 OpenStack 的功能与作用 4 1.4 OpenStack 与 CloudStack 的比较 6 1.5 OpenStack 应用现状和发展趋势 8 1.6 体验 OpenStack 10 1.6.1 初探 OpenStack 10 1.6.2 创建 OpenStack 虚拟机实例 12 1.6.3 创建虚拟机流程概述 14 1.6.4 创建 OpenStack 磁盘实例 16 1.6.5 创建块存储流程概述 20 1.7 OpenStack 体系结构 22 1.7.1 OpenStack 设计原则 22 1.7.2 OpenStack 架构 23 1.8 OpenStack 的开发资源 24 1.8.1 OpenStack 社区 24 VII 1.8.2 OpenStack 基金会 25 1.8.3 OpenStack 项目资料 25 1.9 OpenStack 非核心项目介绍 29 1.9.1 Ironic 项目介绍 29 1.9.2 Tempest 项目介绍 33 第 2 章 OpenStack 的安装 35 2.1 在 Ubuntu 上使用二进制包安装 35 2.1.1 控制节点的安装 35 2.1.2 网络节点的安装 55 2.1.3 计算节点的安装 60 2.1.4 块存储节点的安装 64 2.2 在 Ubuntu 上使用源代码编译安装 66 2.2.1 控制节点的安装 67 2.2.2 计算节点的安装 79 2.2.3 网络节点的安装 81 2.2.4 块存储节点的安装 82 第二部分 进 阶 篇 第 3 章 OpenStack 组织结构一览 84 3.1 组件关系 84 3.1.1 Nova 组件 85 3.1.2 Swift 组件 87 3.1.3 Keystone 组件 87 3.1.4 Glance 组件 88 3.1.5 Neutron 组件 89 3.1.6 Cinder 组件 89 3.2 OpenStack 目录组织结构 90 3.2.1 Nova 目录结构 90 3.2.2 Swift 目录结构 91 VIII 3.2.3 Keystone 目录结构 92 3.2.4 Glance 目录结构 92 3.2.5 Neutron 目录结构 93 3.2.6 Cinder 目录结构 93 3.3 OpenStack 配置文件 94 3.3.1 Nova 配置文件及日志 94 3.3.2 Swift 配置文件及日志 95 3.3.3 Keystone 配置文件及日志 95 3.3.4 Glance 配置文件及日志 96 3.3.5 Neutron 配置文件及日志 96 3.3.6 Cinder 配置文件及日志 96 3.4 小结 98 第 4 章 OpenStack API 的介绍和开发 99 4.1 简述 Nova API 体系 99 4.1.1 WSGI 架构 99 4.1.2 API 响应流程 102 4.1.3 扩展 API 的加载 103 4.1.4 Nova API 列表 104 4.1.5 分页查询和查询优化 106 4.1.6 如何编写一个核心 API 108 4.1.7 如何编写一个扩展 API 108 4.1.8 通过 Filter 为 API 增加功能 109 4.2 理解 Eventlet 110 4.3 自定义 DashBoard 面板 112 4.3.1 理解 Django 框架 112 4.3.2 Django 界面国际化 112 4.3.3 玩转 Horizon 115 第 5 章 Keystone 认证组件 119 5.1 认证组件 Keystone 介绍 119 IX 5.1.1 基本概念 119 5.1.2 用户管理 120 5.1.3 服务管理 123 5.2 配置文件及参数选项 123 5.2.1 keystone.conf 配置文件示例 124 5.2.2 keystone-paste.ini 配置文件示例 134 5.2.3 logging.conf 配置文件示例 136 5.2.4 连接 OpenStack 服务到 Keystone 137 5.3 原理分析 139 5.3.1 Keystone 认证原理 139 5.3.2 图解 Keystone 143 5.4 关键源代码阅读 146 5.4.1 源代码分析之服务启动 146 5.4.2 源代码分析之 CLI 调用 151 5.5 案例:配置 Keystone 使用 Active Directory 进行认证 152 第 6 章 Glance 镜像组件 154 6.1 镜像组件介绍 154 6.1.1 Glance 表结构 155 6.1.2 Glance 中镜像的概念 157 6.2 Glance 的配置文件 159 6.2.1 glance-api.conf 文件概述 159 6.2.2 配置镜像缓存 163 6.2.3 glance-registry.conf 文件概述 165 6.3 设置 Glance 的后端存储 166 6.4 制作镜像 167 6.4.1 使用 virt-install 创建 CentOS 镜像 167 6.4.2 在 Ubuntu 上使用 QEMU 相关命令制作 Windows 镜像 170 第 7 章 Nova 计算组件 174 7.1 Nova 组件介绍 174 X 7.2 虚拟化组件 175 7.3 配置文件及参数 177 7.3.1 数据库配置 178 7.3.2 Hypervisor 配置 179 7.3.3 RPC 配置 181 7.3.4 配额设置 182 7.3.5 日志配置 183 7.3.6 调度配置 184 7.3.7 VNC 配置 184 7.4 关键源代码阅读 185 7.4.1 Nova 服务启动 185 7.4.2 虚拟机状态转换 188 7.4.3 Nova Context 195 7.4.4 Keystone 认证处理 195 7.4.5 REST API 调用 196 7.4.6 组件间 RPC 调用 198 7.4.7 Hypervisor 驱动 198 7.5 虚拟机镜像格式 202 第 8 章 Neutron 网络组件 203 8.1 Neutron 概述 203 8.2 使用 Open vSwitch 的 plugin 208 第 9 章 Cinder 块存储组件 216 9.1 Cinder 交互流程 216 9.1.1 Nova 现有块设备操作 API 统计 216 9.1.2 Nova-Cinder 交互流程分析 217 9.1.3 相关代码源文件 226 9.1.4 使用 Cinder 实现云硬盘需要注意的问题 227 9.2 配置从 Volume 启动虚拟机 227 9.3 使用 Ceph 作为 Cinder 的后端 230 XI 第 10 章 OpenStack 日常运维 233 10.1 维护与诊断 233 10.1.1 控制节点和 Swift 的维护与纠错 233 10.1.2 计算节点的维护与纠错 234 10.1.3 网络诊断 239 10.2 标准化修复与例行检查流程 246 10.2.1 标准化修复 246 10.2.2 例行检查 247 10.3 日志与监控 247 10.3.1 定位错误 247 10.3.2 错误日志 248 10.3.3 集中管理日志 252 10.3.4 监控 253 10.4 备份与恢复 257 10.4.1 需要备份的数据 257 10.4.2 数据库备份 257 10.4.3 文件系统备份 258 10.4.4 数据恢复 259 第 11 章 使用 Fuel 快速安装 OpenStack 260 11.1 Fuel 规划 261 11.2 Fuel 安装及使用 263 11.3 小结 273 第一部分 Part 1 基 础 篇 ■ 第 1 章 OpenStack 简介 ■ 第 2 章 OpenStack 的安装 Chapter 1 第 1 章 OpenStack 简介 1.1 OpenStack 概述 OpenStack 是当今最流行的开源云平台管理项目,可以控制整个数据中心计算、存储和 网络资源的大型资源池。从 OpenStack 的名字可以看出它大致的含义,Open 顾名思义为开源 软件,开放式的设计理念、开放式的开发模式、开放式的社区,Stack 意为堆,可以理解为 云计算是靠每一块小瓦砾堆砌而成。OpenStack 并不是单独的一个软件,它由多个组件一起 协作完成某些具体工作。OpenStack 本身就是一个巨大的开源软件集合,集各种开源软件之 大成。当你想寻找 AWS EC2 的替代品时,OpenStack 将是一个不错的选择。 云计算的概念并不是很新。实际上,AWS EC2 已经出现有 7 年左右。虽然 OpenStack 是 如今最为流行的一种可用的开源云计算解决方案之一,但它不是最早的一个。它是在公共和 私有领域开发的两种旧解决方案的综合。 OpenStack 是一个非常年轻的开源项目,最初是由美国国家航空航天局(NASA)和 Rackspace 合作研发的项目,2010 年 7 月以Apache 2.0 许可证授权开源,源代码来自于 NASA 的 Nebula 云平台和 Rackspace 的分布式云存储(Swift)项目。NASA 最初使用的是 Eucalyptus 云计算平台,当规模持续快速增长后,Eucalyptus 已经不能满足 NASA 的云计 算规模,而 Eucalyptus 是不完全开放源代码的(“开放核”模式)。NASA 首席技术官 Chris Kemp 的研究小组为此专门建立了自己的计算引擎,新平台命名为 Nova,并将其开源。在 2010 年 NASA 和 Rackspace 分别将 Nova 和 Swift 项目代码开源时,已经获得了 25 个企业和 组织的支持。 第 1 章 OpenStack 简介 3 OpenStack 致力于一个开放式设计过程,每 6 个月开发社区就会举行一次设计峰会来收 集需求并写入即将发布版本的规格中。设计峰会是完全对公众开放的,包括用户、开发者和 上游项目。社区收集需求和制定经过批准的线路图,用于指导未来 6 个月的发展。 OpenStack 使用 Apache 2.0 许可证,兼容 GPLv3 以及 DFSG。 下面来了解一下 OpenStack 的优势和劣势。 OpenStack 的优势: ‰‰ 解除厂商绑定。 ‰‰ 具有可扩展性及很好的弹性,可定制化 IaaS。 ‰‰ 良好的社区氛围。 OpenStack 的劣势: ‰‰ 入手难、学习曲线较高,在对整体把握不足的情况下,很难快速上手。 ‰‰ 偏底层,需要根据实际应用场景进行二次开发。 ‰‰ 现阶段的厂商支持较弱,商业设备的 OpenStack 驱动相对不够全面。 1.2 OpenStack 的结构 OpenStack 包含了许多组件。有些组件会首先出现在孵化项目中,待成熟以后进入下一 个 OpenStack 发行版的核心服务中。同时也有部分项目是为了更好地支持 OpenStack 社区和 项目开发管理,不包含在发行版代码中。 OpenStack 的核心服务包括: ‰‰ Nova 计算服务(Compute as a Service) ‰‰ Neutron 网络服务(Networking as a Service) ‰‰ Swift 对象存储服务(Object Storage as a Service) ‰‰ Cinder 块存储服务(Block Storage as a Service) OpenStack 的公共服务包括: ‰‰ Glance 镜像服务(Image as a Service) ‰‰ Keystone 认证服务(Identity as a Service) ‰‰ Horizon 仪表盘服务(Dashboard as a Service) OpenStack 的依赖库项目包括:Oslo 基础设施代码共享依赖库(Common Lab as a Service)。 OpenStack 的孵化项目包括: ‰‰ Ceilometer 计费 & 监控服务 ‰‰ Heat 编排服务 ‰‰ Ironic 物理设备服务(Bare Metal as a Service) 第一部分 基 础 篇4 ‰‰ Marconi 消息队列服务(Message Queue as a Service) ‰‰ Savanna 大数据处理(MapReduce as a Service) ‰‰ Trove 数据库服务(DataBase as a Service) OpenStack 的其他项目涉及: ‰‰ Infrastructure OpenStack 社区建设项目 ‰‰ Documentation OpenStack 文档管理项目 ‰‰ TripleO OpenStack 部署项目 ‰‰ DevStack OpenStack 开发者项目 ‰‰ QA OpenStack 质量管理项目 ‰‰ Release Cycle Management 版本控制项目 这些 OpenStack 项目有一些共同点,比如: ‰‰ OpenStack 项目组件由多个子组件组成,子组件有各自的模块。 ‰‰ 每个项目都会选举 PTL(Project Technical Leader)。 ‰‰ 每个项目都有单独的开发人员和设计团队。 ‰‰ 每个项目都有具有优良设计的公共API,API 基于RESTful,同时支持JSON 和 XML。 ‰‰ 每个项目都有单独的数据库和隔离的持久层。 ‰‰ 每个项目都可以单独部署,对外提供服务,也可以在一起协同完成某项工作。 ‰‰ 每个项目都有各自的后端驱动,所有的驱动都可以以 plugin 方式加载。 ‰‰ 每个项目都有各自的 client 项目,如 Nova 有 nova-client 作为其命令行调用 RESTful 的实现。 除了以上项目,OpenStack 的其他项目或多或少也会需要 Database(数据库)、Message Queue(消息队列)进行数据持久化、通信。 1.3 OpenStack 的功能与作用 当今的数据中心,许多服务器都遇到过同样的问题,即计算、电源、网络带宽等资源利 用率不足。例如,某个项目可能会需要大量计算资源来完成计算,而一旦完成了计算任务, 将不再需要那么多的计算资源。当用户想要一种灵活的、按需供给计算资源的服务,通过自 动化或很少人工干预就能使用时,那么云计算就是最好的选择之一。“云计算”通常包含了 一个服务责任(Service Level Agreement,SLA),表示云计算服务提供商承诺的性能、规格、 可用率等。云计算服务让用户通过一个共享的计算资源、网络带宽、存储池,运行应用程序 或服务来完成计算工作,并按资源的使用量来计费。 这些关于云计算服务的主要特点如下。 ● 按需自助服务:用户可以提供自己的需要订购所需的计算、存储和网络资源,而几乎 第 1 章 OpenStack 简介 5 不需要人工干预。 ● 网络访问:可以通过网络使用任意类型的(异构)计算能力。通过标准化的机制调用 计算资源而不受限于具体的访问设备。 ● 资源池:多个用户可以同时访问和使用云计算提供的计算服务,服务提供商根据消费 者的计算要求或实际使用量汇集和分配实际的计算资源。 ● 弹性:可根据需要在不停机或短暂停机后迅速垂直或横向扩展。 ● 计量或测量服务:按照使用的时间、传输或存储的字节数支付云计算服务,并提供消费 者具体的资源消费图表。同时,它也可以根据消费者的不同需求提供定制化的计费模式。 下面了解一下当今的 IaaS/Cloud 与 OpenStack 的对比情况,从而进一步了解 OpenStack 的特点,见表 1-1。 表 1-1 Iaas/Cloud 与 OpenStack 组件的对比 当今的 IaaS/Cloud 作  用 OpenStack 作  用 vApps 新的或传统操作系统 Apps 提供云应用或 Web 应用 vCloud 管理云 Nova Compute 管理 x86 服务器、集群 vCenter 管理虚拟机 网络 高可用(HA) 网络 Neutron 提供扁平网络 存储 高可用(HA) 存储 Swift、Cinder 提供云存储 当今的云计算概念是由 Google 公司提出的,狭义的云计算是指 IT 基础设施的交付和使 用模式,按需取用所需的 IT 资源;广义的云计算是指服务交付和使用模式,通过网络按需取 用所需的服务,这种服务可以是 IT、软件、互联网相关的,也可以是其他服务。它具有超大 规模、虚拟化、可靠安全、弹性等特性。通过 SaaS(Software as a Service)、 PaaS(Platform as a Service)、 IaaS(Infrastructure as a Service)提供从上到下不同层面的云计算服务。 云计算(Cloud Computing)是网格计算(Grid Computing)、分布式计算(Distributed Computing)、并行计算(Parallel Computing)、效用计算(Utility Computing)、联机存储技术 (Network Storage Technology)、虚拟化(Virtualization)、负载均衡(Load Balance)等一系列 传统计算机技术和网络技术发展融合的产物。它旨在通过网络将多个成本低廉的计算实体整 合成一个大型计算资源池,并借助 SaaS、PaaS、IaaS 等服务模式,将强大的计算能力分发到 终端用户手中。云计算的核心理念就是通过不断提高“云”端处理能力,减轻用户负担,将 一系列的 IT 能力以服务形式提供给用户,简化用户终端的处理负担,最终使用户成为一个 单纯的输入 / 输出设备,享受“云”提供的强大计算处理及服务能力。 OpenStack 具有建设这样资源池的能力,通过 OpenStack 的各种组件多种模式的排列组 合,可以搭建成各种规模的“云”,这些云可以是私有云、公有云、混合云。 OpenStack 具有三大核心功能,即计算、存储、网络,分别对应相应的项目Nova、 Cinder。其中 Neutron。其中 Nova 提供了计算资源的管理,可以管理跨服务器网络的 VM 实例。同时,Nova 还提供对多种Hypervisor 的支持,如KVM、QEMU、Xen、LXC、 第一部分 基 础 篇6 VMware、Hyper-V、PowerVM 等。Cinder 提供了存储资源的管理,可以管理各个厂商提供 的专业存储设备。Neutron 提供了网络资源的管理,并且 LBaaS、FWaaS 等一系列网络相关 的组件也正在逐渐发展起来。 1.4 OpenStack 与 CloudStack 的比较 OpenStack 并不是唯一的开源基础设施服务,在谈论 OpenStack 的时候用户一定会拿 CloudStack 与之相对比。对比 OpenStack 和 CloudStack 这两个云计算产品,有助于了解它们 两者的本质。它们的每一个设计都具有相同的目标,即提供一套开源组件,利用各个组件的 必要功能来管理云中成千上万的单台服务器,两者都旨在成为构建私有云、公有云的云资源 服务提供者。 OpenStack 和 CloudStack 具有相似的功能组件,如计算、网络、存储。计算方面,都支 持将虚拟机分配到单独的服务器,管理协调计算资源的使用。网络方面,提供虚拟、物理网 络管理功能,包括虚拟交换机创建和管理虚拟机网络。存储方面,分别含有对象和块存储系 统、镜像管理功能和云计算管理接口这些组件。虽然这两者有共同的目标,并具有相似的基 本功能,但其历史和项目的组织是不同的。 1. OpenStack 历史 2010 年,美国国家航空航天局联手 Rackspace,在建设美国国家航空航天局的私有云过 程中,创建了 OpenStack 项目,之后他们邀请其他供应商提供组件,建立一个完整的开源云 计算解决方案。 2010 年诞生的第一个版本 Austin 只包含 Rackspace 和美国国家航空航天局的组件。之 后发布的版本包含了已加入该项目的供应商开发的附加组件。最初,Rackspace 独立管理 OpenStack 项目,随着 OpenStack 的不断发展,在 2012 年创建了 OpenStack 基金会,该基金 会由选举产生的董事会监管。OpenStack 的技术委员会由每个核心的软件项目和项目领导等 组成。 目前,Openstack.org 有声称来自 87 个国家或地区的 850 个基金会成员。白金会员提供 最高水平的支持,其次是黄金会员、赞助企业和个人会员。当前,白金会员有 AT&T、HP、 IBM 和 Rackspace 等公司或组织;黄金会员有思科、戴尔、VMware 等公司。开源协议是 Apache 2.0。OpenStack 代码可免费下载。 2. CloudStack 历史 CloudStack 始于 Cloud.com,其目标是使服务供应商和企业创建、运营其能力类似于亚 马逊公司的公有云、私有云。2010 年,Cloud.com 提供了基于 GPLv3 的社区版本,供用户免 费下载,并随后发布了两个支持版本。 第 1 章 OpenStack 简介 7 思杰(Citrix)公司在 2011 年 7 月收购了 Cloud.com。思杰公司是 OpenStack 社区早 期成员之一,但在 2012 年决定离开 OpenStack 社区。据媒体报道,做出这一决定是因为 思杰公司认为,最初由 Cloud.com 提供的代码相比 OpenStack 更稳定,可为用户提供更多 的功能。 2012 年 4 月,思杰公司提交了 Cloud.com 的代码给 Apache 软件基金会,现在在 Apache 基金会的 Apache 2.0 许可证下进行代码开发,思杰公司将继续提供版本支持及解决方案支 持。由于过渡到了 Apache,其他厂商也纷纷加入到了开发队伍,增加功能和增强核心软件。 还有一点不同是,OpenStack 的基金会中会有供应商的名单,不同于 CloudStack 的发布 者名单。因为 Apache 基金会负责了大量的项目,而 Apache 项目成员均以个人名义被列入, 而不是他们所代表的公司。 在 Apache 项目中,由感兴趣的公司制定独立工作人员的工作项目。当前,CloudStack 项目成员中有一些思杰公司的员工和一些目前不太知名的公司,如 Sungard、Schuberg Philis、 TCloud Computing 和 EPAM Systems 等。项目的发展方向由个别参与者所代表的雇主的意愿 来决定。 3. OpenStack 与 CloudStack 历史对比 Cloud.com 致力于开发和发展一个更大的开源云社区。因此,大部分 CloudStack 的核心 组件由 Cloud.com 开发,然后由思杰公司增强。 相比之下,OpenStack 项目从最开始就发展开放社区,其直接结果是,OpenStack 里聚集 了比 CloudStack 更多的主流供应商。在大多数情况下,这些厂商开发的组件第一时间提供给 OpenStack,之后才为 CloudStack 提供接口。 此外,思科和 Nicira 公司已经成为 OpenStack 网络组件 Neutron 的主要开发者。Neutron 接收来自虚拟机的指令来定义虚拟机所需要的网络,然后发送指令给交换机和路由器来创建 这些网络。现在,思科和 Nicira 公司已经写完了 OpenStack 的网络模块,正在为 CloudStack 做同样的适配。 每个交换机的供应商必须为 Neutron 提供插件。这个插件在 Neutron 中转换为特定厂商 设备的特定命令语法。Extreme Networks 和 Brocade 这两个 OpenStack 基金会成员同样先为 OpenStack 提供插件,再进行 CloudStack 支持。 OpenStack 为分布式组件模式,可以选择性地部署需要的组件,如网络组件 Neutron、块 存储组件 Cinder、计算组件 Nova,按需部署,按需取用。相比之下,CloudStack 是一个可插 拔式的模型,通过可插拔模型来实现 SDN、IP 分配、LBaaS、防火墙、VPC、Vxlan 等,而 这些功能 OpenStack 也都支持。 OpenStack 和 CloudStack 支持的虚拟机Hypervisor 也基本类似,同样支持KVM、 XenServer、VMware,不同的是,OpenStack 还支持Hyper-V、PowerVM、LXC via libvirt、 Baremetal、QEMU、Docker。 第一部分 基 础 篇8 OpenStack 也有不够完善的地方,如 OpenStack 相对于 CloudStack 来说更加复杂,对终 端用户的支持不够;在安装部署上不如 CloudStack 便捷;在界面显示方面也不如 CloudStack 丰富。 要确定企业的合适部署,就必须仔细对比每一个解决方案,然后再进行选择。思杰 公司向大型服务供应商、大学以及其他机构展现了 CloudStack 的成熟和稳定。而要关注 OpenStack 的稳定性可以查看IBM、戴尔和Rackspace 等公司的解决方案。这两款产品 一直在持续发展,提供了一系列的存储和网络的选项。随着 OpenStack Icehouse 的发布, OpenStack 拥有了不错的 3 层网络支持。以前,CloudStack 一直宣称有与亚马逊公司的 EC3 更好的兼容性,但 OpenStack 在这一领域的能力已明显提高。企业必须确定它们的实际要 求,再仔细检查每一个解决方案是如何满足它们的需求的。虽然两者都支持一些广泛使用的 虚拟机管理程序,但是企业仍然需要评估哪一个提供了最需要的虚拟机管理程序支持,以及 哪个方案对现有的网络设备、存储设备和服务器设备提供了较好的支持。另外,还可以向正 在使用产品的集成商或 VAR 询问他们的具体经验与解决方案中的一个或两个。确保考虑了 上述所有这些因素,才会让客户做出最终的正确选择。 1.5 OpenStack 应用现状和发展趋势 通过trends.google.com,可以整理出目前人们对一些开源云计算项目的关注趋势。 Rackspace 以 OpenStack 为基础的私有云业务每年 7 亿美元,增长率超过了 20%。 如图1-1 所示,在开源云计算项目领域,OpenStack 从 2010 年开始就已经超过 CloudStack、Eucalyptus、OpenNebula 等其他云计算开源项目,是当今最热门的开源项目之一, 这离不开社区管理者和社区推广者的努力。 OpenStack CloudStack EucalyptusOpenNebula 图 1-1 Google Trend 显示 OpenStack 和其他开源云计算项目的趋势对比 第 1 章 OpenStack 简介 9 在云计算领域,OpenStack 也在逐渐追赶虚拟化商业巨头VMware 的步伐。 OpenStack 和其他商业云项目的趋势对比如图 1-2 所示。我们有理由相信,在今后几年乃 至相当长一段时间里,OpenStack 依然会活跃在大家的视线中。OpenStack 社区活跃度如 图 1-3 所示。 vSphere OpenStack vCloud 图 1-2 Google Trend 显示 OpenStack 和其他商业云项目的趋势对比 图 1-3 OpenStack 社区活跃度 相比开源项目的“前辈”,OpenStack 是一个更高级且更现代化的开源项目,因为它是高 度协作的产物。 OpenStack 的支持者都是世界顶级的供应商,可以看出 OpenStack 备受青睐,可以说它 是开源界的明星产品。目前,该领域世界排名前三的供应商对 OpenStack 都已有相应的支 持,见表 1-2。 第一部分 基 础 篇10 表 1-2 支持 OpenStack 项目的主流供应商 x86 服务器供应商 HP(惠 普) DELL(戴 尔) IBM Linux 供应商 RedHat(红 帽) SUSE Canonical 路由器供应商 Cisco(思 科) Juniper Networks Alcatel-Lucent 刀片服务器供应商 HP Cisco IBM 交换机供应商 Cisco HP Juniper Networks 存储供应商 EMC IBM NetApp Hypervisor 供应商 VMware KVM Xen 目前 OpenStack 的实现对于完整云计算所需组件的支持情况见表 1-3。 表 1-3 OpenStack 组件及其支持者 OpenStack 关系 支 持 者 用户界面 Horizon、CLI OpenStack、供应商、生态圈 弹性资源管理 Nova、Swift、Neutron、Cinder OpenStack、供应商、生态圈 服务发现 零散分布:Nova、Keystone OpenStack、供应商 认证、授权和访问控制 Keystone OpenStack 硬件、软件生命周期管理 暂无 供应商、生态圈 服务管理 暂无 供应商 计费 Ceilometer OpenStack、供应商、生态圈 日志和健康检测 暂无 供应商、生态圈 硬件认证 暂无 OpenStack、供应商、生态圈 1.6 体验 OpenStack 1.6.1 初探 OpenStack 由于 OpenStack 安装过程时间较长且复杂,并且构建不同的云环境可以选择各种各样的 排列组合方式,为了避免初学者在较长时间的安装过程中失去对 OpenStack 的探索热情,因 此,我们先来认识一下 OpenStack 的用户界面,从感官角度来见识一下它。 OpenStack 的用户界面由两部分组成:一是 Web 界面,二是 Shell 界面。Horizon 负责展 现 Web 仪表盘,用户可以通过浏览器直接操作、管理、运维 OpenStack 的一些功能。由于 OpenStack 项目队伍不断壮大,Dashboard 并不能展现所有的 OpenStack 功能,因此,最新的 功能一般会先开发 Shell 命令行,也就是将 CLI(Command Line Interface)提供给 Linux 用户 操作。 通过浏览器输入仪表盘的地址,可以看到如图 1-4 所示的登录界面。OpenStack 仪表盘 可以安装在任意节点,我们通常都将其安装在 Nova API 的管理节点,以方便访问。Horizon 第 1 章 OpenStack 简介 11 和 Nova-Client 一样,需要 Keystone 的用户名及密码认证,以及 Keystone 的 Token 进行授权 访问。这些都是 Horizon 内部实现的,普通用户只要有 用户名及密码就能登录到仪表盘中进行日常操作。让我 们先登录到 OpenStack 的仪表盘中,为了方便演示,使 用 admin 用户。 登录到控制面板,可以发现有管理员视图(仅管理 员可见)和项目视图(仅可以操作当前用户所授权的项 目)。目前的仪表盘已经进行了国际化,可以使用熟悉的 中文来管理“云”。管理员用户可以从整体视角来观察 “云”的一举一动,可以看到整个资源池的大小状况,以 及健康状况。如果资源不够使用,那么可以以人工方式 进行干预。目前,因为 OpenStack 的 Auto Scaling 并不尽 如人意,所以一些工作只能通过人工干预的方式进行。 OpenStack 的仪表盘左侧是导航栏,如图 1-5 所示。在 OpenStack 的图标下可以看到 两个维度:项目和管理员。这两个维度下面分别有各自的服务菜单。项目维度可以从概览 (Overview)、实例(Instances)、卷(Volumes)、镜像和快照(Image&Snapshots)、访问和安全 (Access&Security)几个方面来管理“云”。管理员维度有概览(Overview)、实例(Instances)、 卷(Volumes)、套餐(Flavors)、镜像(Images)、项目(Project)、用户(Users)、系统信息 (System info)。项目维度和管理员维度内容有交叉,但是这些是从不同角度去观察“云”所 得到的结果。在“云”环境中,很多时候需要从不同的维度去观察。从多维角度观测,才能 得到想要的全部信息。 图 1-5 Horizon 界面一览 图 1-4 Horizon 登录页面 第一部分 基 础 篇12 1.6.2 创建 OpenStack 虚拟机实例 在 Dashboard 左侧导航栏中,选择“项目” →“ Instances”,然后单击“Launch Instance”,可完全通过图形界面方式来创建虚拟机,如图 1-6 所示。 图 1-6 创建虚拟机的页面 当单击“ Launch Instance”时,会弹出模态窗口,在此可进行创建实例的具体配置,具 体包括实例的细节(Details)、访问和安全(Access&Security)、磁盘配置(Volume Options), 以及实例启动后的自定义初始化脚本(Post-Creation)。 实例细节的配置包括了实例的来源类型(镜像文件或快照文件)、镜像模板、实例名、套 餐、创建实例个数。右侧还列出了更详细的信息,供管理员参考当前实例的创建对整个项目 有何影响。 访问和安全包括虚拟机 SSH 密钥的设置及安全组的设置。磁盘配置可以让用户选择是 否在卷存储上进行虚拟机的启动引导(boot)。自定义初始化脚本主要是实例在启动后,可 以运行一些用户自定义的脚本。除了实例的细节设置,其他设置如果没有特殊需求,默认即 可。当确认一切设置无误后,可以单击“Launch”按钮进行实例创建。 创建 OpenStack 虚拟机实例前有很多先决条件,如 Horizon 本身能正常运行并对外提 供创建服务;建立在 OpenStack 三个核心组件之上等。这三个核心组件分别是 Keystone、 第 1 章 OpenStack 简介 13 Glance、Nova。Keystone 负责授权认证、租户管理、项目权限和配额以及服务目录管理。 Glance 负责为 Nova 提供创建实例所需要的镜像文件,这种镜像文件可以包含很多格式,大 多数都是我们常见的镜像格式,如 raw、qcow2。Nova 负责虚拟机生命周期的管理,以及 宿主机资源调度。Nova 还决定了虚拟机实例建立在哪一台 Hypervisor 物理机之上。由这三 个核心组件协作,Horizon 将用户的 HTTP 请求转换为 RESTful 请求,然后将 RESTful 请求 分发给 Nova API,进行实例创建。当创建后,虚拟机实例会进入 Build 状态,任务状态将是 Spawning。这期间会将镜像文件从 Glance 中下载到 Nova 节点,并进行一些虚拟机的配置。 当一切正常后,虚拟机将会进入 Active 状态,此时用户可以享受“云”带来的便捷,如 图 1-7 所示。创建所需的时间一般由创建实例的镜像文件大小、传输镜像图带宽,以及创建 的 Hypervisor 磁盘性能来决定。有时创建过程会持续 5 ~ 10 分钟。 图 1-7 虚拟机创建成功后的界面提示 Horizon 并不是唯一可以管理虚拟机的用户界面。之前提到 OpenStack 还有基于 Python 的 CLI,虚拟机创建之后可以通过 Nova-Client 进行管理。通过命令行输入 nova list,可以看 到所有 OpenStack 实例的运行情况,以及实例相应的信息,如图 1-8 所示。后续在讲解 Nova 组件时,将详细讲解各种命令的操作及命令之间的关联关系,以及如何实现自定义命令、命 令行扩展,还有如何运用好一系列的 OpenStack 命令来进行日常的管理、运维。 图 1-8 列出的虚拟机实例详情 当虚拟机创建成功后,双击虚拟机名,进入到这个虚拟机视图进行详细观察,如图 1-9 所示,可以看到标签页,包括概览(Overview)、日志(Log)、控制台(Console)。概览中可 以看到虚拟机的一系列详细信息。日志中可以看到虚拟机当前的启动引导日志,不用登录虚 第一部分 基 础 篇14 拟机就可以看到虚拟机的引导情况,检查是否有错误或者异常发生。通过控制台界面,可 以对虚拟机进行操作。这是一个 VNC 控制台,我们不必像以前使用虚拟机那样,登录到 Hypervisor 端配置 VNC 端口信息,然后再通过 VNC Client 登录管理虚拟机。OpenStack 将这 些日常操作抽象出来,进行自动化,整个过程无须用户进行任何配置,当构建好 OpenStack 云后,剩下的事将交给 OpenStack 来做。 图 1-9 查看虚拟机 Console(控 制 台) 单击“ More”,有更多的操作可以进行,可以对虚拟机实例进行一些操作,这些操作包 括启动、停止、挂起、激活、快照、迁移、备份、诊断、恢复、重建、销毁等一系列虚拟机 生命周期管理。这些操作都由 Nova 提供,部分操作会由其他组件来参与。对于 OpenStack 这样的一个分布式系统,完成一件事,基本上都会涉及一系列的组件。这些组件协同工作, 在“云”中扮演着各种角色。之后我们将具体探讨这些组件在 OpenStack 中扮演什么样的角 色,哪些组件必不可少,以及如何通过各种组件的排列组合来组建合适的“云”。 1.6.3 创建虚拟机流程概述 本节将介绍创建虚拟机的步骤,如下: 1)Horizon 通过Keystone 获取Compute 组件的访问地址(URL),并获取授权令牌 (Token),如图 1-10 所示。 2)携带授权令牌,发送创建虚拟机指令,如图 1-11 所示。 第 1 章 OpenStack 简介 15 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖㼒 㸥ミ ⡄⫇⪦㝭 㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-10 从 Keystone 获取令牌 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖㼒 㸥ミ ⡄⫇⪦㝭 㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-11 向 Nova 发送创建虚拟机指令 第一部分 基 础 篇16 3)nova-compute 组件通过 glance-api 下载虚拟机镜像,glance 镜像中有缓存机制,通常 将缓存文件放入名为 _base 的目录(下文将其称为 base 缓存),如图 1-12 所示。镜像分两个 阶段,第一个阶段是如果 base 缓存中没有此次的虚拟机镜像文件,则从 Glance 下载镜像到 base 缓存;第二个阶段是从 base 缓存复制到本地镜像目录。base 缓存可关闭,默认为开启。 建议不要修改此默认值,因为如果每次镜像都通过 Glance 下载,会消耗大量的网络带宽。 base 缓存的存在就是为了解决虚拟机镜像文件传输消耗带宽的问题。 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖㼒 㸥ミ ⡄⫇⪦㝭 㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-12 Nova 向 Glance 请求镜像 4)Glance 检索后端镜像,Glance 后端存储不一定要使用 Swift,只要能存放镜像的文件 系统都可以,如图 1-13 所示。 5)获取网络信息,决定虚拟机网络模式及建立网络连接,如图 1-14 所示。 6)nova-compute 发送启动虚拟机指令,如图 1-15 所示。 至此,虚拟机创建完成。 1.6.4 创建 OpenStack 磁盘实例 本节将通过图形界面方式创建磁盘实例。在Dashboard 左侧导航栏中,选择“项 目”→“Volumes”, 然 后单击右侧的“Create Volume”按钮,如图 1-16 所示。 第 1 章 OpenStack 简介 17 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-13 Glance 向存储请求镜像文件 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-14 为虚拟机请求网络资源 第一部分 基 础 篇18 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-15 启动虚拟机 图 1-16 磁盘管理界面 创建磁盘实例的过程与创建虚拟机类似,在弹出的“ Create Volume”界面中,只需要进 行选择,填写表单,就可以获得想要的磁盘,如图 1-17 所示。 填写完成后,单击“ Create Volume”按钮即可进行创建。Volume 创建会交由 Cinder 进 行处理,与 Nova API 类似,Cinder 也有 Cinder API 模块进行 RESTful 处理。这些过程与虚 拟机实例创建类似,都需要经过 Keystone 认证,然后交由 Cinder 组件进行具体调度、创建 工作,Horizon 则将这一过程展现给用户,如图 1-18 所示。 第 1 章 OpenStack 简介 19 图 1-17 创建磁盘的向导页面 图 1-18 查看已创建的磁盘 创建完磁盘后,可以将这块磁盘挂载到虚拟机实例上,供虚拟机实例使用。这一挂 载操作并不像传统的磁盘挂载方式,虽然原理不变,但其操作模式及服务模式发生了变 化,用户只需要单击界面进行设置就可以完成这一系列操作。单击磁盘管理界面中的“ Edit Attachments”按钮就可以进行挂载操作,如图 1-19 所示。 图 1-19 通过管理界面挂载磁盘 第一部分 基 础 篇20 挂载后,磁盘管理界面将显示挂载的详细信息。通过 virt-manager 图形工具查看虚拟机 即可看到第二块挂载的磁盘,如图 1-20 所示。这块磁盘是热挂载形式,不需要虚拟机实例停 止运行。 图 1-20 通过 virt-manager 查看已挂载的磁盘 1.6.5 创建块存储流程概述 现在来了解一下创建块存储的流程,如下: 1)Horizon 通过Keystone 获取Cinder 组件的访问地址(URL),并获取授权令牌 (Token),如图 1-10 所示。 2)携带授权令牌,发送创建块存储指令,如图 1-21 所示。 3)携带令牌,发送挂载块存储指令,如图 1-22 所示。 4)nova-compute 组件发送 RPC 指令以通知 Cinder 挂载块设备,如图 1-23 所示。 第 1 章 OpenStack 简介 21 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-21 Horizon 向 Cinder 发送请求 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-22 请求挂载存储设备 第一部分 基 础 篇22 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-23 Nova 挂载存储设备 1.7 OpenStack 体系结构 1.7.1 OpenStack 设计原则 在介绍 OpenStack 体系结构之前,需要先了解一下 OpenStack 的设计原则,如下: ‰‰ 可扩展性和伸缩性是设计 OpenStack 的主要目标。 ‰‰ 任何影响可扩展性和伸缩性的特性必须是可选的。 ‰‰ 一切应该是异步的(如果做不到异步,可参考第二条)。 ‰‰ 所有必需的组件必须可水平扩展。 ‰‰ 始终使用无共享架构或者分片架构(如果不能实现,可参考第二条)。 ‰‰ 一切都是分布式的(尤其应该将业务逻辑与业务状态放在一起)。 ‰‰ 接收最终一致性,并在适当条件下使用。 ‰‰ 测试一切(我们需要测试已经提交的代码,如果用户需要,我们将会帮助用户 测 试 )。 第 1 章 OpenStack 简介 23 1.7.2 OpenStack 架构 OpenStack 是由一系列具有 RESTful 接口的 Web 服务所实现的,是一系列组件服务集 合。如图 1-24 所示,我们看到的是一个标准的 OpenStack 项目组合的架构。这是比较典型的 架构,但不代表这是 OpenStack 的唯一架构,我们可以选取自己需要的组件项目,来搭建适 合自己的云计算平台。 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 䇤⿈ㆈ㘇 㳂⹊㦰䐅 㳂⹊㦰䐅 ⡄⫇㈖ 㼒㸥ミ ⡄⫇⪦ 㝭㸥ミ 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 㳂⹊㦰䐅 䇤⿈ㆈ㘇 㳂⹊㶙 㕈㑍ㅴ 㳂⹊㶃⤠ ⪦㝭㉎ 图 1-24 OpenStack 架构一览 OpenStack 项目并不是单一的服务,其含有子组件,子组件内由模块来实现各自的功 能,如图 1-25 所示。通过消息队列和数据库,各个组件可以相互调用,互相通信。这样的消 息传递方式解耦了组件、项目间的依赖关系,所以才能灵活地满足我们实际环境的需要,组 合出适合我们的架构。每个项目都有各自的特性,大而全的架构并非适合每一个用户,譬如 Glance 在最早的 A、B 版本中并没有实际出现应用,Nova 可以脱离镜像服务独立运行。当用 户的云计算规模大到需要管理多种镜像时,才需要像 Glance 这样的组件。OpenStack 的成长 是在生产环境中不断被检验,然后再将需求反馈给社区,由社区来实现的一个过程,可以说 OpenStack 并非脱离实际的理想化开源社区项目,而是与生产实际紧密结合的,可以复制应 用的云计算方案。 第一部分 基 础 篇24 图 1-25 OpenStack 各组件之间的交互示意图 注:完整版本请参看 docs.openstack.org/training-guides/content/module001-ch004-openstack-architecture.html。 1.8 OpenStack 的开发资源 1.8.1 OpenStack 社区 OpenStack 是由开发商、企业、服务供应商、研究人员及用户共同组成的全球性的社 区。关注OpenStack 最好的方式就是访问OpenStack 社区:www.openstack.org,通过社区 可以第一时间了解 OpenStack 的动态。希望下面给出的这些链接可以帮助读者进一步了解 OpenStack。 ‰‰ OpenStack 峰会:https://wiki.openstack.org/wiki/Summit ‰‰ OpenStack 用户成员:https://wiki.openstack.org/wiki/OpenStackUsersGroup ‰‰ OpenStack 在线会议:https://wiki.openstack.org/wiki/Meetings ‰‰ OpenStack 邮件列表:https://wiki.openstack.org/wiki/MailingLists ‰‰ OpenStack IRC 频道:https://wiki.openstack.org/wiki/IRC ‰‰ OpenStack 维基:https://wiki.openstack.org/ ‰‰ OpenStack 博客:http://www.openstack.org/blog/category/newsletter/ ‰‰ OpenStack 资讯:http://planet.openstack.org/ 第 1 章 OpenStack 简介 25 ‰‰ OpenStack Github:https://github.com/openstack ‰‰ OpenStack 问题列表:https://ask.openstack.org/zh/questions/ (1)在线工具 ‰‰ 记事本:https://etherpad.openstack.org/ ‰‰ 剪贴板:http://paste.openstack.org/ (2)代码库 ‰‰ 核心项目 Git 库:http://git.openstack.org/cgit ‰‰ 项目建设工具:https://github.com/openstack-infra ‰‰ 开发人员工具:https://github.com/openstack-dev (3)代码提交和审查 ‰‰ 代码 review 系统:https://review.openstack.org/ ‰‰ 代码合并建议:http://status.openstack.org/reviews/ ‰‰ 持续集成:http://status.openstack.org/zuul/ ‰‰ 用户和管理员文档:http://docs.openstack.org/ 1.8.2 OpenStack 基金会 OpenStack 基金会促进 OpenStack 的发展、分销、建设。作为 OpenStack 的独立家庭, 基金会已经吸引来自 87 个国家或地区的 850 个不同组织的超过 5600 名个人成员,获得超过 1000 万美元的资金,履行 OpenStack 的使命——成为无处不在的云计算平台。 OpenStack 基金会的目标是为开发人员、用户和整个生态系统提供一套记录 OpenStack 成长足迹的共享资源,使得供应商和开发人员在云行业得到优秀的软件。如同 OpenStack 软 件本身,OpenStack 基金会成员资格是免费的,任何人都可以参与。OpenStack 社区成员通 过技术贡献或者社区建设工作可以参与其中。OpenStack 基金会网址:https://www.openstack. org/join/。 如果没有这么多参与者提供各式各样的支持,OpenStack 基金会就不可能发展到今天。 想要了解更多OpenStack 的支持者信息,可以访问以下网址:https://www.openstack.org/ foundation。 1.8.3 OpenStack 项目资料 1. Nova ‰‰ 项目主页:http://launchpad.net/nova ‰‰ 项目代码:https://github.com/openstack/nova ‰‰ Bug 追踪:https://bugs.launchpad.net/nova ‰‰ 功能需求蓝本(blueprint): https://blueprints.launchpad.net/nova 第一部分 基 础 篇26 ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/page:1/query:nova/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/nova,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/nova.git;a=summary ‰‰ 团队列表:https://launchpad.net/~nova ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/25,members 2. Glance ‰‰ 项目主页:http://launchpad.net/glance ‰‰ 项目代码:https://github.com/openstack/glance ‰‰ Bug 追踪:https://bugs.launchpad.net/glance ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/glance ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:glance/ page:1/query:glance/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/glance,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/glance.git;a=summary ‰‰ 团队列表:https://launchpad.net/~glance ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/13,members 3. Keystone ‰‰ 项目主页:http://launchpad.net/keystone ‰‰ 项目代码:http://github.com/openstack/keystone ‰‰ Bug 追踪:https://bugs.launchpad.net/keystone ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/keystone ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:keystone/ page:1/query:keystone/ ‰‰ 代码更改建议:https://review.openstack.org/#q,status:open+project:openstack/keystone,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/keystone.git;a=summary ‰‰ 团队列表:https://launchpad.net/~keystone ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/9,members 4. Horizon ‰‰ 项目主页:http://launchpad.net/horizon ‰‰ 项目代码:http://github.com/openstack/horizon ‰‰ Bug 追踪:https://bugs.launchpad.net/horizon 第 1 章 OpenStack 简介 27 ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/horizon ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:horizon/ page:1/query:horizon/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/horizon,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/horizon.git;a=summary ‰‰ 团队列表:https://launchpad.net/~horizon ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/43,members 5. Swift ‰‰ 项目主页:https://launchpad.net/swift ‰‰ 项目代码:https://github.com/openstack/swift ‰‰ Bug 追踪:https://bugs.launchpad.net/swift/+bugs ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/swift ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:swift/page:1/ query:swift/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/swift,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/swift.git;a=summary ‰‰ 团队列表:https://launchpad.net/~swift ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/24,members 6. Cinder ‰‰ 项目主页:https://launchpad.net/cinder ‰‰ 项目代码:https://github.com/openstack/cinder ‰‰ Bug 追踪:https://bugs.launchpad.net/cinder/+bugs ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/cinder ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:cinder/page:1/ query:cinder/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/cinder,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/cinder.git;a=summary ‰‰ 团队列表:https://launchpad.net/~cinder ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/83,members 7. Neutron ‰‰ 项目主页:https://launchpad.net/neutron 第一部分 基 础 篇28 ‰‰ 项目代码:https://github.com/openstack/neutron ‰‰ Bug 追踪:https://bugs.launchpad.net/neutron/+bugs ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/neutron ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:neutron/ page:1/query:neutron/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/neutron,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/neutron.git;a=summary ‰‰ 团队列表:https://launchpad.net/~neutron ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/38,members 8. Ceilometer ‰‰ 项目主页:https://launchpad.net/ceilometer ‰‰ 项目代码:https://github.com/openstack/ceilometer ‰‰ Bug 追踪:https://bugs.launchpad.net/ceilometer/+bugs ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/ceilometer ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:ceilometer/ page:1/query:ceilometer/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/ceilometer,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/ceilometer.git;a=summary ‰‰ 团队列表:暂无 ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/107,members 9. Heat ‰‰ 项目主页:https://launchpad.net/heat ‰‰ 项目代码:https://github.com/openstack/heat ‰‰ Bug 追踪:https://bugs.launchpad.net/heat/+bugs ‰‰ 特性需求(blueprint): https://blueprints.launchpad.net/heat ‰‰ 技术问题:https://ask.openstack.org/zh/questions/scope:all/sort:activity-desc/tags:heat/page:1/ query:heat/ ‰‰ 代码更改建议:https://review.openstack.org/#/q/status:open+project:openstack/heat,n,z ‰‰ 代码变化:https://review.openstack.org/gitweb?p=openstack/heat.git;a=summary ‰‰ 团队列表:https://launchpad.net/~heat ‰‰ 核心成员列表:https://review.openstack.org/#/admin/groups/114,members 第 1 章 OpenStack 简介 29 1.9 OpenStack 非核心项目介绍 1.9.1 Ironic 项目介绍 Ironic 为 OpenStack 的孵化项目之一,如果说 OpenStack Nova 管理的是虚拟机的生命周 期,那么 Ironic 就是为了管理物理机的生命周期。它提供了一系列管理物理机的 API 接口, 可以对“裸”操作系统的物理机进行管理,从物理机上架安装操作系统到物理机下架维修。 我们可以像管理虚拟机一样地管理物理机,创建一个 nova-compute 物理节点不再需要人工部 署,只需告诉 Ironic,然后自动化地从镜像模板中加载操作系统到 nova-compute 安装完成即 可。OpenStack 管理虚拟机已经非常成熟,通过 Nova 我们可以快速自动化地创建虚拟机。但 是在这之前需要搭建物理环境,需要人工地管理多台设备,OpenStack 并没有提供物理环境 的管理,我们依然需要解决这些基础环境的搭建问题,由此 Ironic 应运而生,解决物理机的 添加、删除、电源管理、操作系统部署等问题。Ironic 让 OpenStack 不仅停留在软件层面解 决云计算问题。供应商可以对应自己的服务器开发 Ironic 插件。到目前为止,Ironic 还处于 实验阶段,它的目标是成为物理机管理的成熟解决方案。 提到 Ironic 项目,就不得不说 Nova 项目中的 baremetal 驱动。baremetal 是 Nova 中的后 端驱动,它与 libvirt 驱动、XenAPI 驱动、VMware 驱动一样,只不过它用来管理没有虚拟化 的硬件,主要通过 PXE 和 IPMI 进行控制管理。这是一个可插拔式的插件,有了它,配置和 管理服务器的硬件就可以使用 Heat 或 salt-cloud 来完成。baremetal 并不能直接使用,还需要 额外的环境准备,如要预先配置 IPMI、配置 DHCP 服务、开启 PXE 等。Grizzy 版本中已经 含有 baremetal 驱动,但这仍然是实验性质。 在 Nova 中,baremetal 的概念最早是由 USC/ISI 和 NTT-Docomo 提出的。USC/ISI 是研 究超算的教育机构,而 NTT-Docomo 是一家日本公司。物理机与虚拟机管理有许多类似的地 方,但又有一些差异。最早设想为通过 Nova 统一管理,但在开发中,物理机与虚拟机的差 异导致 baremetal 不得不从 Nova 中剥离,因为: ‰‰ baremetal 驱动有自己的数据库,在 Nova 一个项目中有两套数据库不合适。 ‰‰ 物理机和虚拟机存储的数据信息不同,将两个有差异的实体放在同一个 API 中获取信 息,在设计和使用上都比较别扭。 ‰‰ 物理机和虚拟机的操作有差异,如 discovery、hardware RAID configuration、firmware updates、burn-in 等操作。物理机和虚拟机不能简单同质化。 社区经过讨论,决定将 baremetal 从 Nova 中剥离出来,命名为 Ironic,主要用来实现对 物理机的裸机管理。 下面来了解一下 baremetal 和 Ironic 在执行创建时的区别。 下面是通过 PXE 部署硬件物理机的步骤,如图 1-26 所示。 第一部分 基 础 篇30 图 1-26 通过 PXE 方式部署硬件 1)通过“ nova boot”命令创建物理机,nova-api 组件处理命令并将创建消息发送到消 息队列中。 2)nova-scheduler 接收到消息队列中的消息,判断是否为 baremetal 节点,如果是,则 将调度后的主机节点信息及创建消息放入消息队列。 3)nova-compute 监听消息队列发现创建消息并处理,调用 baremetal 驱动,通过实现 spawn() 方法来调用创建。 4)nova-compute 查询 baremetal 数据库,获取节点信息。 5)Neutron 负责设置网络相关信息。 6)nova-compute 开始从 Glance 获取镜像。 7)nova-compute 激活 bootloader。 8)通过 IPMI 开启物理机电源。 9)通过 PXE 加载 bootloader,暴露 iSCSI,通过 nova-baremetal-deploy-helper 将镜像中 的信息写入服务器。 10)重新启动服务器,加载操作系统。 11)更新数据库中物理机的信息状态。 12)更新 Nova 中的 instance 状态信息。 Ironic 的部署流程与 baremetal 类似,如图 1-27 所示。 第 1 章 OpenStack 简介 31 图 1-27 通过 Ironic 部署硬件 1)通过 nova boot 命令创建物理机,nova-api 组件处理命令,并将创建消息发送到消息 队列中。 2)nova-scheduler 接收到消息队列中的消息,判断是否为 baremetal 节点,如果是,则 将调度后的主机节点信息及创建消息放入消息队列。 3)nova-compute 监听消息队列发现创建消息并处理,调用 baremetal 驱动,通过实现 spawn() 方法来调用创建。 4)nova-compute 通过 Ironic API 获取硬件注册信息。 5)Neutron 负责设置网络相关信息。 6)nova-compute 开始从 Glance 获取镜像。 7)nova-compute 通过 Ironic API 发送部署请求。 8)Ironic API 与 Ironic Conductor 组件交互并激活 bootloader。 9)通过 IPMI 开启物理机电源。 10)通过PXE 加载bootloader,暴露iSCSI,通过nova-baremetal-deploy-helper 将镜像 中的信息写入服务器。 11)重新启动服务器,加载操作系统。 可以看到,Ironic 对于硬件的异构问题主要是通过多个后端驱动的结合来解决的,如 图 1-28 所示。 第一部分 基 础 篇32 图 1-28 Ironic 硬件驱动的接口 图 1-28 中的接口介绍如下。 ‰‰ Deploy Interface:实现把镜像部署到物理机中。 ‰‰ Power Interface:实现对物理机电源的管理。 ‰‰ Console Interface:实现通过硬件直接得到物理机 Console(控 制 台)。 ‰‰ Vendor Interface:厂商自定义行为。 因为 Ironic 项目结构与大部分的 OpenStack 结构类似,所以是标准的 OpenStack 项目。 目前,由于项目时间较短,因此并不是很成熟,但是从 Ironic 想解决的问题以及社区的支持 来看,Ironic 有希望在未来的几个版本内成为核心项目。 Ironic 的安装 下面介绍一下 Ironic 的安装流程。 1)通过 git clone 获取最新的 DevStack。获取链接地址为: git://github.com/openstack-dev/devstack.git 2)进入 devstack 目录修改 localrc 文件,添加如下内容: # Enable Ironic API and Ironic Conductor enable_service ir-api enable_service ir-cond # 使用 Neutron 代替 nova-network,Ironic 只支持 Neutron disable_service n-net enable_service q-svc enable_service q-agt enable_service q-dhcp 第 1 章 OpenStack 简介 33 enable_service q-l3 enable_service q-meta enable_service neutron enable_service q-lbaas # 按需要替换 password ADMIN_PASSWORD=password MYSQL_PASSWORD=password RABBIT_PASSWORD=password SERVICE_PASSWORD=password 3)运行 stack.sh 脚本。命令如下: ./stack.sh 接下来就是等待 Ironic 安装完成了。Ironic API 地址为 http://:6385。 1.9.2 Tempest 项目介绍 Tempest 为 OpenStack 的功能测试、集成测试项目,它被设计为可在各种不同项目中使 用。在 OpenStack 核心项目中的单元测试代码中经常可以看到它的身影,在一些孵化项目中 也会使用 Tempest 去测试。它可以验证代码的正确性,已经成为 OpenStack 项目中不可或缺 的组成部分。 Tempest 框架主要基于 unittest2 和 nose 来实现,它通过调用 OpenStack API 来测试功能, 响应验证。测试的主要风格是按照 pyunit 来确定的,同时使用了 testtools 和 testresources 等 多个测试工具库,可以说相当强大。 使用 Tempest 测试一个 OpenStack 环境,先要在各个 OpenStack 项目的配置文件中设置 Tempest,在 etc/ 文件夹下有一个 tempest.conf.sample 供参考使用。设置完成后,就可以直 接通过“ nosetests tempest”命令运行所有测试案例,也可以指定执行某个测试类库中的测 试用例。 Tempest 主要用于以下几个测试: ‰‰ API 测试 ‰‰ 命令行测试 ‰‰ 复杂场景测试 ‰‰ 压力测试 ‰‰ 第三方 API 测试 每一项都对应 Tempest 中的一个目录,每个目录中包含不同类型的测试。README.rst 中记录着每个目录的作用,以及良好的测试示例及测试规则。 Tempest 目录结构如下: 1)api:API 的测试集。 2)cli:OpenStack 的命令行工具测试集。 第一部分 基 础 篇34 3)common:一些公共的工具类和函数。 4)scenario :对 OpenStack 的常用场景进行测试,包括基本的启动虚拟机、挂载 volume 和网络配置等。 5)services:Tempest 实现的 OpenStack API Client,主要是避免官方 Client 中含有 Bug。 6)stress :压力测试集,利用多进程(multiprocessing)同时对 OpenStack 发起请求进行 测试。 7)thirdparty:EC2 等第三方兼容 API 测试集。 8)whitebox:白盒测试集。 1. API 测试 API 测试是验证 OpenStack 的 API。它不应该利用现有的 OpenStack Python 客户端实现, 而是应该使用 Tempest 组件来实现。同时测试 XML 和 JSON 格式的请求。脱离官方客户端, 可以让我们传递无效或非法的 JSON 和 XML 请求来查看这些请求结果,以验证 API 的健壮 性。API 测试应由项目开发者自己来完成,比如对项目进行功能性测试,或者使用某些单元 测试框架。 2. 命令行测试 命令行测试使用OpenStack 的命令行与OpenStack 中的项目组件进行交互。命令行 测试中,单元测试是有点困难的,因为不像服务器测试,它没有实现访问服务器的代码。 Tempest 运行于一个部署好的 OpenStack 环境,这样就合乎逻辑了,可以在服务器上直接执 行命令行。 3. 复杂场景测试 复杂场景测试是通过各种复杂的 OpenStack 调用流程来测试 OpenStack 功能。它由一 系列经典场景组成,需要多个 OpenStack 项目支持来完成这一系列测试。场景测试可以使用 OpenStack Python 客户端。 4. 压力测试 压力测试主要设计为测试 OpenStack 在高工作负载中运行时会出现什么问题。多种工具 可以帮助检测 OpenStack 在高负载时出现的问题,如追溯日志。 5. 第三方 API 测试 许多 OpenStack 项目支持第三方 API,如 Nova 支持 EC2 的 API。Tempest 验证第三方 API,必须独立于 OpenStack 正常的测试流程。第三方 API 测试应该独立于 OpenStack 本身 的逻辑。 第 2 章 Chapter 2 OpenStack 的安装 2.1 在 Ubuntu 上使用二进制包安装 笔者写本书的时候,OpenStack 已经发展到 Havana 版本,几大主流的 Linux 发行版本都 会将 OpenStack 的源代码做成各自平台的二进制安装包,以供用户使用。随着 OpenStack 使 用的人越来越多,发行版本对 Linux 的支持力度也越来越大,就目前来看,Ubuntu(Debian)、 RedHat、OpenSUSE 都有相应的包和开发定制的安装程序。当然,各个 Linux 平台上的包制 作发布的时间各有快慢,同时支持的版本更新也有快有慢。Ubuntu 是更新最快的发行版本之 一。RedHat 也越来越重视 OpenStack,更新包的速度也比以前快很多。这里先以 Ubuntu 作 为底层的操作系统,因为 Ubuntu 从 OpenStack 的 Cactus 版本开始就将其作为自身一个云计 算的软件,同时,社区对 OpenStack 的支持很好,网络上很多文档都是以 Ubuntu 为操作系 统进行部署安装的,并且 OpenStack 的开发人员是在 Ubuntu 上进行 OpenStack 的开发的,就 目前情况来看,其支持度最好。 本节将会介绍如何在Ubuntu 12.04 LTS 上安装Keystone、Glance、Nova、Neutron、 Cinder 和 Horizon 这几个组件,其中使用4 台服务器,分别作为controller、network、 compute、volume 节点。这 4 个节点的名字只是按照它们需要完成的任务来命名的,并不是 说它们有特定的名字。 2.1.1 控制节点的安装 在 controller 节点上计划部署如下组件: ‰‰ RabbitMQ 第一部分 基 础 篇36 ‰‰ MySQL ‰‰ Keystone ‰‰ Glance ‰‰ Neutron ‰‰ Nova 中除去 nova-compute 的其他组件 ‰‰ Cinder 中除去 cinder-volume 的其他组件 ‰‰ Horizon 下面详细介绍一下各个组件。 RabbitMQ :在 OpenStack 中,各个服务之间是通过消息来交互的。因为 OpenStack 使 用 AMQP(高级消息队列协议)作为其消息传递的技术,所以 RabbitMQ、Qpid、ZeroMQ 等 支持 AMQP 的软件都是被 OpenStack 所支持的。这里会使用 RabbitMQ,因为它是第一个被 OpenStack 使用的消息传递的软件。OpenStack 通过 AMQP 实现 RPC 的服务,来保证不同组 件之间的通信,RabbitMQ 是 controller 中一个非常关键的服务。RabbitMQ 结构图如图 2-1 所示。 㼏㚠 䇤⿈ ㅨ㩌 㶙㕈 VPN 㿊㛃〛㬖㏞ ㈖㼒 㿊㛃〛㞅䐤 ⹓㼎IP⧹ 䊧㋹䐧㡘 㶙㕈 ㋹䐧㡘 ㌊⫇⪃ ㋹䐧㡘 ェ㰄 ㋹䐧㡘ⰵ㼔⫇⪃ ⴟ㹒 ⮘Ⱙ㡘 㦰䐅⹽㏎ ⡟⭹Ⳟⳉ http VM㬖㏞ ➓㦌䔊 㶃⤠⪦㝭㉎ VM㌍䍶 VM㈖㼒 IP⭹䐘 SSH㗽䊠 ㋪䇤䈓 Euca2ools Nova-Manage REST API Server EC2 API OpenStack API ⡟⭹Ⳟⳉ AMQP AMQP AMQP AMQP 图 2-1 RabbitMQ 交互图 MySQL:OpenStack 所使用的数据库。包括 Nova、Glance、Cinder 等在内的组件都会建 第 2 章 OpenStack 的安装 37 立自己的数据库,保存一些必要的数据。 Keystone :OpenStack 的用户认证组件。它的功能主要是建立管理项目的用户和各种 服务端口,以及进行用户的身份认证。要使用 OpenStack 的任意 API,第一步就必须通过 Keystone 的验证。 Glance:用来存放管理虚拟机镜像和快照的服务,这也是一个最小架构中必须有的服务。 Neutron:用来提供虚拟机网络通信的组件。 Nova(除 去 nova-compute 的其他组件):这里不包括 nova-compute,因为 Controller 节点 不负责运行虚拟机。Nova 是个至关重要的组件,也是个相对庞大的组件,其中有很多服务, 它是进行生成虚拟机工作的主要服务。 Cinder(除 去 Cinder-volume 的其他组件):用来创建、删除及管理 volume(虚拟磁盘卷), 以及给 volume 做快照等服务的组件。 Horizon :OpenStack 的 Web 管理页面,使用 Django 框架开发。Web 管理页面包含了日 常使用的大部分功能,提供给用户一个最直观的展现方式。很多简单的二次开发工作都是从 Horizon 开始的。 1. 系统环境准备 在安装部署 OpenStack 之前,首先需要做一些安装额外软件和配置网络等准备,主要包 括以下几个部分: ‰‰ 操作系统为 Ubuntu 12.04 LTS,最小化安装即可。在安装系统的时候,安装 openssh- server,分区尽量能有 30GB 空间,用来完成这个测试环境。 ‰‰ 网络连接和 IP 设置。需要两个以太网口,分配两个独立的网络。 ‰‰ 添加 OpenStack Havana 版本的软件包源到系统中,并且更新系统。 ‰‰ 安装 NTP 服务。 ‰‰ MySQL,安装 MySQL 数据库和 Python 的 MySQL 库。 ‰‰ RabbitMQ,安装 Rabbitmq-server 作为 OpenStack 的 AMQP。 (1)网络 IP 配置 按照架构的设计,controller 需要两个网口,连接两个网段。 ‰‰ eth0 所在的网段是一个用户可访问的网段,在本章中,把这个网络命名为 network-1, 将会通过 Web 访问这个 eth0 所使用的 IP 来进行登录 Web 的操作。举例来说,如果 笔者现在的PC 配置的IP 是 10.10.101.10,22 位的掩码,那么笔者的controller 的 eth0 可以配置为 10.10.101.10/22 这个网段中任何没有使用的 IP 地址。 ‰‰ eth1 所在的网段是一个私有的管理网段,在本章中,把这个网络命名为 network-2。 在实际环境中,所有的节点,无论是 controller,还是计算节点,网络节点都需要有一 个网口连接这个网段,所有的数据库连接,以及 RabbitMQ 的通信使用的都是这个网 口。如果用 SSH 登录来进行修改配置等工作,也应接入这个网段进行操作。如果需 第一部分 基 础 篇38 要监控 OpenStack 环境中的服务器和虚拟机,也建议通过接入这个网段进行。这个网 段不需要有能访问外部网络的功能。在一个简单的模型中,只要把这些网口接入到一 台交换机上即可,示例如下所示: # cat /etc/network/interfaces # network-1 Internet auto eth0 iface eth0 inet static address 10.10.101.10 netmask 255.255.252.0 network 10.10.100.0 broadcast 10.10.103.255 gateway 10.10.100.1 dns-nameservers 8.8.8.8 # network-2 Management auto eth1 iface eth1 inet static address 10.80.80.10 netmask 255.255.255.0 以上是笔者环境中的网络配置文件,读者可以根据自己环境的实际情况进行修改,然后 重启服务器网络。命令如下,提示符 # 的命令操作表示是在 root 用户环境下进行的操作。 # /etc/init.d/networking restart (2)添加 Havana 的源 Ubuntu 12.04 默认的 OpenStack 的版本是 Essex 版本,如果不安装其他版本的源,那么 默认命令安装的都是 Essex 版本的软件包,这点需要用户注意。此处,要加入 OpenStack 软 件包的 Havana 的源,然后更新一下系统的软件包信息和已安装的软件。命令如下: # apt-get install –y python-software-properties # add-apt-repository cloud-archive:avana 加入新的源后会在 /etc/apt/sources.list.d/ 目录下多出一个 Havana 源的文件,如下所示: # apt-get update # apt-get upgrade –y # apt-get dist-upgrade –y 更新完系统后可以重启,也可以等安装完 OpenStack 后再重启。 (3)安装 NTP 服务 在整个 OpenStack 集群中,规模可以从几个节点到几十个节点,甚至几百个,为了保证 这些集群中的节点互相通信正常,需要使各个节点的时间一致,误差不能太大,因此需要一 台 NTP 服务器来提供时间同步,在这个测试环境中,选择在控制节点上安装 NTP 服务。命 令如下: 第 2 章 OpenStack 的安装 39 # apt-get install –y ntp (4)安装 MySQL 数据库 OpenStack 的主要组件都需要数据库的支持。OpenStack 支持MySQL、PostgreSQL、 SQLite。在这个测试环境中,选择 MySQL 作为数据库。控制端安装 MySQL 的 Server,节点 通过 Python 的 MySQL 客户端模块连接到 MySQL Server。命令如下: # apt-get install –y mysql-server python-mysqldb 安装 MySQL 的过程中,会提示创建 MySQL 的 root 密码。 默认 MySQL 只监听 127.0.0.1,而在实际的生产环境中,出于安全考虑,数据库通信 经过的是管理网段,只需让 MySQL 监听管理网的 IP。在这个安装实例中,可以将管 理网 IP 设置为 10.80.80.10。重启 MySQL 使配置生效。代码如下: # sed –I"s/127.0.0.1/10.80.80.10/" /etc/mysql/my.cnf # service mysql restart (5)安装 Messaging 服务 OpenStack 组件之间的通信需要通过支持 AMQP 的 Messaging 服务软件。OpenStack 支 持的有 RabbitMQ、Qpid 和 ZeroMQ。这里安装 RabbitMQ。命令如下: # apt-get install -y rabbitmq-server 安装 RabbitMQ 服务软件时,RabbitMQ 默认用户 guest 的密码是 guest,出于安全考 虑,用户可以在实际环境中更改密码。如果用户的 RabbitMQ 启动失败,那么可能是由于 / etc/hosts 中 127.0.0.1 所对应的主机名和使用命令 hostname 后的结果不一致,此时可以尝 试在 /etc/hosts 的 localhost 前面把 hostname 加入,然后再启动 RabbitMQ。修改 guest 密码 的命令是: # rabbitmqctl change_password guest NEW_PASSWORD 至此,前置工作已经完成,下面可以开始安装 OpenStack 了。 2. 安装部署 Keystone 把 Keystone 作为安装OpenStack 的第一步,因为它是整个OpenStack 的认证系统, 就好比屋子的一扇门,只有通过了这扇门,才能进行后面的操作。另外,Keystone 负责 OpenStack 的用户管理,只有创建了用户,才能以这个用户的身份进入这扇门。 安装配置 Keystone 的过程主要分为下面几步: ‰‰ 安装软件包和修改配置文件。 ‰‰ 创建 Keystone 的数据库,并建立 Keystone 的表结构。 提示 第一部分 基 础 篇40 ‰‰ 启动服务,确认服务正常运行。验证 Keystone 可以使用。 ‰‰ 创建 Keystone 的管理员用户。 ‰‰ 定义 Keystone 使用的 Services 和 API Endpoints。 ‰‰ 以创建的用户来使用 Keystone 客户端命令行。 (1)安装和配置 Keystone 直接安装 Keystone 一个包即可,系统同时会自动安装 Python-keystoneclient 的客户端 包,其命令如下: # apt-get install -y keystone Keystone 的配置文件放在 /etc/keystone 目录下,要修改的主要是 keystone.conf 这个文 件。主要修改以下几个参数: # vi /etc/keystone/keystone.conf admin_token = openstack debug = True verbose = True connection = mysql://keystoneuser:openstack@localhost/keystone ‰‰ admin_token:这个选项至关重要,可以将其比喻成获取 Keystone 管理权限的“钥匙”。 在这里可以设置一个复杂的字符串,因为太简单的字符串容易被破解。由于是测试环 境,笔者就用 openstack 这个字符串作为 admin的 token。此时,因为在 Keystone 中 还未建立任何用户,所以这个 token 和用户无关,但是这个 token 在生产环境中需要 足够复杂且绝对保密。 ‰‰ debug 与 verbose:这两个选项均设置为 True,用于测试时查看详细的输出信息,而输 出信息会保存在 log_dir 和 log_file 定义的目录文件中。 ‰‰ connection :这个选项定义Keystone 使用的数据库的URL。这里用了MySQL 的 keystoneuser 用户,密码是 openstack,数据库地址是 localhost,也就是本机,数据库 名是 keystone。注意,目前我们还没有建立这个数据库和数据库用户。 在这个测试环境中,保持配置文件中其他选项不变。 (2)Keystone 的数据库操作 需要在 MySQL 中建立一个 Keystone 的数据库,再创建一个用户,赋予其对 keystone 数 据库的操作权限,代码如下。注意,建立的数据库名、用户名及密码要和上面 keystone.conf 配置文件中的 connection 选项一致。 # mysql -uroot -p -e "CREATE DATABASE keystone;" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON keystone.* TO'keystoneuser'@ 'localhost'IDENTIFIED BY 'openstack';" 建立好的数据库是空的,需要初始化 Keystone 数据库的表结构。Keystone 提供了一个 很方便的创建结构的命令: 第 2 章 OpenStack 的安装 41 # keystone-manage db_sync 运行成功之后,可以进入 MySQL 查看 Keystone 这个数据库的表结构和字段。 (3)确认 Keystone 服务正常运行 配置文件修改后需要重启服务: # service keystone restart 如何确认 Keystone 服务正常启动?根据笔者的经验,可以从几个方面入手,这个也是后 面经常会使用的方法。 ‰‰ 使用命令“service keystone status”查看 keystone 进程是否为 running 状态。 ‰‰ 查看 log 文件。log 文件被定义在 keytone.conf 中,默认是 /var/log/keystone/keystone. log,查看是否有出错日志。如果设置了 debug 和 verbose 为 True,那么信息会很详 细,有利于排错。 ‰‰ 调用命令“ keystone client”。其实前两步是查看服务是否正常启动,真正确认还需 要第三步,即排错。服务启动了并不代表 Keystone 能如用户所愿地进行工作,有时 配置选项设置成不同的参数,服务也能正常运行,但是使用 Keystone 的时候会出错, 因此,运行一个实际的命令来验证 Keystone 是否能正常工作。运行命令前首先要输 入 token 和 Keystone 的 endpoint: # export OS_SERVICE_TOKEN=openstack # export OS_SERVICE_ENDPOINT=http://127.0.0.1:35357/v2.0/ # keystone user-list 前面两行是设定 token 和 endpoint 的环境变量。可以把它放入一个文件里,然后每次使 用 OpenStack 之前只要执行“ source 这个文件”即可。还记得前面在 Keystone 配置文件中的 一个选项 admin_token 吗?这里的第一个 token 使的就是当时设定的那个值。第三行命令是 测试 Keystone 是否能正常运行,需要列出 Keystone 中的用户。输出是一个空行?不用担心, 这是正常运行的表现,至少没有报错信息。运行命令的时候,建议结合日志的方法,再打开 一个窗口使用命令 tail 日志文件,查看是否有报错情况。因为到目前为止还没有建立过用户, 所以肯定没有用户使用的使用 Keystone 服务的日志。 (4)创建第一个 Keystone 用户 接下来的部分可能有点烦琐和难以理解,但笔者不打算在这里详细讲解每条命令的意 思,也不会说明为什么要这样做。这些原理性的内容将在第 5 章详细讲解。这里的任务是快 速地把基本环境搭起来,如果读者对这部分的内容产生疑惑,可以先照着步骤去做,相信等 有了一个完整可用的体系后,在使用中会慢慢理解其中的含义。 这里将建立一个用户、一个 tenant 和一个 role,它们之间的关系是用户属于 tenant,用 户在 tenant 中可以有不同的角色。记住,操作之前一定要设置 token 和 endpoint 这两个环境 变量。 第一部分 基 础 篇42 首先,创建一个具有管理权限的 tenant,称为 admin,其代码如下: # keystone tenant-create --name=admin +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | | | enabled | True | | id | 08cbb73f6689477eb42d7be9a901e55c | | name | admin | +-------------+----------------------------------+ 然后,创建一个用户,命名为 admin,密码设置为 openstack,其代码如下: # keystone user-create --name=admin --pass="openstack" +----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | email | | | enabled | True | | id | 3372c9032dd24ee9b2dcefcdbba13f01 | | name | admin | +----------+----------------------------------+ 接着,创建一个称为 admin 的角色,其代码如下: # keystone role-create --name=admin +----------+----------------------------------+ | Property | Value | +----------+----------------------------------+ | id | 59aa2c3dcbf542d1a84e6703eb45d8b1 | | name | admin | +----------+----------------------------------+ 最后,把前面创建的 tenant、用户和 role 组合起来,在 admin 的 tenant 中分配 admin 的 角色给用户 admin,命令如下: # keystone user-role-add --user admin --role admin --tenant admin (5)定义 Services 和 API Endpoints 为了使用 Keystone 来认证用户使用的 OpenStack 中的其他组件,需要在 Keystone 中创 建组件的服务和相应的 API Endpoints,组件服务的 API Endpoints 是一组 URL 加端口号,用 来提供组件服务的 API 接口。 这里需要创建一个 Keystone 的服务和 Keystone 的 API Endpoints,其代码如下: # keystone service-create --name keystone --type identity --description 'OpenStack Identity' +-------------+----------------------------------+ | Property | Value | 第 2 章 OpenStack 的安装 43 +-------------+----------------------------------+ | description | OpenStack Identity | | id | 6660f592f4884e7ca18d498e7aa130a1 | | name | keystone | | type | identity | +-------------+----------------------------------+ # keystone endpoint-create --service-id 6660f592f4884e7ca18d498e7aa130a1 --publicurl 'http://10.10.101.10:5000/v2.0' --adminurl 'http://10.80.80.10:35357/v2.0' --internalurl 'http://10.80.80.10:5000/v2.0' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://10.80.80.10:35357/v2.0 | | id | 2dee1b06cbda4d8095c344ab3671d0ce | | internalurl | http://10.80.80.10:5000/v2.0 | | publicurl | http://10.10.101.10:5000/v2.0 | | region | regionOne | | service_id | 6660f592f4884e7ca18d498e7aa130a1 | +-------------+----------------------------------+ endpoint-create 命令中的 service id 是 service-create 命令得到的 ID 号。publicurl 里面的 IP 使用对外是可以访问的。adminurl 和 internalurl 使用内部管理的 IP,当然这个也可以视实 际情况而定。 (6)使用 Keystone 命令行客户端 使用命令行客户端需要通过认证,有以下两种认证的方式。 ‰‰ 使用 keystone.conf 配置文件中的 token 认证,设置以下两个环境变量: # export OS_SERVICE_TOKEN=openstack # export OS_SERVICE_ENDPOINT=http://127.0.0.1:35357/v2.0/ ‰‰ 使用在 Keystone 中创建的用户名及密码进行认证,设置以下环境变量: export OS_TENANT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=openstack export OS_AUTH_URL="http://192.168.5.101:5000/v2.0/" 其中填入需要认证用户的 tenant、用户名和密码,最后一个是认证的 URL,仔细观察和 Keystone 的 endpoint 中的 publicurl 的关系。 第一种方式通过设置 OS_SERVICE_TOKEN 和 OS_SERVICE_ENDPOINT 来认证,适 用于 Keystone 中还没有管理员权限的用户的情况。现在我们有了一个管理员用户,就应 该通过用户登录,而不是使用token。需要取消OS_SERVICE_TOKEN 和 OS_SERVICE_ ENDPOINT 这两个变量,然后再导入用户的认证。如果同时设置了两种方式,那么系统会有 一个忽略用户认证的警告,仍旧使用 token 的认证。命令如下: 第一部分 基 础 篇44 # unset OS_SERVICE_TOKEN # unset OS_SERVICE_ENDPOINT 可以把认证方式的变量写在一个文件中,这里命令为 openstackrc,在以后每次使用的时 候,导入以下文件即可。 # source openstackrc # keystone user-list +----------------------------------+-------+---------+-------+ | id | name | enabled | email | +----------------------------------+-------+---------+-------+ | 3372c9032dd24ee9b2dcefcdbba13f01 | admin | True | | +----------------------------------+-------+---------+-------+ 3. 安装 Glance 镜像组件 Glance 组件完成镜像模板 snapshot 的存储工作。Glance 主要包括了 glance-api 和 glane- registry 两个服务,其安装和配置都比较简单,主要分为以下几步: ‰‰ 安装软件包,编辑配置文件。 ‰‰ 创建 Glance 的数据库。 ‰‰ 在 Keystone 中,创建 Glance 的用户、服务和 Endpoint。 ‰‰ 初始化 Glance 数据库,启动服务,确认服务正常运行。 ‰‰ 在 Glance 中添加虚拟机镜像。 (1)安装软件包,编辑配置文件 安装 Glance 服务时,将把 glance-api、glance-registry、python-glanceclient 都安装上。安 装命令如下: # apt-get install -y glance Glance 的配置默认文件在 /etc/glance 下,需要修改如下内容。 glance-api.conf 的修改如下: [DEFAULT] verbose = True debug = True sql_connection = mysql://glanceuser:openstack@localhost/glance [keystone_authtoken] auth_host = 127.0.0.1 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = openstack [paste_deploy] 第 2 章 OpenStack 的安装 45 flavor=keystone glance-registry.conf 的修改如下: [DEFAULT] verbose = True debug = True sql_connection = mysql://glanceuser:openstack@localhost/glance [keystone_authtoken] auth_host = 127.0.0.1 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = openstack [paste_deploy] flavor=keystone (2)创建 Glance 数据库 根据上面配置文件中设定的 sql_connection,在数据库中创建用户名为 glanceuser,密码 为 openstack。创建数据库 glance,赋予 glanceuser 对数据库 glance 的所有权限,其代码如下: # mysql -uroot -p -e "CREATE DATABASE glance;" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON glance.* TO 'glanceuser'@'localhost'IDENTIFIED BY 'openstack';" (3)在 Keystone 中,创建 Glance 的用户、服务和 Endpoint 在这个测试安装中,Glance 需要通过 Keystone 来进行用户的身份认证。我们已经在前 面的 glance-api 和 glance-registry 配置文件中设置了认证的用户等,现在必须在 Keystone 中 创建用户 glance,加入 service 这个 tenant,赋予 admin 的角色,其代码如下: # keystone tenant-create --name=service # keystone user-create --name=glance --pass=openstack # keystone user-role-add --user glance --role admin --tenant service 在 Keystone 通过用户验证后,因为需要知道 Glance 的服务和 Endpoint API,所以必须 在 Keystone 创建,其代码如下: # keystone service-create --name glance --type image --description'OpenStack Image Service' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | OpenStack Image Service | | id | 7bedcd5298d5404bbc82219f61372c1d | | name | glance | | type | image | 第一部分 基 础 篇46 +-------------+----------------------------------+ # keystone endpoint-create --service-id 7bedcd5298d5404bbc82219f61372c1d –publicurl 'http://10.10.101.10:9292'--adminurl 'http://10.80.80.10:9292/' --internalurl 'http://10.80.80.10:9292/' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | adminurl | http://10.80.80.10:9292/ | | id | b44b36a8c8c5406887f3d0a6d819b57d | | internalurl | http://10.80.80.10:9292/ | | publicurl | http://10.10.101.10:9292 | | region | regionOne | | service_id | 7bedcd5298d5404bbc82219f61372c1d | +-------------+----------------------------------+ 两条命令的 service id 必须一致。 (4)初始化 Glance 数据库,启动服务,确认服务正常运行 使用 glance-manage 命令,初始化 glance 数据库,其命令如下: # glance-manage db_sync 重启服务,查看 /var/log/glance 目录下的日志文件,确保启动后没有出错信息。也可以 在 glance-api.conf 和 glance-registry.conf 中设置 debug 和 verbose 为 True,来得到更多的日志 信息。重启代码如下: # service glance-api restart # service glance-registry restart 最后,确认一下服务是否运行,其代码如下: # service glance-api status # service glance-registry status # glance image-list (5)在 Glance 中添加虚拟机镜像 到此为止,Glance 的环境已经搭建好,但是 Glance 中还没有可用的镜像,只是可以用 来启动虚拟机的模板。模板可以自己创建,具体创建的方法将会在第 6 章详细介绍。在这个 测试安装中,为了方便,使用网络上一个精简的可启动的 Linux 系统作为模板。首先下载这 个小镜像,其代码如下: # wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img 使用 Glance 命令行客户端把镜像添加到 Glance 中。Glance 会在数据库中记录,并把文 提示 第 2 章 OpenStack 的安装 47 件复制到指定的目录,其代码如下: # glance image-create --name myFirstImage --is-public true --container-format bare --disk-format qcow2 --file cirros-0.3.1-x86_64-disk.img 再次运行“glance image-list”命令查看已上传的镜像,其代码如下: # glance image-list +--------------------------------------+--------------+-------------+---------- --------+----------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+--------------+-------------+---------- --------+----------+--------+ | d56d2ae1-2f8e-4801-ac06-b9e0ce7af6da | myFirstImage | qcow2 | bare | 13147648 | active | +--------------------------------------+--------------+-------------+---------- --------+----------+--------+ 4. 安装 Neutron 网络组件 Neutron 在整个 OpenStack 中负责网络部分的功能,其实 Neutron 仅仅只有管理功能, 实际的网络方面的实现依靠的是更加底层的网络技术,譬如 Linux 网桥、Open vSwitch 和 Nicira 等,在 Neutron 中,这些网络技术以 plugin 的形式使用。因此,在各个节点上,需要 安装 Neutron 的不同服务,才能形成一个真正的网络组件。 在 Grizzly 版本发布以后,网络组件改名为 Neutron,以前叫做 Quantum,因此,当 看到有的文档或者安装过程提到 Quantum 的时候,其实指的就是 Neutron。 在控制节点上,需要主要进行以下几个步骤: ‰‰ 安装 neutron-server 服务,修改配置文件。 ‰‰ 在 Keystone 中创建用户、服务和 Endpoint。 ‰‰ 在 MySQL 中创建数据库和用户。 (1)安装软件包,修改配置文件 Neutron 的软件包按照功能可以划分为多个,在控制节点,只需要安装 neutron-server 的 服务。同时,依赖会安装 neutron-plugin-openvswitch。其代码如下: # apt-get install -y neutron-server 修改配置文件,主要是设定 Keystone 认证和 Neutron 数据库,其代码如下: # vi /etc/neutron/neutron.conf [keystone_authtoken] auth_host = 127.0.0.1 提示 第一部分 基 础 篇48 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = neutron admin_password = openstack signing_dir = $state_path/keystone-signing [database] connection = mysql://neutronuser:openstack@localhost/neutron [DEFAULT] # 如果用户设置了 RabbitMQ 的默认 guest 密码,那么必须去掉这一行的注释,写入自己设定的密码 rabbit_password = guest ovs_neutron_plugin.ini 配置文件代码如下: # vi /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini [OVS] tenant_network_type = gre enable_tunneling = True tunnel_type = gre tunnel_id_ranges = 1:1000 [securitygroup] firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver [database] connection = mysql://neutronuser:openstack@10.80.80.10/neutron (2)创建用户、服务和 Endpoint 在 Keystone 中创建用户、服务和 Endpoint,其代码如下: # keystone user-create --name=neutron --pass=openstack # keystone user-role-add --user neutron --role admin --tenant service # keystone service-create --name neutron --type network --description 'OpenStack Networking service' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | OpenStack Networking service | | id | 7dc990a812874042bc96a1ca983ede1a | | name | neutron | | type | network | +-------------+----------------------------------+ # keystone endpoint-create --service-id 7dc990a812874042bc96a1ca983ede1a --publicurl 'http://10.10.101.10:9696/' --adminurl 'http://10.80.80.10:9696/' --internalurl 'http://10.80.80.10:9696/' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ 第 2 章 OpenStack 的安装 49 | adminurl | http://10.80.80.10:9696/ | | id | 1b67e73564fc4f6087fd90aed723d8a4 | | internalurl | http://10.80.80.10:9696/ | | publicurl | http://10.10.101.10:9696/ | | region | regionOne | | service_id | 7dc990a812874042bc96a1ca983ede1a | +-------------+----------------------------------+ (3)创建 Neutron 数据库和用户 因为 Neutron 的数据库会被其他节点连接,所以必须赋予 Neutron 数据库用户相应的权 限,使 neutronuser 不但能从本机连接,还要能从节点机器上连接控制服务器上的数据库,其 代码如下: # mysql -uroot -p -e "CREATE DATABASE neutron;" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutronuser'@'%'IDENTIFIED BY'openstack';" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON neutron.* TO'neutronuser'@ 'localhost'IDENTIFIED BY'openstack';" 5. 安装 Nova 组件 Nova 项目中虽然包含了很多组件,但是要在控制服务器上安装除去 nova-compute 的其 他一切 Nova 组件。其过程主要分为下面几步: ‰‰ 安装 Nova 软件包,设置 Nova 配置文件。 ‰‰ 创建数据库,初始化 Nova 数据库。 ‰‰ 在 Keystone 中创建 Nova 用户和 Endpoint。 1)安装 Nova 软件包,并配置相应文件,命令如下: # apt-get install -y nova-api nova-cert novnc nova-consoleauth nova-scheduler nova-novncproxy nova-doc nova-conductor Nova 的配置文件放在 /etc/nova 目录下,这次安装中需要修改的是 api-paste.ini 和 nova. conf 这两个文件。 api-paste.ini 中要修改的是认证部分,其代码如下: # vi /etc/nova/api-paste.ini [filter:authtoken] paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory auth_host = 127.0.0.1 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = nova admin_password = openstack signing_dir = /var/lib/nova/keystone-signing auth_version = v2.0 第一部分 基 础 篇50 Nova 几乎全部的配置都是写在 nova.conf 中的,其中选项参数很多,这里,笔者将列出 一份测试环境安装使用的 nova.conf 配置文件以供参考。 # vi /etc/nova/nova.conf [DEFAULT] logdir=/var/log/nova state_path=/var/lib/nova lock_path=/run/lock/nova verbose=True debug=True api_paste_config=/etc/nova/api-paste.ini compute_scheduler_driver=nova.scheduler.simple.SimpleScheduler rabbit_host=10.80.80.10 rabbit_password=guest nova_url=http://10.80.80.10:8774/v1.1/ sql_connection=mysql://novauser:openstack@10.80.80.10/nova root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf enabled_apis=ec2,osapi_compute,metadata # Auth use_deprecated_auth=false auth_strategy=keystone # Imaging service glance_api_servers=10.80.80.10:9292 image_service=nova.image.glance.GlanceImageService # Vnc configuration novnc_enabled=true novncproxy_base_url=http://10.10.101.10:6080/vnc_auto.html novncproxy_port=6080 vncserver_proxyclient_address=10.80.80.10 vncserver_listen=10.80.80.10 # Network settings network_api_class=nova.network.neutronv2.api.API neutron_url=http://10.80.80.10:9696 neutron_auth_strategy=keystone neutron_admin_tenant_name=service neutron_admin_username=neutron neutron_admin_password=openstack neutron_admin_auth_url=http://10.80.80.10:35357/v2.0 libvirt_vif_driver= nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver linuxnet_interface_driver= nova.network.linux_net.LinuxOVSInterfaceDriver #If you want Quantum + Nova Security groups firewall_driver=nova.virt.firewall.NoopFirewallDriver security_group_api=neutron 第 2 章 OpenStack 的安装 51 #If you want Nova Security groups only, comment the two lines above and uncomment line -1-. #-1-firewall_driver= nova.virt.libvirt.firewall.IptablesFirewallDriver #Metadata service_neutron_metadata_proxy = True neutron_metadata_proxy_shared_secret = openstack metadata_host = 10.80.80.10 metadata_listen = 0.0.0.0 metadata_listen_port = 8775 # Compute # #compute_driver=libvirt.LibvirtDriver # Cinder # volume_api_class=nova.volume.cinder.API osapi_volume_listen_port=5900 # Quota # quota_cores=5 quota_floating_ip3=3 quota_gigabytes=20 quota_driver=nova.quota.DbQuotaDriver quota_instances=5 quota_key_pairs=2 quota_ram=51200 quota_volumes=2 2)创建并初始化 Nova 数据库,命令如下: # mysql -uroot -p -e "CREATE DATABASE nova;" 因为 Nova 数据库也需要其他节点连接,所以必须赋予从 localhost 和其他节点连接的权 限,代码如下: # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON nova.* TO novauser@'%' IDENTIFIED BY 'openstack';" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON nova.* TO novauser@'localhost' IDENTIFIED BY'openstack';" 初始化 Nova 数据库的表结构: # nova-manage db sync 修改配置文件和初始化数据库后,需要重启 Nova 所有安装的服务,其代码如下: # cd /etc/init.d/; for i in $( ls nova-* ); do sudo service $i restart; done 用如下命令查看 Nova 服务的状态,:-)表示服务运行,XXX 表示服务停止。也可以查 第一部分 基 础 篇52 看 /var/log/nova 下的各个日志文件是否有出错日志。如果有出错日志和 XXX 显示,那么必 须排查错误。错误很可能出现在 nova.conf 配置文件上。在进行下一步前,必须确保服务正 常运行,其代码如下: # nova-manage service list 3)在 Keystone 中创建 Nova 用户和 Endpoint,示例如下: # keystone user-create --name=nova --pass=openstack # keystone user-role-add --user nova --role admin --tenant service # keystone service-create --name nova --type compute --description'OpenStack Compute Service' +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | OpenStack Compute Service | | id | bc4873dd598a4f23a2a61b225914efe4 | | name | nova | | type | compute | +-------------+----------------------------------+ # keystone endpoint-create --service-id bc4873dd598a4f23a2a61b225914efe4 –publicurl 'http://10.10.101.10:8774/v2/$(tenant_id)s' --adminurl 'http://10.80.80.10:8774/v2/$(tenant_id)s' --internalurl 'http://10.80.80.10:8774/v2/$(tenant_id)s' +-------------+-------------------------------------------+ | Property | Value | +-------------+-------------------------------------------+ | adminurl | http://10.80.80.10:8774/v2/$(tenant_id)s | | id | e15110d5150247ef88f126ad2ea445ed | | internalurl | http://10.80.80.10:8774/v2/$(tenant_id)s | | publicurl | http://10.10.101.10:8774/v2/$(tenant_id)s | | region | regionOne | | service_id | bc4873dd598a4f23a2a61b225914efe4 | +-------------+-------------------------------------------+ 运行 Nova 的客户端命令,列出当前可用的镜像,测试是否能正常运行,其代码如下: # nova image-list +--------------------------------------+--------------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+--------------+--------+--------+ | aae5f478-a8d4-4f56-8fb6-03c8e849f009 | myFirstImage | ACTIVE | | +--------------------------------------+--------------+--------+--------+ 6. 安装 Cinder Cinder 有三个组件服务:cinder-api、cinder-scheduler、cinder-volume。要在控制节点上 安装 cinder-api 和 cinder-scheduler,其中 cinder-api 负责接收其他组件或命令对 cinder-volume 的请求,而 cinder-scheduler 则是 Cinder 的调度程序,调度使用哪个 volume。 第 2 章 OpenStack 的安装 53 (1)安装和配置 命令如下: # apt-get install -y cinder-api cinder-scheduler 配置 Keystone 认证文件,其代码如下: # vi /etc/cinder/api-paste.ini [filter:authtoken] paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory auth_host = 127.0.0.1 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = cinder admin_password = openstack signing_dir = /var/lib/cinder/keystone-signing # vi /etc/cinder/cinder.conf [DEFAULT] rootwrap_config = /etc/cinder/rootwrap.conf api_paste_confg = /etc/cinder/api-paste.ini iscsi_helper = tgtadm volume_name_template = volume-%s volume_group = cinder-volumes verbose = True auth_strategy = keystone state_path = /var/lib/cinder lock_path = /var/lock/cinder volumes_dir = /var/lib/cinder/volumes rabbit_password = guest [database] connection = mysql://cinderuser:openstack@localhost/cinder (2)创建数据库和 Keystone 用户 创建和 cinder.conf 中 connection 变量一致的数据库用户名及密码,其代码如下: # mysql -uroot -p -e "CREATE DATABASE cinder;" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON cinder.* TO cinderuser@'localhost' IDENTIFIED BY 'openstack';" # mysql -uroot -p -e "GRANT ALL PRIVILEGES ON cinder.* TO cinderuser@'%' IDENTIFIED BY 'openstack';" 初始化数据库 cinder 表结构: # cinder-manage db sync 在 Keystone 中添加 cinder 用户和服务的 Endpoint,其代码如下: 第一部分 基 础 篇54 # keystone user-create --name=cinder --pass=openstack # keystone user-role-add --user cinder --role admin --tenant service # keystone service-create --name=cinder --type=volume --description="Cinder Volume Service" +-------------+----------------------------------+ | Property | Value | +-------------+----------------------------------+ | description | Cinder Volume Service | | id | fd43556d811a4822a615a75928d5969d | | name | cinder | | type | volume | +-------------+----------------------------------+ # keystone endpoint-create --service-id=fd43556d811a4822a615a75928d5969d --publicurl=http://10.80.80.10:8776/v1/%\(tenant_id\)s --internalurl= http://10.80.80.10:8776/v1/%\(tenant_id\)s --adminurl= http://10.80.80.10:8776/v1/%\(tenant_id\)s 重启 Cinder 服务,其代码如下: # service cinder-api restart # service cinder-scheduler restart 可以使用命令查看 Cinder 服务的状态,其代码如下: # cinder-manage service list Binary Host Zone Status State Updated At cinder-scheduler controller nova enabled :-) 2013-11-25 13:16:09 7. 安装 Horizon Horizon 是 OpenStack 的一个 Dashboard,也就是以网页形式面向用户的一个界面。通过 Horizon,用户可以很方便地使用 OpenStack,而不必使用烦琐的命令行。安装 OpenStack 的 Dashboard 的过程很简单,其命令如下: # apt-get install -y openstack-dashboard memcached 安装好以后,就可以使用 Web 浏览器了,这里建议使用 Chrome 访问 http://10.80.80.10/ horizon。此处暂时可以使用用户名 admin 和密码 OpenStack 进行登录。这个界面是 Ubuntu 包 装过的,如果想要用 Horizon 原来的界面,可以去除 Ubuntu 的界面,代码如下: # dpkg --purge openstack-dashboard-ubuntu-theme # service apache2 restart; service memcached restart 至此,可以打开 Web 浏览器,在地址栏里输入 http://10.80.80.10/horizon,其中 IP 地址 需更换成用户实际环境中的。此时,会看到 OpenStack 登录界面,使用用户名 admin 和密码 OpenStack 进行登录,如图 2-2 所示。 第 2 章 OpenStack 的安装 55 图 2-2 OpenStack 登录界面 在 Keystone 中创建 Member 角色,因为 Horizon 中会用到这个角色,其代码如下: # keystone role-create --name Member 2.1.2 网络节点的安装 网络节点主要负责虚拟机的网络控制,包括 DHCP、虚拟路由、公网访问虚拟机等。通 过软件网桥等方式控制虚拟机的网络,代替传统环境中所需要的交换机、路由器等。在这个 测试案例中,使用 Open vSwitch 作为底层的网络驱动。 1. 系统环境准备 操作系统仍旧使用 Ubuntu 12.04 LTS。网络节点需要三个网口,分别连接 network-1、 network-2、network-3,前两个网络在控制节点安装的时候定义过,而 network-3 是个新网络, 是个私有的网络,IP 网段自定义,它需要和所有的计算节点通信,因此,可以和计算节点连 在一个交换机上或者 VLAN 中。 第一部分 基 础 篇56 (1)网络 IP 设置 ‰‰ eth0 在前面定义的 network-1 网络中,这个网络连接 Internet。计算节点中的虚拟机出 入 Internet 的流量都从这里经过。 ‰‰ eth1 在前面定义的 network-2 网络中。这个接入管理网络的网口主要负责和 controller 之间的组件通信,包括所有的数据库连接、RabbitMQ 等。 ‰‰ eth2 在新定义的网络中,命名为 network-3。这个网络和所有的计算节点连接,用于 Open vSwitch 的 GRE 隧道,使得虚拟机能和网络节点通信。代码如下: # cat /etc/network/interfaces # network-1 Internet auto eth0 iface eth0 inet static address 10.10.101.11 netmask 255.255.252.0 network 10.10.100.0 broadcast 10.10.103..255 gateway 10.10.100.1 dns-nameservers 8.8.8.8 # network-2 Management auto eth1 iface eth1 inet static address 10.80.80.11 netmask 255.255.255.0 # network-3 vm auto eth2 iface eth2 inet static address 10.10.50.1 network 255.255.255.0 重启网络,命令如下: # /etc/init.d/networking restart (2)添加 Havana 的源 添加 Havana 的源,代码如下: # apt-get install -y python-software-properties # add-apt-repository cloud-archive:havana # apt-get update -y # apt-get upgrade -y # apt-get dist-upgrade -y 更新完系统之后,可以根据实际情况重启服务器。 (3)同步时间 同步时间的命令如下: 第 2 章 OpenStack 的安装 57 # apt-get install -y ntp # vi /etc/ntp.conf 编辑 ntp.conf,在控制节点的 IP 中加入下面的一行,并且放在所有“ server ntp 服务器 域名”的行之前,或者删除其他关于 server ntp 服务器的行。 server 10.80.80.10 重启 NTP 服务,命令如下: # service ntp restart 打开 IP 转发的功能,因为网络节点需要把从 vm 网络来的数据包转发到 Internet,其代 码如下。 # sysctl net.ipv4.ip_forward=1 写入配置文件,使得重启后仍旧生效,命令如下。 # vi /etc/sysctl.coof net.ipv4.ip_forward = 1 2. 安装 Open vSwitch 和 Neutron 由于采用 Open vSwitch 作为 Neutron 的 plugin 来实现底层的网络虚拟化,因此需要安装 Open vSwitch。在 Open vSwitch 中添加两个虚拟网络交换机:br-int、br-ex,其代码如下: # apt-get install -y openvswitch-switch openvswitch-datapath-dkms # ovs-vsctl add-br br-int # ovs-vsctl add-br br-ex 在网络节点,需要安装 Neutron 的大部分组件,这里安装 openvswitch-plugin 的 agent, 负责 neutron server 和 plugin 之间的相互联系,dhcp-agent 负责虚拟网络的 DHCP,l3-agent 负责虚拟网络的路由和外部连接,另外,还有 metadata-agent,其代码如下。 neutron-plugin-openvswitch-agent neutron-dhcp-agent neutron-l3-agent neutron-metadata-agent # apt-get -y install neutron-plugin-openvswitch-agent neutron-dhcp-agent neutron-l3-agent neutron-metadata-agent 3. 配置 Neutron 的 agent 1)全局配置,代码如下: # vi /etc/neutron/neutron.conf [DEFAULT] debug = True 第一部分 基 础 篇58 verbose = True rabbit_host = 10.80.80.10 # 如果修改过 rabbit 的 guest 密码,则一定要修改下面一行 rabbit_password = guest 2)Open vSwitch 的 plugin 配置文件,代码如下: # vi /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini [OVS] tenant_network_type = gre enable_tunneling = True tunnel_type = gre tunnel_id_ranges = 1:1000 integration_bridge = br-int tunnel_bridge = br-tun local_ip = 10.10.50.1 [securitygroup] firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver [database] connection = mysql://neutronuser:openstack@10.80.80.10/neutron 重启服务,命令如下: # service neutron-plugin-openvswitch-agent restart 3)对 metadata-agent 进行配置,命令如下: # vi /etc/neutron/metadata_agent.ini [DEFAULT] debug = True auth_url = http://10.80.80.10:5000/v2.0 auth_region 必须和Keystone 中 Neutron 服务的endpoint 一致,默认配置文件里是 RegionOne,而 Keystone 建立 endpoint 时如果不命名,默认是 regionOne,这一个大 小写问题曾经让笔者在研究 metadata 上花了一个下午的时间。 auth_region = regionOne admin_tenant_name = service admin_user = neutron admin_password = openstack nova_metadata_ip = 10.80.80.10 nova_metadata_port = 8775 metadata_proxy_shared_secret = openstack 注意 第 2 章 OpenStack 的安装 59 重启服务,命令如下: # service neutron-metadata-agent restart 4)对 dhcp-agent 进行配置,命令如下: # vi [DEFAULT] debug = True interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq enable_metadata_network = True 重启服务,命令如下: # service neutron-dhcp-agent restart 5)对 l3-agent 进行配置,命令如下: # vi [DEFAULT] debug = True interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver external_network_bridge = br-ex 重启服务,命令如下: # service neutron-l3-agent restart 使用“ neutron agent-list”命令可以验证目前的 Neutron 服务。记住,运行命令前必须先 导入用户凭证。 4. 设置 br-ex 虚拟网络 前面已经创建了一个 br-ex 的虚拟交换机,使用命令 ifconfig 可以看到这个网口。这个虚 拟网络是在 l3-agent 的配置里设置的,简单来说,是用于虚拟机和 Internet 之间通信的,因 此,需要把网络节点上连接 Internet 的 eth0 接入到这个 br-ex 的虚拟交换机上。 运行下面这条命令后, eth0 网络会断掉,需确保在配置的时候是通过管理网络接入 的,或者是直接在 console 上执行的。 # ovs-vsctl add-port br-ex eth0 在 /etc/network/interfaces 中把 eth0 的网络配置进行修改,如下所示: auto eth0 iface eth0 inet manual 提示 第一部分 基 础 篇60 up ifconfig $IFACE 0.0.0.0 up up ip link set $IFACE promisc on down ip link set $IFACE promisc off down ifconfig $IFACE down 如果需要让网络节点配置一个可以从这个网络访问的地址,那么可以把原来的 eth0 的地 址配置在 br-ex 网口上。 2.1.3 计算节点的安装 计算节点主要负责运行虚拟机。在这个测试案例中,使用 KVM 作为底层的虚拟化技 术,OpenStack 采用 libvirt 库来管理 KVM。网络使用 Open vSwitch 来和其他计算节点及网 络节点通信。在计算节点上,需要安装以下几个部分: ‰‰ Open vSwitch ‰‰ neutron-plugin-openvswitch-agent ‰‰ nova-compute ‰‰ open-iscsi 1. 系统环境准备 操作系统仍旧使用 Ubuntu 12.04 LTS。网络节点需要两个网口,分别连接 network-2 和 network-3。 1)网络 IP 设置如下: # cat /etc/network/interfaces # network-2 Management auto eth1 iface eth1 inet static address 10.80.80.12 netmask 255.255.255.0 # network-3 vm auto eth2 iface eth2 inet static address 10.10.50.2 network 255.255.255.0 ‰‰ eth1 在前面定义的 network-2 网络中。这个接入管理网络的网口主要负责和 controller 之间的组件通信,包括所有的数据库连接、RabbitMQ 等。 ‰‰ eth2 在前面定义的 network-3 网络中。这个网络和所有计算节点连接,用于 Open vSwitch 的 GRE 隧道,使得虚拟机能和网络节点通信。 重启网络,命令如下: # /etc/init.d/networking restart 第 2 章 OpenStack 的安装 61 2)添加 Havana 的源,其代码如下: # apt-get install -y python-software-properties # add-apt-repository cloud-archive:havana # apt-get update -y # apt-get upgrade -y # apt-get dist-upgrade -y 更新完系统之后,可以根据实际情况重启服务器。 因为计算节点使用时是不需要公网连接的,也不应该有公网连接,只在安装更新软件 时需要连接公共网络,所以可以先保证用户的一个网口可以从公网下载安装软件包, 等安装完之后再恢复成内网。 3)同步时间,代码如下: # apt-get install -y ntp # vi /etc/ntp.conf 编辑 ntp.conf,在控制节点的 IP 中加入下面一行,并且放在所有“ server ntp 服务器域 名”的行之前,或者删除其他关于 server ntp 服务器的行。 server 10.80.80.10 重启 NTP 服务,代码如下: # service ntp restart 2. 安装 Open vSwitch 和 Neutron 的 plugin 接下来安装 Open vSwitch 和 Neutron 的 plugin,命令如下: # apt-get install -y openvswitch-switch openvswitch-datapath-dkms 创建一个用于和内部虚拟机通信的虚拟网络交换机,命令如下: # ovs-vsctl add-br br-int # apt-get install -y neutron-plugin-openvswitch-agent 修改配置文件,除了 local_ip 需要填入计算节点本机的 network-3 网络的 IP 之外基本上 和网络节点的一样。其代码如下: # vi /etc/neutron/neutron.conf [DEFAULT] debug = True verbose = True rabbit_host = 10.80.80.10 # 如果修改过 rabbit 的 guest 密码,则一定要修改下面一行 提示 第一部分 基 础 篇62 rabbit_password = guest # vi /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini [OVS] tenant_network_type = gre enable_tunneling = True tunnel_type = gre tunnel_id_ranges = 1:1000 integration_bridge = br-int tunnel_bridge = br-tun local_ip = 10.10.50.2 [securitygroup] firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver [database] connection = mysql://neutronuser:openstack@10.80.80.10/neutron 重启服务,命令如下: # service neutron-plugin-openvswitch-agent restart 3. 安装 KVM 的虚拟机计算支持 安装 KVM 的虚拟机计算支持命令如下: # apt-get install -y nova-compute-kvm 编辑配置文件,加入认证,代码如下: # vi /etc/nova/api-paste.ini [filter:authtoken] paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory auth_host = 10.80.80.10 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = nova admin_password = openstack signing_dir = /var/lib/nova/keystone-signing auth_version = v2.0 配置 Nova 文件,可以从控制节点把 nova.conf 文件的内容复制过来,然后进行修改,主 要修改一些涉及 IP 的地方,其代码如下: # vi /etc/nova/nova.conf [DEFAULT] logdir=/var/log/nova state_path=/var/lib/nova lock_path=/run/lock/nova verbose=True 第 2 章 OpenStack 的安装 63 debug=True api_paste_config=/etc/nova/api-paste.ini compute_scheduler_driver=nova.scheduler.simple.SimpleScheduler rabbit_host=10.80.80.10 rabbit_password=guest nova_url=http://10.80.80.10:8774/v1.1/ sql_connection=mysql://novauser:openstack@10.80.80.10/nova root_helper=sudo nova-rootwrap /etc/nova/rootwrap.conf enabled_apis=ec2,osapi_compute,metadata # Auth use_deprecated_auth=false auth_strategy=keystone # Imaging service glance_api_servers=10.80.80.10:9292 image_service=nova.image.glance.GlanceImageService # Vnc configuration novnc_enabled=true novncproxy_base_url=http://10.10.101.10:6080/vnc_auto.html novncproxy_port=6080 vncserver_proxyclient_address=10.80.80.12 vncserver_listen=10.80.80.12 # Network settings network_api_class=nova.network.neutronv2.api.API neutron_url=http://10.80.80.10:9696 neutron_auth_strategy=keystone neutron_admin_tenant_name=service neutron_admin_username=neutron neutron_admin_password=openstack neutron_admin_auth_url=http://10.80.80.10:35357/v2.0 libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver linuxnet_interface_driver=nova.network.linux_net.LinuxOVSInterfaceDriver #If you want Quantum + Nova Security groups firewall_driver=nova.virt.firewall.NoopFirewallDriver security_group_api=neutron #If you want Nova Security groups only, comment the two lines above and uncomment line -1-. #-1-firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver #Metadata service_neutron_metadata_proxy = True neutron_metadata_proxy_shared_secret = openstack # Compute # #compute_driver=libvirt.LibvirtDriver # Cinder # 第一部分 基 础 篇64 volume_api_class=nova.volume.cinder.API osapi_volume_listen_port=5900 # Quota # quota_cores=5 quota_floating_ip3=3 quota_gigabytes=20 quota_driver=nova.quota.DbQuotaDriver quota_instances=5 quota_key_pairs=2 quota_ram=51200 quota_volumes=2 设置 qemu 的 cgroup 文件,代码如下: # vi /etc/libvirt/qemu.conf cgroup_device_acl = [ "/dev/null", "/dev/full", "/dev/zero", "/dev/random", "/dev/urandom", "/dev/ptmx", "/dev/kvm", "/dev/kqemu", "/dev/rtc","/dev/hpet", "/dev/vfio/vfio", "/dev/net/tun" ] 重启 libvirt 服务和 nova-compute 服务,命令如下: # service libvirt-bin restart # service nova-compute restart 2.1.4 块存储节点的安装 块存储节点负责提供 volume(云硬盘)。Cinder 服务可以在块存储上创建 volume,以块 存储的形式通过 iSCSI 提供给计算节点,计算节点使用底层的 libvirt 库把 volume 块存储挂载 给虚拟机使用。 在控制节点上已经安装了 cinder-api 和 cinder-scheduler,在真正的块存储节点上需要 安装 cinder-volume 的服务,它调度相应程序,在节点上创建或删除 volume,并更新维护 volume 在数据库中的状态。cinder-volume 可以使用多种后端来创建块存储,最简单的方式是 使用 LVM(使用一个 vg,然后在这个 vg 上创建 lv 作为 volume)。我们在测试中也使用 LVM 的后端。 1. 系统环境准备 操作系统仍旧使用 Ubuntu 12.04 LTS。网络节点需要一个网口,即 network-2。这个网 络除了和控制节点进行 Rabbit MQ、MySQL 数据通信之外,还和计算节点进行 iSCSI 的数 据通信。在实际环境中,所有的虚拟机和云硬盘数据都通过这个网络,可能造成虚拟机读写 volume 的瓶颈问题,因此,可以考虑使用单独的网络和计算节点连接,必要时可以采取网口 第 2 章 OpenStack 的安装 65 绑定或采用 10Gbit/s 网络。 1)进行网络 IP 设置,代码如下: # cat /etc/network/interfaces auto eth1 iface eth1 inet static address 10.80.80.13 netmask 255.255.255.0 笔者这样设置是不能连接外网的,但由于需要安装软件,因此读者可以先用其他能连接 Internet 的网络代替。 2)重启网络,命令如下: # /etc/init.d/networking restart 3)添加 Havana 的源,代码如下: # apt-get install -y python-software-properties # add-apt-repository cloud-archive:havana # apt-get update -y # apt-get upgrade -y # apt-get dist-upgrade -y 更新完系统之后,可以根据实际情况重启服务器。 4)同步时间,代码如下: # apt-get install -y ntp # vi /etc/ntp.conf 编辑 ntp.conf,在控制节点的 IP 中加入下面的一行,并且放在所有“ server ntp 服务器 域名”的行之前,或者删除其他关于 server ntp 服务器的行。 server 10.80.80.10 2. 安装配置 cinder-volume 因为使用 LVM 作为后端,所以必须安装 lvm2 包。安装命令如下: # apt-get install lvm2 确保系统中有除了安装系统所在的盘之外的一块单独的硬盘或者使用 RAID 做的盘。可 以使用命令 fdisk-l 查看。在笔者的环境中,系统安装在 /dev/sda 中,笔者有额外的一块硬盘 /dev/sdb,用它创建一个 vg,命名为 cinder-volume,其代码如下: # pvcreate /dev/sdb # vgcreate cinder-volumes /dev/sdb 安装 cinder-volume 组件和相关的包,命令如下: 第一部分 基 础 篇66 # apt-get -y install cinder-volume python-mysqldb 配置 cinder.conf 文件,这个文件和控制节点的 cinder.conf 文件大致相同,唯一不同的是 需要改变 rabbit_host 参数和数据库的 connection 参数,把其中的 IP 都设置成控制节点的 IP, 而在控制节点上的配置文件中,这两个参数的 IP 可以是 localhost。其代码如下: # vi /etc/cinder/cinder.conf [DEFAULT] rootwrap_config = /etc/cinder/rootwrap.conf api_paste_confg = /etc/cinder/api-paste.ini iscsi_helper = tgtadm volume_name_template = volume-%s volume_group = cinder-volumes debug = True verbose = True auth_strategy = keystone state_path = /var/lib/cinder lock_path = /var/lock/cinder volumes_dir = /var/lib/cinder/volumes rabbit_host = 10.80.80.10 rabbit_password = C1oud-open [database] connection = mysql://cinderuser:OPenstack@10.80.80.10/cinder 重启服务,命令如下: # service cinder-volume restart 全部完成之后,可以在控制节点上运行命令cinder-manage service list,查看cinder- volume 服务是否正常运行。 2.2 在 Ubuntu 上使用源代码编译安装 对于各个版本的 Linux 来说,都会制作 OpenStack 相应的软件包。虽然在 2.1 节中介 绍了二进制包安装,但是在这里笔者还是会讲一下源代码安装 OpenStack 基本组件的过 程,因为从学习的角度来说,通过源代码安装 OpenStack 各个组件的过程,可以使读者对 OpenStack 的框架和各个组件的作用有一个比使用二进制安装更全面的了解。另一个好处是, 二进制包的发布会滞后于源代码,如果想在第一时间尝试一些最新的功能或修复 Bug 后的版 本,源代码安装是个不错的选择。当然,源代码安装比二进制包安装复杂,有一定的难度, 并且要用户自己去解决一些依赖问题。 在本节中,将会介绍如何使用源代码方式安装Keystone、Glance、Nova、Neutron、 Cinder 和 Horizon 组 件。OpenStack 各个项目的代码都可以在GitHub(https://github.com/ 第 2 章 OpenStack 的安装 67 openstack)上获取。在接下来的安装过程中,笔者按照 1 个 controller 节点、1 个 network 节 点、1 个 compute 节点、1 个 volume 节点的架构来部署。因为其架构方式和二进制安装一样, 所以一些基础配置,如每个节点的 IP 设置、NTP 配置等,在本节中跳过。本节使用的操作 系统依旧是 Ubuntu 12.04 LTS 版本。 2.2.1 控制节点的安装 在 controller 节点上计划部署如下组件: ‰‰ RabbitMQ ‰‰ PostgreSQL ‰‰ Keystone ‰‰ Glance ‰‰ Neutron ‰‰ Nova 中除去 nova-compute 的其他组件 ‰‰ Horizon controller 上各个组件负责的功能与使用二进制包安装时的一样。在本节中,如果没有特 殊说明,那么与 2.1 节中介绍的架构一样,只是安装方式上有些区别。 1. 前置准备 首先进行 IP 配置,以及 RabbitMQ、NTP 的安装配置,可参考 2.1 节相关内容。 使用 PostgreSQL 作为 OpenStack 的后端数据库。如果需要一个稳定的开源数据库,那 么 PostgreSQL 可以优先考虑。此外,需要安装 Python 访问 PostgreSQL 时用的 psycopg2,这 是目前流行的 PostgreSQL 的 Python 连接库。命令如下: # apt-get install postgresql postgresql-client # apt-get install python-sqlalchemy python-psycopg2 创建一个数据库用户 openstackdbadmin,设置密码为 openstack123。这个用户将作为各 个组件连接数据库的唯一用户。示例代码如下: # su - postgres $ psql postgres=# CREATE USER openstackdbadmin with password 'openstack123'; postgres=# \q 在二进制包安装的时候使用 root 用户,并且安装的时候会把配置文件配置成特定的用户 组属性,不需要手动干预。但是在使用源代码安装的时候,必须处理好这些文件的用户组属 性关系。在本节中,笔者将会以 openstack 这个用户的身份去安装、配置、启动服务。首先 建立一个称为 openstack 的用户,并且加入到 sudo 组,让其有使用 sudo 的权限。命令如下: 第一部分 基 础 篇68 # useradd -m openstack # usermod -G sudo openstack 接下来的包都会放在 openstack 这个用户的主目录下,在这里是 /home/openstack 除非特殊说明,否则本节其余操作都是在 openstack 这个用户下执行。 下载需要用到的 Git 工具的源代码,在 Ubuntu 下安装,命令如下: $ sudo apt-get install git 对于学习源代码安装的一个较好的,也是官方的方法就是阅读 OpenStack 开发人员 写的一套安装脚本,我们称之为DevStack,其源代码在GitHub 上维护(https://github. com/openstack-dev/devstack)。这个项目的初衷是让开发人员能够快速建立一个完整的 OpenStack 开发环境,该项目由 Rackspace 的团队创建,并且由 OpenStack 的开发社区维 护,它的脚本更新速度应该是最接近于 OpenStack 开发的,一些新的功能在脚本中都会更 新体现出来。无论是开发人员还是系统运维工程师,这个脚本都是学习 OpenStack 的一个 重要资源。后面的安装也是基于这个脚本的,会用到里面的一些文件,因此,首先需要下 载该项目脚本的代码: $ git clone https://github.com/openstack-dev/devstack 源代码安装和二进制包安装的区别主要体现在几个方面,如果读者能把握住哪些是不 同的,哪些是相同的,那么学会二进制包安装后,源代码安装的学习就会相对容易点。第一 个区别是安装的软件包不同。在二进制包中,各个 Linux 发行平台已经把 OpenStack 组件中 每个软件打成相应的包,其中包括运行组件所需的很多依赖包。而源代码安装方式,除了安 装 OpenStack 社区发布的组件包外,还需要手动安装那些组件所需要的依赖包。能否完全正 确地安装好依赖包是要解决的一个关键问题。第二个区别体现在配置文件上。二进制包安 装好后,都会在 /etc 下建立好所需的配置文件。而源代码安装需要自己去建立相关目录。第 三个区别是启动问题。在二进制包安装好后,往往都配置成了相应 Linux 系统版本的启动方 式,譬如使用 service 启动。而源代码安装方式,需要自己写启动脚本,每个人的启动脚本 和方式都不一样,因人而异。还有一些小的区别就是源代码安装需要建立用户,自己设置 OpenStack 组件的安装路径、用户、权限,手动建立一些必要的目录等。至于两者相同的地 方,很明显就是数据库,以及配置文件中的参数。 OpenStack 各个组件的配置文件都会放在/etc 下的各个目录中,包括nova、glance、 keystone、neutron 等。这样做是为了统一规范每个组件的配置目录,方便管理。这里介绍一 下安装的思路。一般情况下,在 /etc 下建立组件的目录,设置为用户的权限,在各个组件的 源代码中也有相应的 etc 目录,其中包括需要用到的配置文件。把要用的配置文件从源代码 目录复制到 /etc 下组件的目录中,然后编辑 /etc 下相应的配置文件。安装的思路是首先确保 提示 第 2 章 OpenStack 的安装 69 每个组件需要的依赖包已经安装,然后在源代码的第一层目录,执行 Python 的安装命令。这 样一个组件就安装好了。 2. 安装部署 Keystone 首先下载 Keystone 源代码,并且切换到 Havana 版本的稳定分支: $ git clone https://github.com/openstack/keystone $ cd keystone $ git checkout stable/havana 在 /etc 下建立名为 keystone 的目录。设置属主为用户 openstack。从下载的 Keystone 源 代码中把 /etc 下的配置文件复制到 /etc/keystone 下,其代码如下: $ sudo mkdir /etc/keystone $ sudo chown openstack:openstack /etc/keystone $ cd ~/keystone/etc $ cp -p keystone.conf.sample /etc/keystone/keystone.conf $ cp -p policy.json /etc/keystone/ Keystone 有许多配置选项,这也是 OpenStack 一个比较大的特点。OpenStack 会尽量支 持更多的,同时比较流行的一些开源软件来完成类似功能。由于不同的开源软件有自身的特 点和功能,因此 OpenStack 可给用户比较多的选择余地,用户可根据自身的情况选择适合的 方式。在 Keystone 中,选择存放认证数据(包括用户、密码等数据)的方式时,可以选择 LDAP、数据库。在这里我们把用得比较多,同时也比较容易上手的 MySQL 数据库作为存放 数据的方式。在认证方式上,Keystone 可以使用原有的 UUID 的方式,也可以选择后来加入 的 PKI 方式来增强安全性。在本节中,会介绍一些使用广泛的配置,其他更多内容可以从第 5 章获取。需要配置 keystone.conf 以下主要的选项: [DEFAULT] admin_token = openstack bind_host = 0.0.0.0 public_port = 5000 admin_port = 35357 debug = True verbose = True log_file = keystone.log log_dir = /var/log/keystone [sql] connection = postgres://openstackdbadmin:openstack123@localhost/keystone [identity] driver = keystone.identity.backends.sql.Identity [catalog] 第一部分 基 础 篇70 driver = keystone.catalog.backends.sql.Catalog [token] driver = keystone.token.backends.kvs.Token [signing] token_format = PKI 初始化 Keystone,首先要创建 Keystone 所用的数据库,以及一些配置文件中用到的目 录,然后初始化 Keystone 用的 PKI。 需要创建不存在的目录,用来存放 Keystone 日志,可在 keystone.conf 中定义,其代码如下: $ sudo mkdir /var/log/keystone $ sudo chown openstack:openstack /var/log/keystone 需要创建不存在的目录,用来存放 Keystone 使用 PKI 的相关文件,其代码如下: $ sudo mkdir /var/cache/keystone $ sudo chown openstack:openstack /var/cache/keystone 创建 Keystone 所用的数据库,代码如下: $ sudo su - postgres $ psql postgres=# CREATE DATABASE keystone; postgres=# GRANT ALL PRIVILEGES ON DATABASE keystone TO openstackdbadmin; postgres=# \q 切记要退出 postgres 用户,返回到 OpenStack 用户环境中,其代码如下: postgres$ exit 进入 devstack 项目的目录,因为要用到里面的一些文件。 $ cd ~ /devstack/files/apts 在 devstack 项目中,开发人员告诉了我们需要安装哪些前置依赖的和需要使用的第三方 的软件包,这里需要安装 general 和 keystone,其代码如下: $ for i in'cut -f1 -d" " general keystone'; do sudo apt-get install -y $i; done Keystone 需要用到 passlib 软件包,使用 PKI 时必须安装,其代码如下: $ sudo pip install passlib 安装 Keystone 组件,其代码如下: $ cd ~ /keystone $ sudo python setup.py develop 进入 Keystone 目录,其代码如下: 第 2 章 OpenStack 的安装 71 $ cd ~/keystone $ bin/keystone-manage db_sync $ bin/keystone-manage pki_setup 下面开始安装 Keystone Client。Keystone Client 是一个使用 Keystone 的命令行接口工 具,和 Dashboard 一样,它能完成大部分的日常操作。熟悉和熟练使用命令行工具对维护 OpenStack 及其每一个组件是非常重要的,系统管理员 90% 的工作是通过 Client 命令行完成 的,而不是通过 Dashboard。 切记退回到 OpenStack 的 home 目录,所有组件的顶层都在用户 home 目录下,其代码如下: $ cd $ git clone https://github.com/openstack/python-keystoneclient $ cd python-keystoneclient 在安装的过程中,如果出现依赖包安装报错的情况,可根据出错的 Python 软件包的 URL 进行手动下载,并进行安装,然后返回安装 Keystone Client,其代码如下: $ sudo python setup.py develop 3. 使用 tmux 启动 Keystone 至此,已经安装好了Keystone 服务和命令行下的Keystone Client。接下来要启动 Keystone 进程。我们是通过源代码方式来安装 Keystone 的,没有配置成 Ubuntu 服务管理程 序,因此,不能像二进制包方式安装后那样,通过命令“ service keystone start”来启动,而 是需要直接运行 Keystone 的可执行文件,并加上一些配置文件的参数。 $ cd ~ /keystone 可执行文件都放在 bin 目录下。--config-file 参数指明了 Keystone 的配置文件路径。 $ bin/keystone-all --config-file /etc/keystone/keystone.conf 启动完成后,是不是发现什么输出也没有,Shell 也不会返回提示符?而一旦关掉 SSH 窗口或按 + 组合键后,Keystone 进程就结束了。是不是应该把这个程序放在后 台运行呢?这里要用到终端复用软件 tmux。tmux 是一个类似于 screen 的软件,采用 BSD 授权。Ubuntu 12.04 下默认安装了这个优秀的软件,在这里仅简单地使用它来打开一个会 话。退出前面创建的 Keystone 进程,不要怕,因为我们已经学会如何启动 Keystone 了。用 + 组合键中断刚才创建的 Keystone 进程,当然也可以再开启一个终端会话窗口, 用命令 kill 结束 Keystone 进程。 在下面这行代码中,new-session 打开一个新的会话,-s 给这个会话命名为 keystone,按 回车键之后可以看到一个空白的新的会话。 $ tmux new-session -s keystone 第一部分 基 础 篇72 执行启动 Keystone 的命令,代码如下: $ bin/keystone-all --config-file /etc/keystone/keystone.conf 读者可能会发现,这里介绍的内容看上去和前面介绍的内容差不多。然后先按住 键不放,然后再按 键,退出刚才新建的会话。是不是又返回到我们新建会话之 前的窗口了?现在使用命令“ps aux | grep keystone”,查看一下 Keystone 的进程是否还存在。 不存在的话记得发邮件告诉笔者。现在回到 tmux,在源代码安装时会多次使用 tmux,使用 下面的命令可列出将会用到的和 tmux 相关的命令。 $ tmux new-session -s name 列出当前存在的所有的 tmux 会话,代码如下: $ tmux list-sessions 返回会话名为 name 的会话,代码如下: $ tmux attach-session -t name 现在可以使用命令“ tmux attach-session -t keystone”回到刚才创建的 Keystone 会话中。 tmux 还有很多参数和命令,可以使用命令“man tmux”查看。 接下来是关于使用 Keystone 的内容,包括创建用户等,都和二进制包安装方式一样,读 者可以参考 2.1 节的相关内容。 4. 安装部署 Glance 安装 Glance 的思路和过程与安装 Keystone 类似,大致的过程可以分为下载源代码、安 装依赖软件包、安装 Glance 和 Glance Client、编辑 Glance 的配置文件等。 将 OpenStack 的数据目录放在/data 下,包括Glance 的镜像和Nova 的虚拟机 等。读者需要自己建立这个目录,并且确保这个目录足够大能满足用户环境所需 的大小。 在安装过程中,确保这个目录所在的文件系统的可用空间有 50GB,涉及的命令如下: $ cd $ git clone https://github.com/openstack/glance $ cd glance $ git checkout stable/havana 安装 Glance 组件所需要的依赖软件,命令如下: $ cd ~/devstack/files/apts $ for i in ` cut -f1 -d" " glance`; do sudo apt-get install -y $i; done 提示 第 2 章 OpenStack 的安装 73 安装 Glance 组件,代码如下: $ cd ~/glance $ sudo python setup.py develop 创建用来存放 Glance 配置文件的目录,和 Keystone 一样,也是放在 /etc 下,其代码如下: $ sudo mkdir -p /etc/glance $ sudo chown openstack:openstack $ cd ~/glance $ cp etc/glance-registry.conf /etc/glance/ $ vi /etc/glance/glance-registry.conf [DEFAULT] verbose = True debug = True bind_host = 0.0.0.0 bind_port = 9191 log_file = /var/log/glance/registry.log sql_connection = connection = postgres://openstackdbadmin:openstack123@ localhost/glance [paste_deploy] flavor = keystone [keystone_authtoken] auth_host = 127.0.0.1 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = openstack signing_dir = /var/cache/glance/registy $ cp etc/glance-api.conf /etc/glance/ $ vi /etc/glance/glance-api.conf [DEFAULT] verbose = True debug = True default_store = file bind_host = 0.0.0.0 bind_port = 9292 log_file = /var/log/glance/api.log filesystem_store_datadir = /data/glance/images/ image_cache_dir = /var/cache/glance/ sql_connection = connection = postgres://openstackdbadmin:openstack123@localhost/glance [paste_deploy] flavor = keystone+cachemanagement [keystone_authtoken] auth_host = 127.0.0.1 第一部分 基 础 篇74 auth_port = 35357 auth_protocol = http admin_tenant_name = service admin_user = glance admin_password = openstack signing_dir = /var/cache/glance/api 以上给出的是配置文件中需要修改和注意的部分,其他没有列出的按照默认设置即 可,不要删除其他在这里没有列出的配置项。以下给出的配置也是如此。 建立专门的 Glance 目录用来存放镜像文件和镜像缓存,代码如下: $ sudo mkdir /data/glance $ sudo chown -R openstack:openstack /data/glance $ mkdir -p /data/glance/images $ mkdir -p /data/glance/cache $ cp -p etc/glance-regisgry-paste.ini /etc/glance/ $ cp -p etc/glance-api-paste.ini /etc/glance/ $ cp -p etc/glance-cache.conf /data/glance/cache/ $ vi /data/glance/cache/glance-cache.conf [DEFAULT] verbose = True debug = True filesystem_store_datadir = /data/glance/images/ image_cache_dir = /data/glance/cache/ auth_url = http://127.0.0.1:5000/v2.0/ admin_tenant_name = service admin_user = glance admin_password = openstack $ cp -p etc/policy.json /etc/glance/ 在 PostgreSQL 中建立数据库 glance,代码如下: $ sudo su - postgres $ psql postgres=# CREATE DATABASE glance; postgres=# GRANT ALL PRIVILEGES ON DATABASE glance TO openstackdbadmin; postgres=# \q postgres$ exit 初始化数据库 glance 中的表结构,代码如下: $ bin/glance-manage db_sync $ sudo mkdir -p /var/cache/glance/api $ sudo chown openstack:openstack /var/cache/glance/api $ sudo mkdir -p /var/cache/glance/registry $ sudo chown openstack:openstack /var/cache/glance/registry $ sudo mkdir /var/log/glance $ sudo chown openstack:openstack /var/log/glance 注意 第 2 章 OpenStack 的安装 75 下面安装 Glance Client,代码如下: $ cd && git clone https://github.com/openstack/python-glanceclient $ cd python-glanceclient && sudo python setup.py develop 5. 启动 Glance Glance 服务包括glance-registry 和 glance-api,需要分别启动这两个服务进程。同启动 Keystone 一样,使用 tmux 来建立两个新会话,分别命名为 glance-registry 和 glance-api。命令如下: $ cd ~/glance $ tmux -c "bin/glance-registry --config-file=/etc/glance/glance-registry.conf" $ tmux -c "bin/glance-api --config-file=/etc/glance/glance-api.conf" 6. 安装部署 Nova 首先下载 Nova 源代码,并且切换到 Havana 版本的稳定分支: $ cd $ git clone https://github.com/openstack/nova $ cd nova $ git checkout stable/havana 安装 Nova 组件所需要的依赖软件,代码如下: $ cd ~/devstack/files/apts $ for i in ` cut -f1 -d" " nova`; do sudo apt-get install -y $i; done 安装 Nova 组件,代码如下: $ cd ~/nova $ sudo python setup.py develop 安装 Nova Client,代码如下: $ cd && git clone https://github.com/openstack/python-novaclient $ cd python-novaclient && sudo python setup.py develop 配置 Nova,主要是建立一些必要的目录,把配置文件从源代码目录中复制到 /etc 下, 设置用户的 sudo 权限等,其代码如下: $ cd ~/nova $ sudo mkdir /etc/nova $ sudo chown openstack:openstack /etc/nova $ cp etc/nova/policy.json /etc/nova/ $ cp etc/nova/api-paste.ini /etc/nova/ $ cp etc/nova/nova.conf.sample /etc/nova/nova.conf $ mkdir -m 755 /etc/nova/rootwrap.d $ cp etc/nova/rootwrap.d/*.filters /etc/nova/rootwrap.d $ sudo chown -R root:root /etc/nova/rootwrap.d 第一部分 基 础 篇76 $ sudo chmod 644 /etc/nova/rootwrap.d/* $ cp etc/nova/rootwrap.conf /etc/nova $ sed -e "s:^filters_path=.*$:filters_path=/etc/nova/rootwrap.d:" -i /etc/nova/ rootwrap.conf $ sudo chown root:root /etc/nova/rootwrap.conf $ sudo chmod 0644 /etc/nova/rootwrap.conf $ sudo vi /etc/sudoers.d/nova-rootwrap 把以下内容添加到 nova-rootwrap 文件中。 openstack ALL=(root) NOPASSWD: /usr/local/bin/nova-rootwrap /etc/nova/rootwrap.conf * $ sudo chmod 0440 /etc/sudoers.d/nova-rootwrap $ sudo mkdir -p /var/nova $ sudo chown openstack:openstack /var/cache/nova $ sudo mkdir -p /data/nova $ sudo chown -R openstack:openstack /data/nova $ mkdir /data/nova/keys $ sudo mkdir /var/log/nova $ sudo chown -R openstack:openstack /var/log/nova 下载 noVNC,因为 noVNC 不是 OpenStack 项目的组件,所以需要去 noVNC 的项目网 站下载。 $ cd && git clone https://github.com/kanaka/noVNC.git 接下来就是编辑配置文件,可参照 2.1 节相关内容。注意,把 nova.conf 中的 state_path 参数改成现在的 /data/nova,数据库改成使用 PostgreSQL 的格式。配置文件完成之后,使用 命令 nova-manage 运行“db sync”同步一下。 7. 启动 Nova 服务 启动 Nova 的服务同样使用 tmux,可参照 Glance 和 Keystone 的使用方式。启动的服务 与二进制包安装方式一样,代码如下: $ cd ~/nova $ tmux -c "bin/nova-api --config-file=/etc/nova/nova.conf" $ tmux -c "bin/nova-conductor --config-file=/etc/nova/nova.conf" $ tmux -c "bin/nova-cert --config-file=/etc/nova/nova.conf" $ tmux -c "bin/nova-scheduler --config-file=/etc/nova/nova.conf" $ tmux -c "bin/nova-novncproxy --config-file=/etc/nova/nova.conf --web ~/noVNC" $ tmux -c "bin/nova-consoleauth --config-file=/etc/nova/nova.conf" 8. 安装配置 neutron-server 安装 neutron-server 的方式和前面介绍的 Keystone、Nova、Glance 类似,主要思路是: 下载源代码、安装源代码、建立 Neutron 和 Open vSwitch plugin 的目录并且设置权限、复制 源代码中的配置文件到相应的目录中、设置 rootwrap 配置文件。剩下的和前几节类似,即修 第 2 章 OpenStack 的安装 77 改配置文件内容、建立数据库、启动服务,这部分内容不再赘述。其代码如下: $ cd $ git clone https://github.com/openstack/neutron $ cd devstack/files/apts $ for i in ` cut -f1 -d" " neutron`; do sudo apt-get install -y $i; done $ cd ~/neutron $ git checkout stable/havana $ sudo python setup.py develop $ sudo mkdir/etc/neutron $ sudo chown openstack:openstack /etc/neutron $ cd && cp etc/neutron.conf /etc/neutron $ mkdir -p /etc/neutron/plugins/openvswitch $ cp etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini /etc/neutron/plugins/ openvswitch/ $ sudo mkdir /var/lib/neutron $ sudo chown openstack:openstack /var/lib/neutron $ mkdir -p -m 755 /etc/neutron/rootwrap.d $ cp -pr etc/neutron/rootwrap.d/* /etc/neutron/rootwrap.d/ $ sudo chown -R openstack:openstack /etc/neutron/rootwrap.d $ sudo chmod 644 /etc/neutron/rootwrap.d/* $ cp etc/rootwrap.conf /etc/neutron/ $ sudo chown root:root /etc/neutron/rootwrap.conf $ sudo chmod 0644 /etc/neutron/rootwrap.conf $ sudo vi /etc/sudoers.d/neutron-rootwrap 把下面第一行代码加入到 neutron-rootwrap 文件中,接着执行余下命令。 openstack ALL=(root) NOPASSWD: /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf * $ sudo chmod 0440 /etc/sudoers.d/neutron-rootwrap $ sudo chown root:root /etc/sudoers.d/neutron-rootwrap $ cp etc/api-paste.ini /etc/neutron/ $ cp etc/policy.json /etc/neutron/ $ sudo mkdir /var/cache/neutron $ sudo chown openstack:openstack /var/cache/neutron $ cd ~/neutron $ tmux -c "bin/neutron-server --config-file /etc/neutron/neutron.conf --config- file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini" 安装 Neutron Client,命令如下: $ cd $ git clone https://github.com/openstack/python-neutronclient $ cd python-neutronclient $ sudo python setup.py develop 9. 安装部署 Cinder 下面安装 Cinder 组件,代码如下。注意,由于同前面其他组件安装类似,因此不再进行 具体说明。 第一部分 基 础 篇78 $ cd $ git clone https://github.com/openstack/cinder $ cd devstack/files/apts $ for i in ` cut -f1 -d" " cinder`; do sudo apt-get install -y $i; done $ cd ~/cinder $ git checkout stable/havana $ sudo python setup.py develop $ sudo mkdir -p /etc/cinder $ sudo chown openstack:openstack /etc/cinder/ $ cp etc/cinder/policy.json /etc/cinder $ sudo mkdir -m 755 /etc/cinder/rootwrap.d $ sudo cp etc/cinder/rootwrap.d/*filters /etc/cinder/rootwrap.d/ $ sudo chown -R root:root /etc/cinder/rootwrap.d $ sudo chmod 644 /etc/cinder/rootwrap.d/* $ cp etc/cinder/rootwrap.conf /etc/cinder/ $ sudo chown root:root /etc/cinder/rootwrap.conf $ sudo chmod 0644 /etc/cinder/rootwrap.conf $ sudo vi /etc/sudoers.d/cinder-rootwrap 添加下面第一行代码到 cinder-rootwrap 文件中,接着执行余下命令。 openstack ALL=(root) NOPASSWD: /usr/local/bin/cinder-rootwrap /etc/cinder/ rootwrap.conf * $ sudo chmod 0440 /etc/sudoers.d/cinder-rootwrap $ sudo chown root:root /etc/sudoers.d/cinder-rootwrap $ cp etc/cinder/api-paste.ini /etc/cinder 其余的配置文件内容,包括安装 tgt、建立数据库等内容,可参照 2.1 节相关内容。在控 制节点上,启动 cinder-api 和 cinder-scheduler 服务即可,其代码如下: $ tmux -c "bin/cinder-api --config-file=/etc/cinder/cinder.conf" $ tmux -c "bin/cinder-scheduler --config-file=/etc/cinder/cinder.conf" 10. 安装 Horizon 安装 Horizon 的方法完全可以参照 devstack 的脚本,主要是先安装 apache2 等依赖软件 包,然后复制配置文件,进行一定的修改即可,其代码如下: $ cd $ git clone https://github.com/openstack/horizon $ cd devstack/files/apts $ for i in ` cut -f1 -d" " horizon`; do sudo apt-get install -y $i; done $ cd ~/horizon $ git checkout stable/havana $ sudo python setup.py develop $ cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/ local/local_settings.py $ sudo mkdir -p ~/horzion/.blackhole $ sudo rm -f /etc/apache2/sites-enabled/000-default $ sudo touch /etc/apache2/sites-available/horizon.conf 第 2 章 OpenStack 的安装 79 $ sudo a2ensite horizon $ cd ~/devstack $ sudo sed -e "s,%USER%,openstack,g; s,%GROUP%,openstack,g;s,%HORIZO N_DIR%,/home/openstack/horizon,g;s,%APACHE_NAME%,apache2,g;s,%DEST%, /home/openstack,g;s,%HORIZON_REQUIRE%,,g;" files/apache-horizon.template > /etc/apache2/sites-available/horizon.conf 最后,重启 Apache 服务。 2.2.2 计算节点的安装 计算节点的任务就是负责运行虚拟机,对于计算节点操作系统的安装,默认把 / 目录 分区尽量分配充足,至少 50GB。这里使用 KVM。此外,这个架构中使用的网络方式是 Neutron,使用的Neutron 的 plugin 是 Open vSwitch,因此,还需要安装Neutron 的 Open vSwitch 的 agent,以及 Open vSwitch 本身。 需要使用或安装的组件: ‰‰ KVM、libvirt ‰‰ nova-compute ‰‰ neutron-plugin-openvswitch-agent ‰‰ Open vSwitch 为了保证和 controller 节点的时间一致,需安装 NTP 并同步时间。 1. 安装 nova-compute 首先,回到工作目录,命令如下: $ cd 下载 devstack 脚本和 Nova 的源代码,命令如下: $ git clone https://github.com/openstack-dev/devstack $ git clone https://github.com/openstack/nova 安装 nova-compute 所需要的依赖软件包,代码如下: $ cd devstack/files/apts $ for i in ` cut -f1 -d" " n-cpu`; do sudo apt-get install -y $i; done 安装 nova-compute 组件,代码如下: $ cd ~/nova $ git checkout stable/havana $ sudo python setup.py develop 注意 第一部分 基 础 篇80 因为底层使用 KVM 虚拟化技术,所以必须安装 KVM 和 libvirt 库,命令如下: $ sudo apt-get install -y kvm libvirt-bin python-libvirt 2. 配置 Nova 相关文件 配置示例如下: $ cd ~/nova $ sudo mkdir /etc/nova $ sudo chown openstack:openstack /etc/nova $ cp etc/nova/api-paste.ini /etc/nova/ $ cp etc/nova/nova.conf.sample /etc/nova/nova.conf $ mkdir -m 755 /etc/nova/rootwrap.d $ cp etc/nova/rootwrap.d/*.filters /etc/nova/rootwrap.d $ sudo chown -R root:root /etc/nova/rootwrap.d $ sudo chmod 644 /etc/nova/rootwrap.d/* $ cp etc/nova/rootwrap.conf /etc/nova $ sed -e "s:^filters_path=.*$:filters_path=/etc/nova/rootwrap.d:" -i /etc/nova/ rootwrap.conf $ sudo chown root:root /etc/nova/rootwrap.conf $ sudo chmod 0644 /etc/nova/rootwrap.conf $ sudo vi /etc/sudoers.d/nova-rootwrap 把第一行内容添加到 nova-rootwrap 文件中,并执行余下命令。 openstack ALL=(root) NOPASSWD: /usr/local/bin/nova-rootwrap /etc/nova/rootwrap.conf * $ sudo chmod 0440 /etc/sudoers.d/nova-rootwrap 需要手动建立存放虚拟机文件的实际目录 instances,代码如下: $ sudo mkdir -p /data/nova/instances $ sudo chown -R opsntack:openstack /data/nova $ sudo mkdir /var/log/nova $ sudo chown -R openstack:openstack /var/log/nova 3. 配置 nova-compute 配置示例如下: $ sudo modprobe nbd || true/ $ sudo modprobe kvm || true/ $ kvm-ok $ sudo vi /etc/libvirt/qemu.conf 修改 qemu.conf 文件中以下部分内容: cgroup_device_acl = [ "/dev/null", "/dev/full", "/dev/zero", "/dev/random", "/dev/urandom", "/dev/ptmx", "/dev/kvm", "/dev/kqemu", 第 2 章 OpenStack 的安装 81 "/dev/rtc", "/dev/hpet","/dev/net/tun", ] $ sudo usermod -G libvirtd openstack 然后修改配置文件,可参照 2.1 节相关内容,其代码如下。注意,在这个例子中,nova. conf 中的 state_path 的目录应该设置成 /data/nova。在一切配置完成之后,启动 nova-compute 服务。 $ cd ~/nova $ tmux -c "sg libvirtd bin/nova-compute --config-file=/etc/nova/nova.conf" 4. 安装 Neutron 的 Open vSwitch plugin 计算节点需要使用 Open vSwitch 和 Neutron 的 Open vSwitch plugin。在二进制包安装过 程中,Open vSwitch 在安装 Neutron 时候被依赖安装了,而在这里我们必须手动安装 Open vSwitch,其代码如下: $ sudo apt-get install -y openvswitch-switch openvswitch-datapath-dkms Neutron 的 Open vSwitch plugin 的源代码包含在 Neutron 中,参照控制节点安装 neutron- server 部分,建立相应的目录,把 Open vSwitch 的 plugin 复制出来,然后编辑配置文件即 可。完成后,运行 neutron-openvswitch-plugin 的命令如下: $ cd ~/neutron $ tmux -c "python neutron-openvswitch-agent --config-file /etc/neutron/neutron. conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini" 2.2.3 网络节点的安装 网络节点需要安装 Neutron 和 openvswitch-plugins。和计算节点一样,也需要手动安装 Open vSwtich 的包。在网络节点中,安装 Neutron 和 openvswitch-plugins 的方式和控制节点、 计算节点的安装类似,唯一的区别是需要把源代码中关于 dhcp-agent、l3-agent 和 metadata- agent 的配置文件复制到 /etc/neutron 目录中,其余的这里不再重复写出。这里给出启动三个 服务的命令: $ tmux -c "python neutron-dhcp-agent --config-file /etc/neutron/neutron.conf -- config-file /etc/neutron/dhcp_agent.ini" $ tmux -c "python neutron-l3-agent --config-file /etc/neutron/neutron.conf -- config-file /etc/neutron/l3_plugin.ini" $ tmux -c "python neutron-metadata-agent --config-file /etc/neutron/neutron.conf -- config-file /etc/neutron/metadata_plugin.ini" 网络节点需要新建相关目录,代码如下: $ sudo mkdir /var/lib/neutron $ sudo chown openstack:openstack /var/lib/neutron 第一部分 基 础 篇82 2.2.4 块存储节点的安装 块存储节点运行 cinder-volume 服务,这个服务同样包含在 Cinder 的安装中,可参照在 控制节点中安装 Cinder 服务的那一部分。启动 cinder-volume 的命令如下: $ tmux -c "bin/cinder-volume --config-file=/etc/cinder/cinder.conf" 最后,从自身的学习经验来看,笔者建议读者先从二进制包安装方式开始,因为 Linux 发行版本厂商已经帮用户解决了很多依赖包的关联,并且建立好了相关的目录和目录下需 要用的配置文件,用户和目录权限无须配置。用户或者管理员可以专注于各个组件的配置 参数,以便建立起一个正常运行的 OpenStack 云环境。学习二进制包安装后,读者可以循 序阅读后面如何使用 OpenStack 的章节,对 OpenStack 整个框架使用有个大致的了解之后再 来学习源代码安装。笔者在这里给出的源代码安装步骤相对简单,而且由于随着版本的更 新,可能会不适用于新的版本中。推荐读者对这里介绍的安装过程熟悉之后,去阅读官方的 devstack 的脚本,它是一个一直在保持更新的脚本,添加了更多功能的支持,譬如 Nova 的 cell 服务、Neutron 的其他 plugin、Ceilometer、Heat 等新的项目组件;同时,该脚本也支持 在 CentOS 6.5 上进行源代码安装。
还剩93页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

wjm0520

贡献于2016-09-29

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!