openstack/murano 概览
概述
murano是openstack的一个PAAS层项目,旨在简化应用部署。
它使用openstack提供的IAAS层服务(nova、neutron、heat)将创建虚拟机部署应用整合起来。
在管理员准备好镜像及其服务包的基础上,使用者可以一键式部署心仪的应用。
从此,将云使用者从创建虚拟机到安装应用的轮回中释放出来,极大的简化云使用者的,提高了服务体验。
比如说有客户需要一个安装了apache的虚拟机,现在需要做的就是点一下按钮:
名词解释
Categories:就是一系列标签,支持app检索
packages:安装包,用户可以从这里导入安装包
Application:应用,安装包中可有多个应用,导入packages后,Application会增加对于的应用
Environments:相关联的应用及其网络组成一个Environments,部署的话是部署的Environments,在Environments中应用叫组件(component)
安装部署
测试
devstack中部署murano,在local.conf中追加如下两行即可
enable_plugin murano git://git.openstack.org/openstack/murano
MURANO_APPS=io.murano.apps.apache.Tomcat,io.murano.apps.Guacamole
另外,为使得你能够从外面访问到devstack创建出来的虚拟机,需要进行如下配置
(具体ip自行调配,比如我的网段是192.168.1)
FLOATING_RANGE=192.168.1.0/24
Q_FLOATING_ALLOCATION_POOL=start=192.168.1.172,end=192.168.1.182
PUBLIC_NETWORK_GATEWAY=192.168.1.1
商用
请参考这里 (我本身只在devstac中部署过,后续部署了再补充)
开发环境参考这里
使用简介
上传应用
(1)Murano>Manage>Package Definitions
(2)选择方式
- 文件:可以安装murano的要求自己规划安装包
用Murano Programming Language (MuranoPL,也就是yaml和yaql)具体看这里和这里。
murano也支持heat模板进行转化,具体如何转换看这里 - Repository:可以自己搭建仓库
- URL:可以使用官方安装包(地址是http://apps.openstack.org/ 间歇性抽风,需翻墙)
- 点击下一步
部署应用
(1)Murano>ApplicationCatalog>Applications
找到需要部署的应用,点击Quick Deploy
(2)配置应用,起个名儿吧
(3)勾选镜像
- 镜像:上传应用的时候,如果使用的是官方源的话,会自动上传个镜像到glance
- key pair :注意这里一定要设置keypair,应用部署出来想登陆虚拟机的话,只能通过这里了。
(4)部署应用
点击部署,这里就开始部署了,运气好的话会部署成功;运气不好的话,等3600秒就会报失败了
(不行,这一节要加一段吐槽)
这里点击完部署后,会通过heat创建个satack,会创建网络,会创建安全组
(注:创建完网络后,需要迅速查看,补充上DNS,我这里使用官方包,默认创建出来的
environment创建的网络子网中默认的没有dns)
然后就会创建虚拟机,虚拟机创建完成后,会按照相应的规划部署应用,这个阶段可以使用上文的key pair登陆到虚拟机中
在/var/murano目录下回看到一系列的plans,就是你的安装规划了。
然后就是应用部署了(到这,听天由命吧):
我在部署的时候,我部署了三种应用,只有数据库的部署成功
一次由于上述的dns问题导致无法加载源,进而murano-agent加载失败
一次由于墙的原因,导致无法下载ruby的包安装失败
体会:如果要使用murano,需要强大的运维能力:
(1)需要管理员根据实际情况自己构建environment,比如网络相关设置等,避免网络不通
(2)需要提前将必备的包下载好,自己做仓库,否则会导致安装时候下不了包,部署失败
(3)或者把应用提前在虚拟机中装好,然后导入到murano,具体看这里
删除应用
kilo有个bug:
删除应用不会释放掉资源,需要删除掉environment采才可以
架构
捡重要的说三点:
- heat:资源的操控通过heat进行的,比如虚拟机网络等相关资源的创建删除,都是通过heat触发的。
- murano-engine:干活的主体,一个自动机,通过反射等技术将用户规划的安装步骤转换为plan,指导murano-agent工作。
- murano-agent:镜像中安装,最终运行在客户机中,接受murano-agent的指令,在客户机中按照规划执行安装工作。
- RabbitMQ:给murano-ageent发送的消息,是通过消息队列传递的
原理
创建一个environment然后开始deploy,后台到底执行了什么?
这里进行简要的剖析,本小节以ApacheHttpServer(io.murano.apps.apache.ApacheHttpServer)为例
(1)命令下发
api收到部署请求后,调用murano-engine实施部署。
json格式的请求体中携带创建environment所必须的对象类型(classes),另外包含用户勾选的相关配置。
如包含:
- io.murano.Environment对象
- 网络对象,用来指向待创建或者已有的网络
- 应用对象,包含引用所需的一切内容,比如应用中可能包含虚拟机,则这里会包含虚拟机的name,flavor,keypair等属性。
对象类型的定义是在文件manifest.yaml中,如下面的例子中class为io.murano.apps.apache.ApacheHttpServer,它指向ApacheHttpServer.yaml
其中ApacheHttpServer.yaml定义了一系列
(2)加载定义(Load definitions)
校验配置文件中的class合法性,尝试初始化这些个对象,此过程会下载所必须的包。
初始化的顺序一般为:
- Network
- Instance
- Object
- Environment
(3)部署资源
执行Environment.deploy,这里首先初始化消息队列,为后续与murano-agent通信做准备。
然后并发调用每个应用的deloy()方法。
本例中,
这一阶段开始与heat交互,进行资源的预创,生成一个带安全组的Heat模板。
然后开始部署虚拟机,包括网络相关的设置等。
部署的虚拟机中,会注入userdata脚本,促使虚拟机起来后执行配置murano-agent。
(4)软件配置
待部署的应用中,如果包含murano-agent组件。
murano-engine会加载DeployApache.templatey,然后通过消息队列传送至murano-agent。
murano-agent接受到消息后,会执行脚本中的EntryPoint方法。
(5)完工
处理完成以上步骤后将结果返回调用者