openstack

 一、Openstack 入门
    OpenStackTM是一个开源的基础设施即服务(IaaS)平台,OpenStack 管理的资源不是单机的而是一个分布的系统,把分布的计算、存储、网络、设备、资源组织起来,形成一个完整的云计算系统;OpenStack平台是几个项目的集合,这几个项目共同提供了管理计算机、存储以及数据中心中网络资源的能力。OpenStack还提供了一系列API和集中的仪表板来管理云资源。
    OpenStack生态圈:一个成功的开源平台,有三个要素组成,技术 + 生态 + 用户;a、社区的组成 b、基金会的管理机构 c、项目的孵化
 
1、OpenStack是什么?
OpenStack 是一套框架,有下面这两个特点:
 • 它是一个中间层,可以创建、管理和销毁虚拟机,但是要完成这些操作需要依赖于第三方的 Hypervisor,通过这个 Hypervisor 去完成虚拟化的工作,OpenStack 并不能自己去提供一个虚拟化的运行环境,OpenStack 有个组件叫 Cinder(用来提供块存储服务的),但是 OpenStack 自己并不能进行数据的存储和读写,它需要依赖一个实际的块存储设备的支持,这个设备可以是一个分布式的存储系统,比如说 Ceph,也可以是一个存储设备,比如说 EMC 的 SAN,也可以是存储服务器的本地硬盘,但是它必须依赖一个存储设备的支持,OpenStack 本身并不具备这个功能。OpenStack 是一个中间层。
 • 框架有一个很重要的特点,那就是它能提供一批 API 去支持应用的开发,这也是我们业内对框架的一个定义,OpenStack 当然也有这个特点,云计算的愿景就是让用户能够像用电一样去使用计算,OpenStack 的设计也是朝着这个愿景去做设计的,但是实际上我们平时是不能直接用电的,我们需要用的是电冰箱、电脑、电视等等这些电器。同理,对于云计算来说,提供 API 去支持开发应用这个事情就合情合理的非常的重要了,具有完备的 API 是 OpenStack 的突出优点。
 
2、OpenStack不是什么?
 • 它不是虚拟化软件(必须知道这点),OpenStack 虽然管理虚拟机,但不具备虚拟化的功能,它给上层提供一个虚拟化的运行环境,必须得依赖一个第三方的虚拟化软件来实现,比如默认支持的 Linux 内核虚拟机,装完 Linux 之后就自动带了,集成到 Linux 内核里面了(KVM),另外它还支持 Xen,还支持微软的 Hyper-V,支持 VMware 的 Vshpere,还支持像 Linux Container 和 Docker 这样轻量级的虚拟化技术。总之,OpenStack 本身不提供虚拟化,依赖第三方软件。
 • 需要了解的第二层含义:这个云化和虚拟化实际上是不一样的,云 != 虚拟化,云化的目的是为了实现效用计算,弹性计算,动态资源调度,多租户等这样的一些特性;而虚拟化只是实现云计算的这些特性中的一个技术手段而已,而且它不是必需的。比方说 IBM 的 Softlayer 是 IBM 主推的云服务之一,它中间有一个非常大的特点就是,它支持 Bare Metal Server,直译过来就是 “金属裸机”,也就是 Softlayer 在上面不做虚拟化,而是直接用物理服务器来实现云,直接给用户、租户提供的就是物理服务器,Softlayer 也可以在上面来实现多租户 、弹性计算等等特性。总之,Softlayer 没有虚拟化,但是 Softlayer 也做了云。第二个例子是 OpenStack 也有一个项目叫作 Ironic,是为了通过管理 “金属裸机”来实现云从而提出的项目。
 
3、OpenStack资源管理
    OpenStack 作为一个操作系统,管理资源是它的首要任务;OpenStack 管理资源主要有三个方面:计算、存储 和 网络。
    OpenStack 对资源进行管理,并且以服务的形式提供给上层应用或者用户去使用。这些资源的管理是通过 OpenStack 中的各个项目来实现的。其中计算资源管理相关的项目是 Nova(又称为 OpenStack Compute);存储相关的主要有块存储服务 Cinder、对象存储服务 Swift、镜像存储服务 Glance 这三种;
    与网络相关的主要是一个和软件定义网络相关的项目叫作 Neutron;另外,Nova 中间有一个管理网络的模块叫作 Nova Network,作为一个比较稳定的遗留组件仍在 OpenStack 里面和 Neutron 并存,我们在小规模部署里面经常为了追求这种稳定,并且减少工作量会去使用 Nova Network 这样的一个组件来对网络资源进行管理。
    OpenStack 提供的这些服务和公有云上的服务往往有一种对应关系,这里以亚马逊的公有云 AWS 为例,看一下 OpenStack 的服务和亚马逊的服务之间的对应的关系:与aws的部分功能做对应:
  Nova - EC2;Cinder - EBS;Neutron - VPC;Swift - S3;Glance - VM Import/Export 等;
 
二、OpenStack基本组件
    OpenStack 核心的项目:Nova 、 Cinder、 Neutron、 Swift、 Keystone、 Glance、 Horizon
1、计算(compute):Nova
    Nova 是一套控制器,用于为单个用户或使用群组管理虚拟机实例的整个生命周期,根据用户需求来提供虚拟服务。负责虚拟机创建、开机、关机、挂起、暂停、调整、迁移、重启、销毁等操作,配置CPU、内存等信息规格;
    Nova 的部署运行一般有两种情况:一类是 Nova 作为 Controller 节点去运行,Controller 节点是用来控制其它的一些计算节点的;另外一类节点就是 Compute 节点,是计算节点,上面是运行实际的虚拟机的;
    区别:
 • 在 Compute 节点上部署的 Nova,它上面核心运行的一个东西叫作 Nova Compute,主要是为了去对虚拟机进行控制,它去和 Hypevisor 进行交互,对虚拟机进行控制;
 • 在 Controller 上运行的 Nova 就相对复杂一些,它有 Scheduler、Conductor、Nova Cell;
 • Scheduler 在用户发起请求的时候决定这个虚拟机应该在哪个机器上启动,应该在哪个计算节点上启动;
 • Conductor 对所有的计算节点进行统一的管理;
 • Nova Cell 的作用是级联
 • 控制节点:Scheduler(决定虚拟机的启动位置)、Conductor(对所有的计算节点进行统一管理)、Nova Cell(级联)
 • 计算节点:对虚拟机进行控制
2、对象存储(object storage):Swift
    Swift 是一套用于在大规模可扩展系统中通过内置冗余及高容错机制实现对象存储的系统,允许进行存储或检索文件,可为Glance提供镜像存储,为Cinder提供卷备份服务。
3、镜像服务(image service):Glance
    Glance 是一套虚拟机镜像查找及检索系统,支持多种虚拟机镜像格式(AKI、AMI、ARI、ISO、QCOW2、Raw、VDI、VHD、VMDK),有创建上传镜像、删除镜像、编辑镜像基本信息的功能。
4、身份服务(identity service):Keystone
    Keystone 为Openstack 其他服务提供身份验证、服务规则或服务令牌的功能,管理domains、projects、users、groups、roles。
5、网络&地址管理(network):Neutron
    Neutron 提供云计算的网络虚拟化技术,为Openstack 其他服务提供网络连接服务。为用户提供接口,可以定义network、subnet、router、DHCP、DNS、负载均衡、L3服务、GRE、VLAN等。插件架构支持许多主流的网络厂家和技术,如Openvswitch。
6、块存储(block storage):Cinder
    Cinder 组件主要的用途是提供块存储服务,为运行实例提供稳定的数据块存储服务,它的插件驱动架构有利于块设备的创建和管理,如创建卷、删除卷,在实例上挂载和卸载卷。最核心的两个部分是 Scheduler 和 Cinder Volume。有读写存储服务请求的时候,Scheduler 决定通过哪个 Cinder Volume 进行读取操作,Cinder Volume 是实际控制存储的设备。
7、UI界面(dashboard):Horizon
    Openstack 中各种服务的Web管理门户,用于简化用户对服务的操作,例如启动实例、分配IP地址、配置访问控制等。
8、测量(metering):Ceilometer
    Ceilometer 像一个漏斗一样,能把Openstack 内部发生的几乎所有的事件都收集起来,然后为计算和监控以及其他服务提供数据支撑。
9、部署编排(orchestration):Heat
    Heat 提供了一种通过模板定义的协同部署方式,实现云基础设施软件运行环境(计算、存储和网络资源)的自动化部署。
10、数据库服务(database service):Trove
    Trove 为用户在Openstack 的环境提供可扩展和可靠的关系以及非关系数据库引擎服务。
 
三、OpenStack 准备环境
    构建完整的OpenStack 私有云平台,生产环境至少需要2台服务器,一台为控制节点服务器,一台为计算节点服务器,不推荐把计算节点服务安装在控制节点服务器,宿主机操作系统推荐使用CentOS 7.X系列。
1、构建OpenStack 基础环境信息:
    操作系统版本:CentOS Linux release 7.3.1611
    192.168.28.134    node1 控制节点
    192.168.28.135    node2 计算节点
    其中node1控制节点主要用于操控计算节点,node 2计算节点为创建虚拟机的资源池,node 1控制节点主要配置服务包括:MySQL、RabbitMQ、Apache、Horizon、Keystone、Glance、Nova(API、Cert、Scheduler、ConsoleAuth、Conductor、NoVNCporxy)、Neutron(server、LinuxBridge-Agent)、Cinder(API、Scheduler、Volume及可选GFS分布式存储)等。
    node2计算节点主要配置服务包括:Nove(Nova-Compute、Libvirt、KVM)、Neutron(LinuxBridge-Agent)等。
2、主机名及防火墙设置
    构建OpenStack 平台,由于节点之间相互通信会解析本地主机名,需提前设置主机名,生产环境可以基于DNS解析,控制节点node1和计算节点node2上进行以下配置,配置本地主机名及关闭防火墙、关闭SELinux服务,并且基于ntpdate工具同步各个节点的时间,配置代码如下:
# vim /etc/hosts
    192.168.28.134    node1
    192.168.28.135    node2
 • 永久关闭SELinux服务
# sed -i '/SELinux/s/enforcing/disabled/g' /etc/sysconfig/selinux
 • 临时关闭SELinux服务
# setenforce 0
 • 停止防火墙、禁止开机启动
# systemctl stop firewalld.service
# systemctl disable firewalld.service
 • 同步服务器时间
# ntpdate pool.ntp.org
# hostname `cat /etc/hosts|grep $(ifconfig|grep broadcast|awk '{print $2}')|awk '{print $2}'`;su
 
四、OpenStack 服务安装
    OpenStack node1主控制节点为OpenStack 集群服务器端,主要用于对整个OpenStack 私有云控制与调度。
1、node1节点必备服务安装安装配置如下:
 • 清理Openstack rocky版本YUM元数据
# yum --enablerepo=centos-openstack-rocky clean metadata
 • 安装epel扩展源及Openstack rocky YUM源
# yum install -y epel-release
# yum install -y centos-release-openstack-rocky
# yum install -y python-openstackclient
 • 安装MariaDB数据库及Python数据库模块支持
# yum install -y mariadb mariadb-server MySQL-python mariadb-devel
 • 安装 MQ消息队列服务RabbitMQ
# yum install -y rabbitmq-server
 • 安装认证中心Keystone、HTTP Web服务、Memacached缓存服务
# yum install -y openstack-keystone httpd httpd-devel mod_wsgi memcached python-memcached
 • 安装镜像管理Glance服务
# yum install -y optenstack-glance python-glance python-glanceclient
 • 安装 Openstack 管理模块、虚拟机控制调度及控制服务Nova
# yum install -y openstack-nova-api openstack-nova-cert openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler pyhon-novaclient
 • 安装Neutron 网络配置及管理服务
# yum install -y opentstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge python-neutronclient ebtables ipset
 • 安装Openstack 控制界面dashboard
# yum install -y openstack-dashboard
 • 安装镜像块存储服务
# yum install -y openstack-cinder python-cinderclient
 • 升级KVM虚拟机管理程序Qemu服务
# yum install -y centos-release-qemu-ev.noarch
# yum install -y qemu-kvm qemu-img
 • 调整MariaDB最大连接数为2000
# sed -i '/\[mysqld\]/amax_connections=2000' /etc/my.cnf
 • 将MariaDB服务设置开机启动,并且启动MariaDB服务
# systemctl enable mariadb.service
# systemctl start mariadb.service
2、node1节点创建数据库配置如下:
 • 进入MariaDB数据库,创建必备库,同时授权本机和计算节点能访问
mysql
create database keystone;
grant all on keystone.* to 'keystone'@'localhost' identified by 'keystone';
grant all on keystone.* to 'keystone'@'%' identified by 'keystone';
grant all on keystone.* to 'keystone'@'node1' identified by 'keystone';
create database glance;
grant all on glance.* to 'glance'@'localhost' identified by 'glance';
grant all on glance.* to 'glance'@'%' identified by 'glance';
grant all on glance.* to 'glance'@'node1' identified by 'glance';
create database nova;
grant all on nova.* to 'nova'@'localhost' identified by 'nova';
grant all on nova.* to 'nova'@'%' identified by 'nova';
grant all on nova.* to 'nova'@'node1' identified by 'nova';
create database neutron;
grant all on neutron.* to 'neutron'@'localhost' identified by 'neutron';
grant all on neutron.* to 'neutron'@'%' identified by 'neutron';
grant all on neutron.* to 'neutron'@'node1' identified by 'neutron';
create database cinder;
grant all on cinder.* to 'cinder'@'localhost' identified by 'cinder';
grant all on cinder.* to 'cinder'@'%' identified by 'cinder';
grant all on cinder.* to 'cinder'@'node1' identified by 'cinder';
flush privileges;
exit
 
五、MQ 消息队列服务
    MQ全称为message queue,即消息队列,MQ是一种应用程序对应用程序的通信方法,应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无须专用连接来链接它们。
1、MQ消息队列简介
    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题、实现高性能、高可用、可伸缩和最终一致性架构。主流消息队列包括ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。
    消息传递指的是程序之间在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
    排队指的是应用程序通过队列来通信,队列的使用除去了接收和发送应用程序同时执行的要求。RabbitMQ是一个在AMQP基础上完整的、可复用的企业消息系统,遵循GPL开源协议。
    Openstack 的架构决定了需要使用消息队列机制来实现不同模块间的通信,通过消息验证、消息转换、消息路由加构模式,带来的好处就是可以使模块之间最大程序觖耦,客户端不需要关注服务端的位置和是否存在,只需通过消息队列进行信息的发送。
    RabbitMQ 适合部署在一个拓扑灵活易扩展的规模化系统环境中,有效保证不同模块、不同节点、不同进程之间消息通信的时效性,可有效支持Openstack 云平台系统的规模化部署、弹性扩展、灵活架构以及信息安全的需求。
2、RabbitMQ 应用场景
 • MQ异步信息场景
场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。
(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。
(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。
 • MQ应用解耦场景
场景说明:用户下单后,订单系统需要通知库存系统,然后库存系统的库存数减一。传统的做法是,订单系统调用库存系统的接口。
传统模式的缺点:
(1)假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;
(2)订单系统与库存系统耦合;
引入应用消息队列后的方案:
(1)订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
(2)库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
(3)假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。
 • MQ流量削锋场景
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
(1)可以控制活动的人数;
(2)可以缓解短时间内高流量压垮应用;
用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;
秒杀业务根据消息队列中的请求信息,再做后续处理。
 • MQ日志处理场景
日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。
(1)日志采集客户端,负责日志数据采集,定时写受写入Kafka队列;
(2)Kafka消息队列,负责日志数据的接收,存储和转发;
(3)日志处理应用:订阅并消费kafka队列中的日志数据;
以下是新浪kafka日志处理应用案例:
 (1) Kafka:接收用户日志的消息队列。
 (2) Logstash:做日志解析,统一成JSON输出给Elasticsearch。
 (3) Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。
 (4) Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因。
 • MQ消息通讯场景
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。
点对点通讯:
客户端A和客户端B使用同一队列,进行消息通讯。
聊天室通讯:
客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。
以上实际是消息队列的两种消息模式,点对点或发布订阅模式。
 
六、安装配置RabbitMQ
1、安装RabbitMQ 服务,并启动该服务,RabbitMQ 默认监听的端口为TCP 15672,同时添加Openstack 用户、添加RabbitMQ管理插件,配置步骤如下:
 • 安装 MQ消息队列服务RabbitMQ
# yum install -y rabbitmq-server
 • 启动 RabbitMQ 服务
# systemctl enable rabbitmq-server.service
# systemctl start rabbitmq-server.service
 • 查看当前所有用户
# rabbitmqctl list_users
 • 查看默认guest用户的权限
# rabbitmqctl list_user_permissions guest
 • 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户
# rabbitmqctl delete_user guest
 • 添加新用户
# rabbitmqctl add_user username password
 • 设置用户tag
# rabbitmqctl set_user_tags username administrator
 • 赋予用户默认vhost的全部操作权限
# rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
 • 查看用户的权限
# rabbitmqctl list_user_permissions username
 • 添加 Openstack 用户和密码,并设置访问权限
# rabbitmqctl add_user openstack openstack
# rabbitmqctl set_permissions -p / openstack ".*" ".*" ".*"
# rabbitmqctl set_user_tags openstack administrator
 • 查看RabbitMQ 支持插件,并且启用WEP管理接口插件
# rabbitmq-plugins list
# rabbitmq-plugins enable rabbitmq_management
 • 重启RabbitMQ 服务,查看监听端口是否为 15672
# systemctl restart rabbitmq-server.service
# lsof -i:15672
访问RabbitMQ Web 管理界面,浏览器访问地址为http://192.168.28.134:15672。
通过创建的用户openstack就可以登录并管理。
2、RabbitMQ 消息测试
    RabbitMQ 消息测试如下,消息服务器部署完毕后,可以进行简单消息的发布和订阅。
RabbitMQ 完整的消息通信包括:
 • 发布者(producer)是发布消息的应用程序
 • 队列(queue)用于消息存储的缓冲
 • 消费者(consumer)是接收消息的应用程序
    RabbitMQ 消息模型核心理念是发布者(producer)不会直接发送任何消息给队列,甚至不知道消息是否已经被投递到队列,而只需要把消息发送给一个交换器(exchange),交换器非常简单,它可以一边从发布者方接收消息,一边把消息推入队列。交换器必须知道如何处理它接收到的消息,是应该推送到指定队列还是多个队列,或是直接忽略消息。
 
七、配置Keystone 验证服务
    Keystone 身份认证组件是Openstack 项目中默认的身份认证管理系统,主要用于提供谁服务,所有的服务都需要Keystone认证、根据用户的等级分配相应的权限,在Keystone 中主要涉及以下几个概念:user、tenant、role、token等,概念详解如下:
 • user,使用服务的用户,可以是人、服务或是系统,只要是使用了Openstack 服务的对象都可以称为用户;
 • tenant,租户,可以理解为一个人、项目或者组织拥有的资源的合集,在一个租户中可以拥有很多个用户,这些用户可以根据权限的划分使用租户中的资源;
 • role,角色,用于分配操作的权限,角色可以被指定给用户,使得该用户获得角色对应的操作权限;
 • token,相当于令牌,是一串比特值或字符串,用来为访问资源的记号,token 中含有可访问资源的范围和胡效时间。
以下为node1 节点上配置Keystone 服务步骤:
 • 基于openssl生成随机数并设置为admin_token值;
# ADMIN_TOKEN=`openssl rand -hex 10`;echo $ADMIN_TOKEN
 • 创建Keystone配置文件,并连接数据库、memcached缓存;
# cat >/etc/keystone/keystone.conf<<EOF
[default]
admin_token = $ADMIN_TOKEN
verbose = true
[assignment]
[auth]
[cache]
[catalog]
[cors]
[cors.subdomain]
[credential]
[database]
connection = mysql://keystone:keystone@192.168.28.134/keystone
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[eventlet_server_ssl]
[federation]
[fernet_tokens]
[identity]
[identity_mapping]
[kvs]
[ldap]
[matchmaker_redis]
[matchmaker_ring]
[memcache]
servers = 192.168.28.134:11211
[oauth1]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[paste_deploy]
[policy]
[resource]
[revoke]
driver = sql
[role]
[saml]
[signing]
[ssl]
[token]
provider = uuid
driver = memcache
[tokenless_auth]
[trust]
EOF
 • 创建数据库表,初始化Keystone 库并查看日志
# su -s /bin/sh -c "keystone-manage db_sync" keystone
# tail -n 10 /var/log/keystone/keystone.log
配置并启动memcached和Apache服务,代码如下:
 • 修改memcached 监听为0.0.0.0,重启memcached服务
# sed -i 's/OPTIONS=.*/OPTIONS=\"0.0.0.0\"/g' /etc/sysconfig/memcached
# systemctl enable memcached
# systemctl start memcached
 • 配置Keystone认证服务接口
# cat >/etc/httpd/conf.d/wsgi-keystone.conf<<EOF
Listen 5000
Listen 35357
 
<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
#    LimitRequestBody 114688
    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>
    ErrorLog /var/log/httpd/keystone.log
    CustomLog /var/log/httpd/keystone_access.log combined
    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>
 
<VirtualHost *:35357>
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
#    LimitRequestBody 114688
    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>
    ErrorLog /var/log/httpd/keystone.log
    CustomLog /var/log/httpd/keystone_access.log combined
    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>
 
Alias /identity /usr/bin/keystone-wsgi-public
<Location /identity>
    SetHandler wsgi-script
    Options +ExecCGI
 
    WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>
 
Alias /identity_admin /usr/bin/keystone-wsgi-admin
<Location /identity_admin>
    SetHandler wsgi-script
    Options +ExecCGI
 
    WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>
EOF
# systemctl enable httpd
# systemctl restart httpd
# netstat -lntup|grep httpd
创建Keystone 认证用户,临时设置admin_token用户的环境变量,用来创建用户,代码如下:
# export OS_TOKEN=$ADMIN_TOKEN
# export OS_URL=http://192.168.28.134:35357/v3
# export OS_IDENTITY_API_VERSION=3
 • 创建admIn项目
# openstack project create --domain default --description "Admin Project" admin
 • 创建admin用户,密码为admin
# openstack user create --domin default --password-prompt admin
创建一个普通用户demo,密码为demo,代码如下:
 • 创建admin角色
# openstack role create admin
 • 将admin用户加入到admin项目,赋予admin的角色
# openstack role add --project admin --user admin admin
 • 同上,创建一个demo项目,demo用户和demo角色
# openstack project create --domain default --description "Demo Project" demo
# openstack user create --domain default --password=demo demo
# openstack role create user
# openstack role add --project demo --user demo user
 • 创建service 项目,用来管理其他服务
# openstack project create --domain default --description "Service Project" service
 • 检查Openstack 用户、项目是否正常,代码如下:
# openstack user list
# openstack project list
 • 注册Keystone 访问服务,分别注册为公共的、内部的、管理的类型,即创建endpoint服务访问入口,Nova、Swift和Glance 一样,每个Openstack服务都拥有一个指定的端口和专属的URL,称该URL为访问入口(endpoints),代码如下:
# openstack service create --name keystone --description "Openstack Identity" identity
# openstack endpoint create --region RegionOne identity public http://192.168.28.134:5000/v2.0
# openstack endpoint create --region RegionOne identity internal http://192.168.28.134:5000/v2.0
# openstack endpoint create --region RegionOne identity admin http://192.168.28.134:35375/v2.0
 • 查看访问入口服务,命令为:openstack endpoint list。
验证默认项目、认证用户,获取token值,只有获取到项目ID、用户ID等信息才能说明Keystone 配置成功,代码如下:
# unset OS_TOKEN
# unset OS_URL
# openstack --os-auth-url http://192.168.28.134:35357/v3 --os-project-domain-id default --os-user-domain-id default --os-project-name admin --os-username admin --os-auth-type password token issue
 • 创建项目、用户及租户管理配置文件,使用环境变量来获取token,环境变量创建虚拟机时需要调用,配置代码如下:
# cat >admin-openrc.sh<<EOF
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://192.168.28.134:35357/v3
export OS_IDENTITY_API_VERSION=3
EOF
# cat >demo-openrc.sh<<EOF
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://192.168.28.134:5000/v3
export OS_IDENTITY_API_VERSION=3
EOF
# unset OS_TOKEN
# unset OS_URL
 • 引用shell脚本,验证默认项目、认证用户,获取token值,命令如下:
# source admin-openrc.sh
# openstack token issue
 
八、配置Glance镜像服务
    Glance 是Openstack 镜像服务组件,提供虚拟机镜像的发现、注册、取得服务等功能,Glance 提供restful API 可以查询虚拟机镜像metadata信息,并且可以直接获取虚拟机镜像,为创建虚拟机提供底层镜像模板支持。
    通过Glance 组件,虚拟机镜像可以被存储到多种存储上,比如简单的硬盘存储、对象存储或分布式文件系统等。Glance 组件内容及工作流程:
 • Glance 主要由三个部分构成:Glance API、Glance registry以及image store
Glance API:接受云系统镜像的创建、删除、读取请求
Glance registry:云系统的镜像注册服务
 • Glance 组件服务配置方法,vim修改Glance API接口配置文件/etc/glance/glance-api.conf,设置内容如下:
# cat > /etc/glance/glance-api.conf<<EOF
[default]
verbose = True
notification_driver = noop
#Glance 不需要消息队列
[database]
connection = mysql://glance:glance@192.168.28.134/glance
[glance_store]
default_store = file
#虚拟机镜像存储位置
filesystem_store_detadir = /var/lib/glance/images/
[image_format]
[keystone_authtoken]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = glance
[matchmaker_redis]
[matchmaker_ring]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
[oslo_policy]
[paste_deploy]
flavor = keystone
[store_type_location_strategy]
[task]
[taskflow_executor]
EOF
 • 修改Glance 镜像注册配置文件/etc/glance/glance-registry.conf,内容如下:
# cat >/etc/glance/glance-regisytry.conf<<EOF
[default]
verbose = True
notification_driver = noop
#Glance 不需要消息队列
[database]
connection = mysql://glance:glance@192.168.28.134/glance
[glance_store]
[keystone_authtoken]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = glance
password = glance
[matchmaker_redis]
[matchmaker_ring]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
[oslo_policy]
[paste_deploy]
flavor = keystone
EOF
 • 创建Glance 数据库表,同步Glance数据库,代码如下:
# su -s /bin/sh -c "glance-manage db_sync" glance
 • 创建Glance 的Keystone 用户,注册用户信息,代码如下:
# source admin-openrc.sh
# openstack user create --domain default --password=glance glance
# openstack role add --project service --user glance admin
 • 启动Glance API及registry服务
# systemctl enable openstack-glance-api
# systemctl enable openstack-glance-registry
# systemctl start openstack-glance-api
# systemctl start openstack-glance-registry
 • 查看Glance API及registry服务进程端口
# netstat -lnutp |grep 9191  #registry
# netstat -lnutp |grep 9292  #api
 • 在Keystone 认证中心注册Glance 镜像服务,创建镜像访问入口服务,代码如下:
# source admin-openrc.sh
# openstack service create --name glance --description "Openstack Image service" image
# openstack endpoint create --region RegionOne image public http://192.168.28.134:9292
# openstack endpoint create --region RegionOne image internal http://192.168.28.134:9292
# openstack endpoint create --region RegionOne image admin http://192.168.28.134:9292
 • 添加Glance 环境变量,获取镜像列表,代码如下:
# echo "export OS_IMAGE_API_VERSION=2"|tee -a admin-openrc.sh demo-openrc.sh
# glance image-list
 • Wget 远程下载cirros 或者CentOS 7 镜像,上传到Glance 存储仓库,代码如下:
# wget -q http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
# glance image-create --name "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --visibility public --progress
# wget http://cloud.CentOS.org/CentOS/7/images/CentOS-7-x86_64-GenericCloud.qcow2
# glance image-create --name "CentOS-7-x86_64" --file CentOS-7-x86_64-GenericCloud.qcow2 --disk-format qcow2 --container-format bare --visibility public --progress
 • 查看Glance 镜像仓库列表,代码如下:
# glance image-list
# ll /var/lib/glance/images/
 
九、Nova 控制节点配置
    Nova 是Openstack 框架中最重要的调度和组织控制器,支持Openstack 私有云实例(instances)生命周期的所有管理操作,可以把Nova 看成是一个负责管理计算资源、网络、认证可扩展的平台。
    Nova 自身并没有提供任何虚拟化能力,它使用libvirt API 来与被支持的Hypervisors虚拟化引擎进行交互,实现虚拟机的创建、销毁、IP配置、管理、重启等操作,Nova 各个模块功能如下:
API:负责接收和响应外部请求,支持Openstack API、EC2 API
Cert:负责身份认证
Scheduler:用于云主机调度   #决策一个虚拟机应该调度到某物理节点,需要分为两个步骤:过滤(fliter)、计算权值(weight)
Conductor:计算节点访问数据的中间件
Consoleauth:用于控制台的授权验证
Novncproxy:VNC代理
 • Nova API调度流程
Nova API 组件实现了restful API功能,是外部访问Nova的唯一途径
接收外部的请求并通过message queue将请求发送给其他的服务组件,同时也兼容EC2 API,所以也可以EC2的管理工具对Nova进行日常管理
 • 配置Openstack Nova 组件服务,配置代码如下:
# cat >/etc/nova/nova.conf <<EOF
[default]
my_ip = 192.168.28.134
enabled_apis = osapi_compute,metadata
auth_strategy = keystone
network_api_class = nova.network.neutronv2.api.API
linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
security_group_api = neutron
firewall_driver = nova.virt.firewall.NoopFirewallDriver
debug = true
#vif_plugging_is_fatal = False
#vif_plugging_timeout = 0
verbose = true
rpc_backend = rabbit
allow_resize_to_same_host = True
scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroup AffinityFilter
[api_database]
[barbican]
[cells]
[cinder]
[conductor]
[cors]
[cors.subdomain]
[database]
connection = mysql://nova:nova@192.168.28.134/nova
[ephemeral_storage_encryption]
[glance]
host = \ $my_ip
[guestfs]
[hyperv]
[image_file_url]
[ironic]
[keymgr]
[keystone_authtoken]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = nova
password = nova
[libvirt]
virt_type = qemu
#virt_type = kvm
[matchmaker_redis]
[matchmaker_ring]
[metrics]
[neutron]
url = http://192.168.28.134:9696
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
service_metadata_proxy = True
metadata_proxy_shared_secret = neutron
lock_path = /var/lib/nova/tmp
[osapi_v21]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_host = 192.168.28.134
rabbit_port = 5672
rabbit_userid = openstack
rabbit_password = openstack
[oslo_middleware]
[rdp]
[serial_console]
[spice]
[ssl]
[trusted_computing]
[upgrade_levels]
[vmware]
[vnc]
novncproxy_base_url = http://192.168.28.134:6080/vnc_auto.html
vncserver_listen = \ $my_ip
vncserver_proxyclient_address = \ $my_ip
keymap = en-us
[workarounds]
[xenserver]
[zookeeper]
EOF
 • 同步Nova 数据库并创建Nova 用户及启动服务,代码如下:
# su -s /bin/sh -c "nova-manage db sync" nova
 • 创建Nova Keystone用户
# openstack user create --domain default --password=nova nova
# openstack role add --project service --user nova admin
 • 启动Nova相关服务
# systemctl enable openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
# systemctl restart openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
 • 在Keystone 注册中心中注册Nova 访问入口服务
# source admin-openrc.sh
# openstack service create --name nova --description "OpenStack Compute" compute
# openstack endpoint create --region RegionOne compute public http://192.168.28.134:8774/v2/%\(tenant_id\)s
# openstack endpoint create --region RegionOne compute internal http://192.168.28.134:8774/v2/%\(tenant_id\)s
# openstack endpoint create --region RegionOne compute admin http://192.168.28.134:8774/v2/%\(tenant_id\)s
至此,Openstack 控制节点Nova服务配置完毕,通过命令openstack host list 查看Openstack 主机列表。# openstack host list
 
十、Nova 计算节点配置
    控制节点Nova配置完毕后,需要配置计算节点Nova服务,计算节点Nova compute主要是接收MQ管理VM的消息,通过libvirt API管理KVM,通过Xen API管理Xen等。
    node 2 Nova 计算节点上安装Nova 相关软件包,代码如下:
 • 安装epel 及Openstack liberty版本YUM源
# yum install -y epel-release
# yum install -y CentOS-release-openstack-liberty
# yum install -y python-openstackclient
 • 安装Openstack Nova计算节点服务
# yum install -y openstack-nova-compute sysfsutils
 • 安装Openstack Neutron网络管理服务
# yum install -y openstack-neutron openstack-neutron-linuxbridge ebtables ipset
 • 安装Openstack Cinder块设备存储模块
# yum install -y openstack-cinder python-cinderclient targetcli python-oslo-policy
 • 升级KVM Qemu管理工具
# yum install -y CentOS-release-qemu-ev.noarch
# yum install qemu -kvm qemu-img -y
 • 计算节点vim修改nova.conf主配置文件,代码如下:
# vim /etc/nova/nova.conf
[default]
my_ip = 192.168.28.135
enabled_apis = osapi_compute,metadata
auth_strategy = keystone
network_api_class = nova.network.neutronv2.api.API
linuxnet_interface_driver = nova.network.linux_net.NeutronLinuxBridgeInterfaceDriver
security_group_api = neutron
firewall_driver = nova.virt.firewall.NoopFirewallDriver
debug = true
#vif_plugging_is_fatal = False
#vif_plugging_timeout = 0
verbose = true
rpc_backend = rabbit
allow_resize_to_same_host = True
scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroup AffinityFilter
[api_database]
[barbican]
[cells]
[cinder]
[conductor]
[cors]
[cors.subdomain]
[database]
connection = mysql://nova:nova@192.168.28.134/nova
[ephemeral_storage_encryption]
[glance]
host = 192.168.28.134
[guestfs]
[hyperv]
[image_file_url]
[ironic]
[keymgr]
[keystone_authtoken]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = nova
password = nova
[libvirt]
virt_type = qemu
#virt_type = kvm
[matchmaker_redis]
[matchmaker_ring]
[metrics]
[neutron]
url = http://192.168.28.134:9696
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
service_metadata_proxy = True
metadata_proxy_shared_secret = neutron
lock_path = /var/lib/nova/tmp
[osapi_v21]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_host = 192.168.28.134
rabbit_port = 5672
rabbit_userid = openstack
rabbit_password = openstack
[oslo_middleware]
[rdp]
[serial_console]
[spice]
[ssl]
[trusted_computing]
[upgrade_levels]
[vmware]
[vnc]
novncproxy_base_url = http://192.168.28.134:6080/vnc_auto.html
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = \ $my_ip
keymap = en-us
[workarounds]
[xenserver]
[zookeeper]
 • 启动计算节点Nova libvirtd及Nova服务,命令如下:
# systemctl enable libvirtd openstack-nova-compute
# systemctl restart libvirtd openstack-nova-compute
 • Openstack 节点测试
    Nova控制节点与计算节点配置完毕,以下为node 1计算节点进行测试,测试命令如下:
# openstack host list       获取Openstack主节点及计算节点
# glance image-list         获取Glance 仓库镜像
# nova image-list            通过Nova API接口获取Glance镜像
 
十一、Neutron 控制节点配置
    Openstack Neutron 组件主要提供云计算的网络虚拟化功能,为Openstack 其他服务提供网络连接服务,为用户提供接口,可以定义netword、subnet、router、DHCP、DNS、负载均衡、L3服务、GRE、VLAN,插件架构支持许多主流的网络厂家和技术。
    Openstack 网络发展经历过3次大的变革和发展,从最早的Nova-network到Quantum,再到最新的Neutron,支持的网络插件越来越多。
 • Neutron 控制节点node 1配置,修改/etc/neutron/neutron.conf主要配置文件,执行如下命令:
# cat > /etc/neutron/neutron.conf<<EOF
[default]
state_path = /var/lib/neutron
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://192.168.28.134:8774/v2
rpc_backend = rabbit
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
[keystone_authtoken]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = neutron
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
[database]
connection = mysql://neutron:neutron@192.168.28.134:3306/neutron
[nova]
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = nova
[oslo_concurrency]
lock_path = $state_path/lock
[oslo_policy]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_host = 192.168.28.134
rabbit_port = 5672
rabbit_userid = openstack
rabbit_password = openstack
[qos]
EOF
 • 创建配置文件ml2_conf.ini、linuxbridge_agent.ini、dhcp_agent.ini、metadata_agent.ini,配置方法如下:
# cat >/etc/neutron/plugins/ml2/ml2_conf.ini<<EOF
[ml2]
type_drivers = flat,vlan,gre,vxlan,geneve
tenant_network_types = vlan,gre,vxlan,geneve
mechanism_drivers = openswitch,linuxbridge
extension_drivers = port_security
[ml2_type_vlan]
flat_networks = physnet1
[ml2_type_vlan]
[ml2_type_gre]
[ml2_type_vxlan]
[ml2_type_geneve]
[securitygroup]
enable_ipset = True
EOF
 
# cat > /etc/neutron/plugins/ml2/linuxbridge_agent.ini<<EOF
[linuxbridge]
physical_interface_mappings = physnet1:eth0
[vxlan]
enable_vxlan = false
[agent]
prevent_arp_spoofing = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = True
EOF
 
# cat >/etc/neutron/dhcp_agent.ini<<EOF
[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
[AGENT]
EOF
 
# cat > /etc/neutron/metadata_agent.ini<<EOF
[DEFAULT]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_region = RegionOne
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = neutron
nova_metadata_ip = 192.168.28.134
metadata_proxy_shared_secret = neutron
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
[AGENT]
EOF
 • 创建Keystone的用户Neutron,更新数据库信息及注册至Keystone中,代码如下:
 • 创建连接并创建Keystone的用户
# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
# openstack user create --domain default --password=neutron neutron
# openstack role add --project service --user neutron admin
 • 更新Neutron 数据库
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
 • 在Keystone注册中心注册网络访问入口服务
# source admin-openrc.sh
# openstack service create --name neutron --description "OpenStack Networking" network
# openstack endpoint create --region RegionOne network public http://192.168.28.134:9696
# openstack endpoint create --region RegionOne network internal http://192.168.28.134:9696
# openstack endpoint create --region RegionOne network admin http://192.168.28.134:9696
 • 因为Neutron和Nova需要关联,对Neutron 进行调整,需要重启openstack-nova-api接口服务,Nova相关服务重启命令如下:
# systemctl restart openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
# systemctl enable neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service
# systemctl restart neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service
# mkdir -p /lock;chmod 777 -R /lock
 • Neutron 节点配置测试
# openstack endpoint list        查看Openstack 所有访问入口服务
 
十二、Neutron 计算节点配置
    Neutron 除了控制节点node 1配置之外,在每台计算节点同样需要进行配置,修改node 2 主配置文件/etc/neutron/neutron.conf内容如下:
# cat >/etc/neutron/neutron.conf<<EOF
[DEFAULT]
state_path = /var/lib/neutron
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
notify_nova_on_port_status_changes = True
nofify_nova_on_port_data_changes = Ture
nova_url = http://192.168.28.134:8774/v2
rpc_backend = rabbit
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
[keystone_authtoken]
auth_uri = http://192.168.28.134:5000
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = neutron
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
[database]
connection = mysql://neutron:neutron@192.168.28.134:3306/neutron
[nova]
auth_url = http://192.168.28.134:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = nova
[oslo_concurrency]
lock_path = $state_path/lock
[oslo_policy]
[oslo_messaging_amqp]
[oslo_messaging_qpid]
[oslo_messaging_rabbit]
rabbit_host = 192.168.28.134
rabbit_port = 5672
rabbit_userid = openstack
rabbit_password = openstack
[qos]
EOF
 • 修改Neutron 相关配置文件linuxbridge_agent.ini、ml2_conf.ini,配置方法如下:
# cat > /etc/neutron/plugins/ml2/linuxbridge_agent.ini<<EOF
[linuxbridge]
physical_interface_mappings = physnet1:eth0
[vxlan]
enable_vxlan = false
[agent]
prevent_arp_spoofing = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = True
EOF
# cat >/etc/neutron/plugins/ml2/ml2_conf.ini<<EOF
[ml2]
type_drivers = flat,vlan,gre,vxlan,geneve
tenant_network_types = vlan,gre,vxlan,geneve
mechanism_drivers = openswitch,linuxbridge
extension_drivers = port_security
[ml2_type_vlan]
flat_networks = physnet1
[ml2_type_vlan]
[ml2_type_gre]
[ml2_type_vxlan]
[ml2_type_geneve]
[securitygroup]
enable_ipset = True
EOF
# mkdir -p /lock;chmod 777 -R /lock
# ln -s  /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
# systemctl enable neutron-linuxbridge-agent.service
# systemctl restart neutron-linuxbridge-agent.service
 
十三、控制节点创建网桥
    Neutron 控制节点和计算节点配置完毕,在node 1控制节点上检查控制节点及计算节点信息,代码如下:
# neutron agent-list
    在node 1控制主节点,创建共享网络,并创建虚拟机分配网段及网关地址,代码如下:
# source admin-openrc.sh
# neutron net-create flat --shared --provider:physical_network physnet1 --provider:network_type flat
# neutron shubnet-create flat 192.168.28.134/24 --name flat-subnet --allocation-pool start=192.168.28.140,end=192.168.28.200 --dns-nameserver 192.168.28.1 --gateway 192.168.28.1
# neutron net-list
# neutron shubnet-list
    创建Openstack 密钥对主要是用于免密码登录,默认创建虚拟机,登录虚拟机需要用户名和密码,创建密钥对之后在控制节点登录新创建的虚拟机可以直接以密钥的方式登录,无须密码,因为创建虚拟机时,会将公钥写入到虚拟机系统中,以下为生成密钥对及创建安全组的方法:
 • 创建ssh keypair 密钥对
# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# nova keypair-add --pub-key /root/.ssh/id_rsa.pub mykey
# nova keypair-list
 • 创建安全组,允许icmp ping、22、80端口
# nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
# nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
# nova secgroup-add-rule default tcp 80 80 0.0.0.0/0
 • 查看Openstack 支持的虚拟机类型
# nova flavor-list
 • 查看Nova 镜像列表
# nova image-list
 • 查看Neutron 网络
# neutron net-list
 • 通过nova指令创建虚拟机,指定网络ID为2d64a8c-d0c6-444e-6a988539ddad,指定镜像名称为cirros,启动命令如下:
# nova boot --flavor m1.tiny --image cirros --nic net-id=6277d20f-d033-42b8-96bc-6565ff07e8a3 --security-group default --key-name mykey hello-instance
    创建虚拟机的时候,Openstack 在Neutron 组网内是采用dhcp-agent 自动分配IP,可以在创建虚拟机的时候,指定固定的IP地址。
 
十四、控制节点配置dashboard
    Openstack 各个组件配置完毕,为了能更加方便、快捷地对虚拟机及Openstack 私有云进行管理,引入dashboard Web界面可以在Web平台中去管理Openstack 相关组件,Openstack Web 部署方法如下:
 • 安装软件包
# yum install openstack-dashboard -y
/etc/openstack-dashboard/local_settings
 • 更改配置文件
# vim /etc/openstack-dashboard/local_settings
 • 158行左右:把这里改成控制节点的IP,下面的URL的%s调用了它;把URL的版本改成v3;把角色改成user,目前我们只有user和admin两种角色,通过openstack role list可以查看
OPENSTACK_HOST = "192.168.28.134"
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
 • 30行左右:允许访问的主机改成*,表示所有,逗号留着,表示列表
ALLOWED_HOSTS = ['*',]
 • 55行左右,若配置API版本,去掉除了56行的注释
OPENSTACK_API_VERSIONS = {
#        "data-processing": 1.1,
        "identity": 3,
        "volume": 2,
        "compute": 2,
}
 • 64行左右:启用对域的支持
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
 • 72行左右:通过仪表盘创建用户时的默认域配置为 default :
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
 • 260行左右:如果您选择网络参数1,禁用支持3层网络服务:需要把下面的True都改成false
OPENSTACK_NEUTRON_NETWORK = {
    ...
    'enable_router': False,
    'enable_quotas': False,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
}
 • 配置时区,改为如下
TIME_ZONE = "Asia/Shanghai"
 • 重启服务
# systemctl restart httpd.service memcached.service
# systemctl reload httpd
 • 浏览器输入
http://192.168.28.134/dashboard
 
十五、Openstack 核心流程
 • Openstack 创建一台虚拟主机的完整流程:
使用者或客户端:Web 页面或Horizon、命令行nova指令
Nova API:用于接收和处理客户端发送的HTTP请求
Nova scheduler:Nova 调度宿主机的服务,决定虚拟机创建的各节点
Nova compute:Nova 核心的服务,负责虚拟机的生命周期的管理
Nova conductor:数据访问权限的控制操作,可以理解为数据库代理服务
Nova cert:管理证书,为了兼容aws
Nova vncproxy和consoleauth:主要提供VNC及auth认证控制台
 • Openstack 组件不同的模块之间是通过HTTP请求rest API服务,同一模块不同组件之通过RPC远程调用,通过RabbitMQ消息异步通信来实现
 • Openstack 所有组件架构图及调用步骤,详解如下:
1.界面或命令行通过RESTful API向keystone获取认证信息。
2.keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求。
3.界面或命令行通过RESTful API向nova-api发送一个boot instance的请求(携带auth-token)。
4.nova-api接受请求后向keystone发送认证请求,查看token是否为有效用户和token。
5.keystone验证token是否有效,如有效则返回有效的认证和对应的角色(注:有些操作需要有角色权限才能操作)。
6.通过认证后nova-api和数据库通讯。
7.初始化新建虚拟机的数据库记录。
8.nova-api通过rpc.call向nova-scheduler请求是否有创建虚拟机的资源(Host ID)。
9.nova-scheduler进程侦听消息队列,获取nova-api的请求。
10.nova-scheduler通过查询nova数据库中计算资源的情况,并通过调度算法计算符合虚拟机创建需要的主机。
11.对于有符合虚拟机创建的主机,nova-scheduler更新数据库中虚拟机对应的物理主机信息。
12.nova-scheduler通过rpc.cast向nova-compute发送对应的创建虚拟机请求的消息。
13.nova-compute会从对应的消息队列中获取创建虚拟机请求的消息。
14.nova-compute通过rpc.call向nova-conductor请求获取虚拟机消息。(Flavor)
15.nova-conductor从消息队队列中拿到nova-compute请求消息。
16.nova-conductor根据消息查询虚拟机对应的信息。
17.nova-conductor从数据库中获得虚拟机对应信息。
18.nova-conductor把虚拟机信息通过消息的方式发送到消息队列中。
19.nova-compute从对应的消息队列中获取虚拟机信息消息。
20.nova-compute通过keystone的RESTfull API拿到认证的token,并通过HTTP请求glance-api获取创建虚拟机所需要镜像。
21.glance-api向keystone认证token是否有效,并返回验证结果。
22.token验证通过,nova-compute获得虚拟机镜像信息(URL)。
23.nova-compute通过keystone的RESTfull API拿到认证k的token,并通过HTTP请求neutron-server获取创建虚拟机所需要的网络信息。
24.neutron-server向keystone认证token是否有效,并返回验证结果。
25.token验证通过,nova-compute获得虚拟机网络信息。
26.nova-compute通过keystone的RESTfull API拿到认证的token,并通过HTTP请求cinder-api获取创建虚拟机所需要的持久化存储信息。
27.cinder-api向keystone认证token是否有效,并返回验证结果。
28.token验证通过,nova-compute获得虚拟机持久化存储信息。
29.nova-compute根据instance的信息调用配置的虚拟化驱动来创建虚拟机。