Solum简介

solum是部署web application的项目。
web app都是跑在各种web server中,所以solum的操作就分为了languagepack和app两个部分。

solum的作用

  • 搭建自动测试系统,并且可以设置在多个版本的runtime环境中进行测试。
  • 自动化部署
  • 应用开发的整个生命周期管理
  • 上述这些都可以和github和docker的特性结合起来,快捷方便
  • CI/CD

下面是部署部署一个app的流程的用到的命令总览:

1
2
3
4
5
6
7
$ solum languagepack create <NAME> <GIT_REPO>
$ solum languagepack show <UUID/Name>
$ solum languagepack logs <UUID>
$ solum languagepack list
$ solum app create --app-file <app_file> [--param-file param_file]
$ solum app show <UUID/Name>
$ curl <application_uri>

languagepack

这个步骤可以创建python、java或其他语言的web应用运行环境。
languagepack需要指定一个git repo,下载Dockerfile和build.sh。

  • Dockerfile用来创建docker image。
1
2
3
4
5
6
7
FROM ubuntu:14.04

RUN apt-get -yqq update
RUN apt-get -yqq install python-pip
RUN apt-get -yqq install python-dev

COPY build.sh /solum/bin/
  • build.sh用来在创建app时执行。
1
2
3
4
5
6
7
8
9
#!/bin/bash

# Check if pip is installed
pip help
[[ $? != 0 ]] && echo python-pip is not installed. && exit 1

# Install dependencies from app requirements file
cd /app
pip install -r requirements.txt

app

创建app会包含一个workflow流程,根据已有的languagepack创建最终的deployment unit(DU),然后用heat去部署.

deployment unit(DU)

DU就是一个打包好的安装了运行环境和application的docker image,可以直接用来创建container运行。
当然这个docker image需要languagepack和app两个步骤最终完成创建。

workflow

  • unittest
  • build
  • deploy

标准的三个步骤,但是这个三个步骤可以选择性的执行,比如只执行unittest和build.

workflow的相关信息都是在appfile.yaml里定义,由参数–app-file指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: 1
name: cherrypy
description: python web app
languagepack: python
source:
repository: https://github.com/rackspace-solum-samples/solum-python-sample-app.git
revision: master
workflow_config:
test_cmd: ./unit_tests.sh # 在unittest步骤里执行什么命令
run_cmd: python app.py # 在build步骤执行什么命令
trigger_actions:
- unittest
- build
- deploy # 就是nova boot的步骤,不过这个依赖nova-docker
ports:
- 80
  • unittest会根据LP去执行docker build,执行unittest脚本,但是不会保存到glance或swift里
  • build这个步骤,根据LP执行docker build,执行build.sh脚本,最终保存到glance或swift里
  • deploy就是通过heat进行nova boot的步骤,依赖nova-docker驱动,从neutron申请IP,从glance下载image。这些取代了直接通过docker的api进行创建容器。
    这个步骤可以和k8s、mesos以及swarm结合使用。
    solum的配置文件中有这个参数:docker_daemon_url = unix://var/run/docker.sock
    solum的对docker的操作,都是通过url的remote API进行请求的。那么,对于docker服务,可以是单独的docker服务,也可以是k8s之类的集群,只要提供和docker一致的API。

https://wiki.openstack.org/wiki/Solum/configurations solum的deploy可以基于docker部署,也可以基于VM

  • docker
  • VM
    • /etc/nova/nova.conf compute_driver = libvirt.LibvirtDriver
    • /etc/solum/solum.conf image_storage = swift,image_format = vm

当用VM在solum里部署应用时,步骤比较绕

  • 用disk-image-builder创建带有docker的VM image
  • 用这个image创建docker的container,再通过docker的api去安装app的源码,进行测试等操作,最后把image保存到glance
  • 最终用这个image部署在VM上

param_file

solum app create时也可以用–param-file指定想要inject的参数
这些参数可以通过build步骤里命令脚本去操作

app代码的自动更新部署

app的代码也在git里,而且可以在自己的git里设置hook,在提交代码后,自动向这个web app的地址发送一个POST请求

1
http://10.0.2.15:9777/v1/triggers/<trigger_id>

solum会自动重新build一个新的image然后重新部署app

如果是github的源码,在project的设置里可以设定这个trigger url

devstack开发环境

一共有两种方式,一种用vagrant一种用devstack,直接devstack就可以。

wiki文档地址:https://wiki.openstack.org/wiki/Solum/solum-development-setup

  • local.conf文件直接从它提供的外网地址下载
  • local.conf的配置尤其是密码最好别变,有的服务的密码没有做成可配置,仍然是默认的solum,改动会导致后续的验证失败。
  • nova和neutron先手动下载源码后再git checkout到指定的change id里,应该是最新代码还没测试完。