文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 部署应用
  4. 4. 蓝图解析
  5. 5. 部署容器
  6. 6. Cloudify管理器

Cloudify是一个开源的云应用编排系统,它允许使用DSL来描述应用的拓扑结构,并部署到任意环境中。本文大量参考了官方教程从零开始搭建并管理一个cloudify 3.3.1集群。

准备工作

我们需要先安装virtualBoxvagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:

virtual box host
1
2
3
4
mkdir test
cd test
vagrant init minimum/ubuntu-trusty64-docker
vi Vagrantfile

里面应该有一句config.vm.box = "minimum/ubuntu-trusty64-docker",注释掉并在它的下面添加如下几行代码,相当于给它分配两台虚拟机,一台叫做manager,它的IP是192.168.33.17;另一台叫做agent,它们的IP是192.168.33.18

Vagrantfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
config.vm.define "manager" do | host |
host.vm.box = "cloudify-virtualbox_3.3.0-ga-b300.box"
host.vm.box_url = "http://repository.cloudifysource.org/org/cloudify3/3.3.0/ga-RELEASE/cloudify-virtualbox_3.3.0-ga-b300.box"
host.vm.hostname = "manager"
host.vm.network "private_network", ip: "192.168.33.17"
host.vm.provider "virtualbox" do |v|
v.memory = 2048
end
end
config.vm.define "agent" do | host |
host.vm.box = "minimum/ubuntu-trusty64-docker"
host.vm.hostname = "agent"
host.vm.network "private_network", ip: "192.168.33.18"
end

虚拟机agent所用的vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。虚拟机manager用的远程镜像是cloudify官方镜像,提供了cloudify manager功能。然后分别在两个终端运行以下命令启动并连接两台虚拟机。

virtual box host terminal 1
1
2
vagrant up
vagrant ssh manager

virtual box host terminal 2
1
vagrant ssh agent

搭建环境

在Ubuntu上安装cloudify很简单,在agent上运行以下命令即可:

agent
1
2
wget -c http://repository.cloudifysource.org/org/cloudify3/get-cloudify.py
sudo python get-cloudify.py

安装完了之后,运行以下命令可以看到cloudify命令行的版本及帮助文档:

agent
1
2
cfy --version
cfy -h

部署应用

Cloudify的应用被称为蓝图(blueprint),这个名字很好地诠释了它在主页上声称的“从蓝图到生产环境(From Blueprint to Production)”。官方已经为我们的第一次使用准备了一个Hello World,让我们先下载下来:

agent
1
2
3
4
wget -c https://github.com/cloudify-examples/simple-python-webserver-blueprint/archive/master.zip
sudo apt-get install -f unzip
unzip master.zip
cd simple-python-webserver-blueprint-master/

接下来初始化下载的蓝图并传入端口等参数:

agent
1
cfy local init --blueprint-path blueprint.yaml --inputs '{"webserver_port": "8000", "host_ip":"localhost"}'

Cloudify使用工作流(workflow)来管理应用程序。现在启动install工作流来部署一个python的web服务器:

agent
1
2
cfy local execute --workflow install
curl localhost:8000

也可以在启动vagrant虚拟机的主机上访问:http://192.168.33.18:8000

短短几步,我们便顺利部署了一个应用。通过以下命令可以看到一些运行的参数:

agent
1
cfy local outputs

我们看到的内容称之为模型(model)。蓝图是应用的模板,蓝图的实例称为部署(deployment),部署就是模型的内容之一。蓝图里的每个实体称之为节点(node),节点在部署里称为节点实例(node-instances),它们是一对多的关系。但是在这个例子里,我们有两个节点,每个节点各有一个节点实例。可以用以下命令查看节点实例:

agent
1
cfy local instances

我们能看到这两个节点实例分别是host和http_web_server,其中http_web_server运行在host之上。可以用以下命令来结束部署:

agent
1
cfy local execute -w uninstall

蓝图解析

现在让我们看一看刚才所用的蓝图的结构:

agent
1
cat blueprint.yaml

这就是一个yaml格式的文件,里面都是cloudify的DSL。文件分为以下五个部分:

  • tosca_definitions_version:蓝图的DSL版本,这里是cloudify_dsl_1_2
  • imports:引用yaml文件的地址
  • inputs:蓝图的配置信息,也就是一开始初始化蓝图时传入的参数
  • node_templates:描述了应用的资源以及应用是如何被部署的,可以跟刚才看到的节点实例相对应起来
  • outputs:输出信息,也就是刚才看到的模型里的内容

其中包括了三个内置函数(Intrinsic Functions),分别是get_inputget_propertyconcat,只能在蓝图里使用。它们的意思也都比较明显,可以从函数名推断出来。所有的内置函数可以在这里查看到。

部署容器

Cloudify通过docker插件来支持docker。这个插件依赖于Docker Python API库,而不是Docker CLI,所以体验上有所不同。比如说,docker run将会被分解为docker createdocker start。接下来让我们来尝试部署一个tomcat容器。首先需要生成一个tomcat容器的蓝图:

agent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
mkdir ../docker
cd ../docker
cat << EOF > blueprint.yaml
tosca_definitions_version: cloudify_dsl_1_2
imports:
- http://www.getcloudify.org/spec/cloudify/3.4m3/types.yaml
- http://www.getcloudify.org/spec/docker-plugin/1.3.1/plugin.yaml
inputs:
host_ip:
description: >
The ip of the host the application will be deployed on
default: 127.0.0.1
tomcat_container_port_bindings:
description: >
A dict of port bindings for the node container.
default:
8080: 8080
node_templates:
host:
type: cloudify.nodes.Compute
properties:
install_agent: false
ip: { get_input: host_ip }
tomcat_container:
type: cloudify.docker.Container
properties:
name: tomcat
image:
repository: tomcat
tag: 8.0.30-jre8
interfaces:
cloudify.interfaces.lifecycle:
create:
implementation: docker.docker_plugin.tasks.create_container
inputs:
params:
stdin_open: true
tty: true
start:
implementation: docker.docker_plugin.tasks.start
inputs:
params:
port_bindings: { get_input: tomcat_container_port_bindings }
relationships:
- type: cloudify.relationships.contained_in
target: host
outputs:
http_endpoint:
description: Tomcat web server endpoint
value: { 'http://localhost:8080' }
EOF

这个蓝图需要docker的插件,所以必须先安装一下,然后就可以初始化蓝图(这次不传参数,使用默认值):

agent
1
2
3
cfy local create-requirements -o requirements.txt -p blueprint.yaml
sudo pip install -r requirements.txt
cfy local init -p blueprint.yaml

现在可以运行啦。由于第一次运行需要下载镜像,可能会比较慢:

agent
1
2
3
cfy local execute -w install
docker ps
docker images

总算是可以访问了:

agent
1
curl localhost:8080

也可以在启动vagrant虚拟机的主机上访问:http://192.168.33.18:8080。查看运行参数和节点实例:

agent
1
2
cfy local outputs
cfy local instances

可以用以下命令来结束部署:

agent
1
2
cfy local execute -w uninstall
docker ps -a

看起来容器会被删除。感觉怎么样?你愿意天天这样来部署docker么?

Cloudify管理器

除了命令行以外,cloudify也支持使用管理器来部署应用。Cloudify管理器有自己的用户界面,提供历史记录、授权和鉴权等功能,并且支持并行运行工作流。下面我们来试着安装一个cloudify管理器。启动cloudify管理器就像是启动一个普通的蓝图一样。可是安装需要下载一大堆的依赖,比较繁琐,有兴趣的童鞋可以参考官方教程。官方另外还提供了一个vagrant镜像,里面已经配置好了整个Cloudify管理器,因为我们启动vagrant的时候就已经导入了,直接用它更方便。只要虚拟机启动起来(按照本教程的话,现在是起来的状态),可以直接访问http://192.168.33.17/来打开cloudify管理器的页面了:

接下来我们来上传一个官方的蓝图,这是nodejs调用mongodb的应用:

manager
1
2
3
4
5
cd blueprints
git clone https://github.com/cloudify-cosmo/cloudify-nodecellar-example
cd cloudify-nodecellar-example/
git checkout tags/3.3
cfy blueprints upload -b nodecellar -p simple-blueprint.yaml

-b参数的nodecellar是这个蓝图的名字。刷新蓝图的界面,我们就能看到一个名为nodecellar的蓝图。点击进去,还能看到更详细的拓扑结构、节点信息等。甚至还可以点击图上的各个组件查看详细信息:

这里有4个节点:

  1. host:部署的主机
  2. mongod:mongoDB,运行在host上
  3. nodejs:nodejs服务器,运行在host上
  4. nodec…:显示不下的nodecellar,也就是这个酒窖应用,运行在nodejs服务器上,它会去访问mongoDB

接下来让我们生成一个部署对象:

manager
1
2
sed -i 's/host_ip: .*/host_ip: 192.168.33.17/' ../inputs/nodecellar-singlehost.yaml
cfy deployments create -b nodecellar -d nodecellar --inputs ../inputs/nodecellar-singlehost.yaml

-d参数的nodecellar是这个部署的ID。页面上点击左边的Deployments,我们就能看到ID为nodecellar的部署了。而Logs & Events里面也生成了好几页日志和事件。与此同时,最左下的Nodes也出现了4条记录。接下来,真正地开始部署:

manager
1
cfy executions start -w install -d nodecellar

部署需要一些时间,在笔者的mac上大约5分钟。这时如果刷新部署页面,就能看到Action显示Install,旁边还有一个×号,可以通过点击它来取消本次部署。点击部署页面上nodecellar的ID,就能看到一系列详细信息,甚至还有监控:

部署完成后,就可以直接访问http://192.168.33.17:8080/来打开这个nodejs酒窖的网站了:

还可以用以下命令来停止nodecellar的部署,并删除这个部署:

manager
1
2
cfy executions start -w uninstall -d nodecellar
cfy deployments delete -d nodecellar

值得一提的是,刚才我们输入的命令,都可以通过cloudify manager的界面来操作。如果需要停止cloudify manager,可以用以下命令:

manager
1
cfy teardown -f

文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 部署应用
  4. 4. 蓝图解析
  5. 5. 部署容器
  6. 6. Cloudify管理器