五、OpenStack
1. OpenStack简介
1.1 OpenStack是什么
OpenStack引领新一代数据中心:为下一代数据中心操作系统赋能
专注于快速、灵活和自动化地提供服务
可编程、可扩展、多租户感知的基础架构
单一、大型、灵活、可扩展和自动化的单元
是开源云计算平台,可控制整个数据中心的大型计算、存储和网络资源池
管理员能够通过Web界面、命令行或API接口控制、配置资源;用户可以通过Web界面使用资源。
既是一个
开源
软件,也是一个开源社区,里面包含很多开源子项目- 提供了一个部署云的操作平台和工具集
- 用OpenStack易于构建虚拟计算或存储服务云,可为公有、私有云(无论大小)提供
可扩展、灵活
的云计算
- 用OpenStack易于构建虚拟计算或存储服务云,可为公有、私有云(无论大小)提供
1.1.1 设计理念
开放(Open)
- 理念:不重复造轮子,站在巨人的肩膀上
- 措施:开源,尽最大可能重用开源项目
灵活(Flexible)
- 大量使用插件化方式进行架构设计与实现
- 不使用任何不可替代的私有/商业组件
可扩展(Scalable)
- 由多个相互独立的项目组成
- 每个项目包含多个独立组件
- 无中心架构,无状态架构
1.1.2 类比OS
- 操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。
- 云平台综合管理系统指构架于服务器、存储、网络等基础硬件资源和单机操作系统、中间件、数据库等基础软件之上,管理海量的基础硬件、软件资源并提供底层公共云服务的软件程序。
- “云操作系统”的三种不同指代
- 类虚拟化中为适配云计算需求而被修改的传统操作系统
- 在每一台物理设备上或集群里管理虚拟机的监控器VMM
- 云平台或数据中心操作系统
全面网络化、更多的安全考虑、计算可扩充性考虑
1.1.3 地位
- 重要地位:赋能安全、灵活、易扩展的全面自动化数据中心
- 但除了云操作系统,构建云计算还需要很多其他东西:底层驱动 + 上层应用程序 同等重要
1.2 从概念模型到物理部署
块存储:对外提供的是扇区的访问方式,将硬盘包装成卷对外服务,可以划分不同大小的卷。
文件存储:基于文件系统对外提供服务,用户可以像使用本地文件系统一样使用云文件存储服务。
对象存储:一种特殊的文件存储,只有一个层次,用hash方式存储二进制文件。
1.2.1 Map of OpenStack Projects
除了以上各功能性服务组件,还有两个非常核心的基础组件
消息队列:中心化的消息交换器,用于在服务组件不同模块传递消息;队列的优势在于可以缓冲请求
数据库:构建时和运行时状态信息,例如可以使用的实例类型、正在使用的实例、可用网络等,也是各个组件间共享信息的重要组件
服务目录:所有服务向其注册,了解OpenStack的所有服务——Keystone承担注册中心角色
1.2.2 网络设计
单台计算机设备:CPU、内存、硬盘、总线? <==> 云数据中心
所有组件分布在四种节点上:云控制器
、网络节点
、计算节点
、存储节点
;网络连接
- 控制节点中封装了很多Openstack的服务
- 四种节点如何通过物理网络连接在一起?
- 管理网络:Openstack服务之间的通信,包括消息队列、数据库和API
- 存储网络:虚拟机和存储节点之间的物理连接
- 租户数据网络:为租户创建的虚拟网络提供物理路径
- 对外的网络:互联网连接+对外的API网络
- 使用隔离的物理网络处理不同类型的网络流量:同一个节点在不同网络中使用不同接口
1.2.3 物理模型设计
物理模型设计——估算硬件容量
- 例如:在Openstack环境中运行200个虚拟机
- CPU评估
- 逻辑CPU数:物理CPU * 核数 * 超线程数;一个逻辑CPU对应一个虚拟CPU;一个虚拟CPU支持多个虚拟机【影响性能;可以使用频数计算】;一个虚拟机可以使用多个虚拟CPU,但不能多于逻辑CPU数;
- 可以超额分配,但是不能超额执行;超分:单台物理机中虚拟机个数*频数 > 物理频数
- 内存评估
- 单台物理机虚拟机个数 * 虚拟机最大动态分配内存 + 主机内存用量
- 网络评估
- 网卡带宽 > 单个虚拟机带宽 * 虚拟机个数;公共IP地址个数;浮动IP地址个数
- 存储评估
- 虚拟机的临时存储 + 永久存储;存储节点的对象存储、块存储和文件共享存储
- CPU评估
- 最佳实践
- 分析需求、考虑需求增长情况、持续跟踪每一个服务单元、丢弃和替换服务单元等
1.3 案例:虚拟机创建过程
2 云控制器:Keystone、Nova及其他服务
2.1 总览
基础架构服务
- 不属于OpenStack对外提供的公共服务,但被多个OpenStack组件使用
- 消息队列:必须是集群式的;RabbitMQ,ZeroMQ,Qpid
- 数据库:OpenStack的环境数据,使用数据等;MySQL和MongoDB
OpenStack服务
- 身份认证
- 编排引擎
- 计量服务
- 仪表盘
- ……
所有服务不一定要部署在同一台物理设备
运行每一类服务的都可以是一个独立的集群
各服务的Restful API
2.2 物理部署
- Openstack采用 无中心结构、节点无本地状态
- 控制器(除基础架构服务)使用对称高性能集群
- 请求聚合+负载均衡
- 每一台物理设备运行相同的服务
- 控制器节点很容易水平扩展
- 数据库、消息队列可采用非对称高可用集群
集群:两台或多台服务器的能力聚合就是服务器集群
非对称集群:通常用于高可用目的,比如扩展数据库、消息系统或者文件系统的读写能力。备用服务器只有在主服务器发生故障的时候才会接管系统。备用服务器可以看作悄悄执行的观察者,集群需要配置故障切换机制。
对称集群:所有节点都是活的,都参与请求的处理,当节点出现故障后,被集群丢弃,其他节点接管其工作负载并继续处理事务。典型的就是负载均衡集群,所有节点共享工作负载,增强性能和服务的扩展性
2.3 Keystone服务
身份认证和服务目录(所有其他服务需向Keystone注册API端点),由多个Provider组成
- 身份提供者Identity Provider:服务用户、管理员用户、终端用户
- 资源提供者resource Provider:project、domain
- 认证提供者Authorization Provider:用户和用户组和他们角色之间的关系
- 令牌提供者Token Provider:访问openstack服务需要一个有效的令牌,通过身份提供者的认证后获得令牌
- 目录提供者Catalog Provider:维护服务和API端点的目录
- 策略提供者Policy Provider:策略由多条规则组成,每条规则定义了哪些用户和角色被允许访问哪些资源
高级特性
- 联邦keystone:使用外部身份提供者提供的身份服务访问服务提供商可用资源的机制
- Fernet令牌:解决原生令牌提供者带来的性能问题
2.4 Nova管理组件及API
Nova是Openstack中提供计算资源服务的项目,是OpenStack最核心的项目
- 负责:虚拟机和其他计算资源的生命周期管理
- 不负责:承载虚拟机的物理机自身的管理和全面的系统状态监控
运行在云控制器上的组件
- Nova-api
- 云控制器中的编排引擎;通过API将消息写入数据库和消息队列向其他守护进程传递消息
- Nova-conductor
- 代表计算节点上nova-compute执行数据库操作,提供数据库访问隔离;将来自计算节点请求并行化
- Nova-scheduler
- 专门的调度算法;确定虚拟机创建的最佳放置位置;支持过滤器检查计算节点上资源可用性,通过加权机制过滤出计算节点列表,再确定启动虚拟机的最佳位置;支持自定义度量标准和策略考量配置
- 在生产环境下,配置单独的存储主机,其调度器运行在存储主机上
Nova-compute则运行在计算节点上
2.5 其他服务
云控制器托管用于镜像管理的Glance服务
- Glance API提供外部REST接口,用于查询虚拟机镜像及相关元数据
- Glance registry将镜像元数据存储在数据库中,并利用存储后端实际存储镜像
- 例如使用Swift对象存储作为镜像存储后端
网络服务采用类似Nova的部署概念
- 网络API驻留在云控制器中,独立配置网络服务器节点
仪表盘服务
- 运行在Apache Web服务器后端,可以将其运行在可以访问API端点的单独节点上,降低云控制器负载
计量服务
- 跟踪资源使用情况,计算资源利用率
- 多种使用目的:计费、容量规划、按需求和吞吐量的虚拟基础架构自动扩展等
3 计算节点:Nova、Magnum
3.1 Nova-compute总览
计算节点运行nova-compute服务,负责启动和终止虚拟机,通过消息总线监听虚拟机相关请求
Scheduler 通过 MQ 通知 Compute 创建虚拟机,Compute 通过 MQ 请求 Conductor 从 DB 处获取虚拟机相关信息
Compute: Manages communication with hypervisor and virtual machines
Hypervisor是Nova计算节点的核心,又称VMM
3.2 核心:Hypervisor
Nova-compute通过API server控制节点上的Hypervisor
支持多种Hypervisor,通过配置文件设置选择哪一个Hypervisor
3.3 Nova相关概念
Nova中对主机有一个层次划分——高于一台物理主机
3.4 Nova操作
3.5 Nova单元
所有计算节点都要与消息总线和数据库服务器通信,随着计算节点增多,使得消息队列和数据库过载
同时考虑到安全、易扩展和效率问题,按照Nova单元管理计算节点,增强计算节点的隔离性和分散性
3.6 Magnum
现实需求:在计算节点编排容器
- 解决方案1:在Nova中添加可以管理容器生命周期的Hypervisor
- 问题:和虚拟机不同,在容器中托管应用程序往往要部署多个容器,每个容器只运行一个进程,这些容器化的进程相互协作提供完整的应用程序功能。容器需要被成组地创建,需要配置网络连接用于协作进程之间的通信,还需要存储——独立为专门提供容器集群服务的项目:Magnum
- 项目目的:提供容器编排引擎(COE)以方便部署和管理容器集群
4 存储节点:Swift、Cinder
4.1 对象存储Swift
数据与其副本作为二进制大对象存储在对象存储服务器上
对象存储没有文件存储的层次结构,对象存储在扁平的命名空间——一种特殊的文件系统
使用REST或SOAP等API访问对象存储,而不是文件协议
不适用于高性能要求以及经常更改的结构话化数据,例如数据库
4.2 块存储Cinder
为云平台提供统一接口,按需分配的,持久化的块存储服务
核心功能是对卷的管理,允许对卷、卷的类型、卷的快照、卷备份进行操作
为后端不同的存储设备提供了统一的接口,不同的块设备服务厂商在 Cinder 中实现其驱动支持以与OpenStack进行整合
块存储作为虚拟机硬盘使用时,必须先分区、创建文件系统,再挂载到虚拟机文件系统层次结构中
5 网络节点:Neutron
5.1 网络连接
路由器:连接多个独立的网络
虚拟路由器:连接多个虚拟的网络;负责转发所有人请求
解决方案:
浮动IP:每一台虚拟机都动态分配一个对外的IP地址;外部通过IP访问到虚拟机,虚拟机通过该IP访问外部网络。
SNAT:虚拟机共享对外的IP地址,实现访问外部网络,但是外部无法通过IP地址定位到具体虚拟机。
DNAT:在共享的IP地址基础上添加映射到虚拟机的端口号。
5.2 Neutron组件
API服务器:运行在云控制器上
- 基于插件的架构
- API服务将请求转发到特定插件,插件通过代理和设备交互或者控制资源
- 提供了基于开源技术的插件和代理参考实现
- 网络节点提供资源实现网络服务:路由、防火墙、负载均衡器和VPN
核心插件:创建和管理网络、端口和子网
服务插件:实现高阶网络服务、路由、防火墙等
代理:计算和网络节点上,通过消息总线上的RPC和服务器交互
- L2代理:在计算和网络节点上,将虚拟机和网络设备连接到二层网络上
- DHCP代理、L3代理和VPN代理
网络节点L3代理:配置虚拟路由器
- 虚拟网络之间转发
- 外部网络和虚拟网络之间转发
5.3 细节
网络节点细节
计算节点上的网络配置细节
5.4 Distributed Virtual Routing (DVR)
为了降低网络节点的负载,同时提高可扩展性,OpenStack在Juno版本引入了DVR特性,DVR部署在计算节点上
计算节点上的VM使用floatingIP访问Internet,不必经过网络节点,直接从计算节点的DVR就可以访问
6 部署
6.1 DevOps
矛盾:
- 对于运维来说,稳定压倒一切,新 Feature 越少越好。而对于研发来说,却希望能开发更多的功能。
DevOps 的理念:
- 让研发(Development)和运维(Operations)一体化,让团队从业务需求出发,向着同一个目标前进。
DevOps 是一种软件研发管理的思想,方法论,追求的是一种没有隔阂的理想的研发协作的状态,可能涉及到的角色有开发、测试、产品、项目管理、运维等等。
DevOps(Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
6.2 DevOps和Openstack
要求开发人员、网络工程师和运维人员必须相互协作,来部署、运维和维护OpenStack云基础架构
OpenStack和DevOps结合
要求
- OpenStack软件和部署云基础架构的持续增长的复杂性必须被简化
方式
基础架构中的所有内容都必须自动化
将OpenStack分解为多个部分
要点
简化和模块化OpenStack服务;像开发构建模块一样开发OpenStack服务
在不影响整个系统的情况下,促进服务的定制和改进
使用正确的工具来构建服务,确保服务在相同输入情况下输出相同结果
将服务愿景从如何做切换到要做什么
6.3 Ansible
基础架构自动化引擎:安装Ansible自身部署系统和管理的目标系统
模块
- 封装系统资源或操作的组件,对资源及其属性进行建模;通过执行模块改变目标系统状态;执行后清除
变量
- 代表更新中的动态部分,可用于修改模块行为;可以用户自定义,作为模块一部分
清单
- 由Ansible管理的主机列表;支持将主机分类到多个组中;同一个主机可以出现在多个分段中
角色
- 表示在一组主机上配置服务时必须执行的任务集合;封装了在主机上部署服务所需的任务、变量、处理程序和其他相关功能;在Web服务器集群中为主机分配角色:Web服务器,数据库服务器,负载平衡器等
Playbook
Ansible的主要配置文件;描述了完整的系统部署计划,由一系列任务组成;用YAML编写
Yet Another Markup Language
6.4 OpenStack Ansible
自动化部署OpenStack
聚焦于提供多个角色和playbook,用于部署可扩展的、可理解投入生产的OpenStack环境