Solum是由Rackspace的工程师Adrian Otto于2013年9月在Launchpad上提出的一个BP。该项目聚焦于在OpenStack IaaS平台上,构建PaaS层的持续集成/持续交付(CI/CD)应用,可以简单理解为是一个应用程序App的集成开发平台,当然,它可以做很多事情。Murano是一个App Store(应用存储)服务,而Solum可以将开发的应用程序App发布到Murano中。
介绍
https://wiki.openstack.org/wiki/Solum
Solum是由Rackspace的工程师Adrian Otto于2013年9月在Launchpad上提出的一个BP。该项目聚焦于在OpenStack IaaS平台上,构建PaaS层的持续集成/持续交付(CI/CD)应用,可以简单理解为是一个应用程序App的集成开发平台,当然,它可以做很多事情。
Murano是一个App Store(应用存储)服务,而Solum可以将开发的应用程序App发布到Murano中。
它可以实现公有云、私有云或异构云之间的应用可移植性(究其本质是将应用服务docker容器化,而docker可以无差别的运行在异构环境中);通过OpenStack的编排服务Heat实现跨开发者、跨测试、跨生产环境地简化应用程序生命周期管理;集成Git、Jenkins/GitHub持续集成以及集成各种开发环境,如Eclipse、IntelliJ、Komodo等。
Solum使云服务能更简单的应用和集成到用户的开发过程中。通过一个push 按钮就可以提交代码到一个 OpenStack 云上。其本身就是专为 OpenStack 设计的,利用现有的 OpenStack 服务,比如 Heat、Nova、Glance、Keystone、Neutron 等。 同时也是一个社区驱动的项目,这个项目主要贡献者来自Rackspace、eBay、dotCloud、Cumulogic 和 CloudSoft、99Cloud等。
Solum 包括两个逻辑子系统:控制面板和数据面板。如下图所示。
CI/CD的整个工作内容涵盖了最开始的应用程序代码开发—>自动化测试—>软件打包—>自动化部署—>测试验证—>再到最后的应用交付这一完整流程。换言之,Solum让OpenStack同时提供IaaS+PaaS的服务实现提供了可能性。
典型的PaaS功能如,将Git仓库,Eclipse工具,SDK、CLI四个来源的应用通过Heat自动部署到OpenStack管理的Docker容器中,使用Load balancing功能为应用提供负载均衡能力,并使用Neutron 提供对网络的支持(这是目前最好的方式,比Kuddler、Kubernets这些提供的网络都强的多),最后可以使用Ironic裸机服务部署CoreOS系统等。
Solum与Docker容器的集成方式有多种,支持使用Nova的nova-docker插件、Magnum服务和Heat编排服务等。通过集成,Solum得以实现将application部署运行在Docker容器中,而application是以git repo源码方式构建的。
Solum概念理解
在Solum的使用过程中,常涉及到的是languagepack、appfile和变量配置文件等。
Languagepacks负责定义应用程序需要的运行环境。建立一个languagepack,Solum分别需要一个 dockerfile文件和git repo仓库。Solum通过创建一个docker和存储镜像来构建和部署应用程序。自然,languagepack是一个包含了微操作系统、测试工具、build.sh脚本等公共基础服务的base image。
dockerfile文件用于构建docker镜像,而appfile文件则使用yaml语法用来定义你的应用程序。通常包括了应用的版本号、应用程序名称、运行环境(即languagepack)、git repo仓库地址、测试和运行的脚本、应用程序的端口号等。
- 应用程序配置和环境变量文件(params.yaml)
可以使用环境变量对Solum部署的应用程序进行配置,提供一个参数文件在创建应用程序的过程中注入环境变量。类似于OpenStack glance镜像制作中的cloud-init。参数文件也使用yaml语法编写,key:value结构。如下所示。
该项目发展的主要关注点,包括:
包括Git应用、构建和单元测试、生成镜像、运行功能测试、使用Heat部署镜像等;
包括自动化部署、管理和运行apps(monitoring、autoscaling、self-healing)、应用程序版本控制和回滚等;
包括权限(即谁可以部署应用到prod),并运行测试环境等;
包括IDE plugins、SDK、CLI、UI console等;
总体而言,该项目还处于发展阶段,并不是很成熟、稳定。但无疑,Solum和Murano等项目的组合应用将会更加精彩,值得关注和研究。
安装Solum
目前,Solum仅支持在Ubuntu系统上部署,因此这里创建一个新的Ubuntu 14.04版本的虚拟机或物理机,使用root用户登录和DevStack部署。
1)关闭Firewalld
# ufw disable
2)创建一个solumuser用户
# useradd solumuser -m -d /home/solumuser -s /bin/bash
# visudo
# solumuser ALL=(ALL) NOPASSWD: ALL
3)设置solumuser用户密码
# passwd solumuser
4)退出root用户,使用solumuser用户登录
5)设置DevStack
$ DEVSTACK_DIR=”${HOME}/devstack”
$ mkdir -p ${DEVSTACK_DIR}
$ sudo apt-get install -y git python-pip
$sudo git clone https://git.openstack.org/openstack-dev/devstack.git ${DEVSTACK_DIR}
$ cd ${DEVSTACK_DIR}
$sudo wget https://raw.githubusercontent.com/devdattakulkarni/solum-provenance/master/local.conf
$ sudo chown -R solumuser ${DEVSTACK_DIR}
$ sudo chgrp -R solumuser ${DEVSTACK_DIR}
6)执行stack.sh脚本安装
$ cd ${DEVSTACK_DIR}
$ ./stack.sh
该过程中,会提示输入所需的Solum用户名密码。
若安装失败,可以再次执行安装命令。
$ ./unstack.sh && ./stack.sh
使用Solum部署应用
由于目前还不能稳定的在Dashboard页面上使用Solum,故此这里使用Cli命令的方式来使用。
创建 languagepack
1)加载环境变量文件
# source ~/devstack/openrc
2)首先,创建一个名称为Python的languagepack
顾名思义,Languagepack即我们常用的开发语言,可以是Python,也可以是Java、Go等语言。
$ solum languagepack create python \
https://github.com/rackspace-solum-samples/solum-languagepack-python.git
3)查看创建的languagepack信息
$ solum languagepack show python
4)查看创建的python languagepack日志信息
$ solum languagepack logs python
+————————————–+———————+—————————————————————————–+
| resource_uuid | created_at | local_storage |
+————————————–+———————+—————————————————————————–+
| 061e2358-9971-4d32-8da0-3850e0237a6a | 2016-09-24 05:19:07 | /var/log/solum/worker/languagepack-cfeeb79e-11cf-476b-9b5c-4a0673cd84db.log |
+————————————–+———————+—————————————————————————–+
5)查看Solum所有的languagepack
$ solum languagepack list
+————————————–+——–+————-+——–+————————————————————————–+
| uuid | name | description | status | source_uri |
+————————————–+——–+————-+——–+————————————————————————–+
| 061e2358-9971-4d32-8da0-3850e0237a6a | python | None | READY | https://github.com/rackspace-solum-samples/solum-languagepack-python.git |
+————————————–+——–+————-+——–+————————————————————————–+
部署Application
使用YAML文件部署Application。Solum支持使用自定义的YAML文件创建Solum application应用,而项目本身在solum/examples/apps/目录下也自带了些样例,如下所示。
这里,我们使用由Solum项目提供的appfile文件来构建和部署一个Python的web应用程序。在此之前,我们先看看这个yaml文件描述了哪些内容和事情(事件流程)。
该yaml文件工作流程清晰,典型的是一个类似Jenkins持续集成系统所做的活儿。首先是定义了该应用的名称等信息、git clone master分支上的代码仓库,然后,运行单元测试、构建和部署应用程序,最后,将主机的80端口映射到容器的80端口上。
比如,python_app.yaml 文件内容如下所示:
应用程序配置和环境变量
使用Solum部署的应用程序可以使用环境变量进行配置,提供一个参数文件在创建应用程序的过程中注入环境变量。这里,使用一个param.yaml变量文件,用于传递参数给python_app.yaml app应用。
1)使用yaml文件构建应用:
$ solum app create –app-file apps/python_app.yaml –param-file plans/parameters/param.yaml
2)使用deploy命令部署该应用到docker容器中:
$ solum app deploy 887be1d4-3834-4abd-9eee-8a564320aa9f
3)最后,查看该应用的创建状态:
$ solum app show 887be1d4-3834-4abd-9eee-8a564320aa9f
4)一旦应用程序创建好了,即status字段值显示为“DEPLOYMENT_COMPLETE ”时,便可以使用curl命令操作app_url字段的值来操作该应用程序。
$ curl http://10.10.10.142:80
5)正如所述,Solum把languagepack和从源码处构建的应用程序部署在Docker容器中。因此,可以使用docker相关命令对其进行操作。如下查看上面步骤中创建的docker镜像和容器。
$ docker images
$ docker ps -a
如何更新应用开发
如果你熟悉Jenkins和GitHub/GitLab使用,相信对这里所述的流程并不感到陌生。即,当我们把Solum App的trigger_uri地址添加在Github某个项目下的Webhooks后。
这样,当你每次使用git push命令将代码提交到github仓库中时,webhook会发送一个POST请求http://10.10.10.142:9777 /V1/触发器/ < trigger_id >给Solum,让它自动创建一个新的docker镜像,并重新部署你的应用程序。
小结
最后,具体如何去使用,读者们可以结合自身所面临的研发测试、业务流程和CI/CD等挑战和需求,让其更有效的投入到环境中。