Cloudify是一个开源的云应用编排系统,它允许使用DSL来描述应用的拓扑结构,并部署到任意环境中。本文大量参考了官方教程从零开始搭建并管理一个cloudify 3.3.1集群。
准备工作
我们需要先安装virtualBox和vagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:
1 | mkdir test |
里面应该有一句config.vm.box = "minimum/ubuntu-trusty64-docker",注释掉并在它的下面添加如下几行代码,相当于给它分配两台虚拟机,一台叫做manager,它的IP是192.168.33.17;另一台叫做agent,它们的IP是192.168.33.18。
1 | config.vm.define "manager" do | host | |
虚拟机agent所用的vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。虚拟机manager用的远程镜像是cloudify官方镜像,提供了cloudify manager功能。然后分别在两个终端运行以下命令启动并连接两台虚拟机。
1 | vagrant up |
1 | vagrant ssh agent |
搭建环境
在Ubuntu上安装cloudify很简单,在agent上运行以下命令即可:
1 | wget -c http://repository.cloudifysource.org/org/cloudify3/get-cloudify.py |
安装完了之后,运行以下命令可以看到cloudify命令行的版本及帮助文档:
1 | cfy --version |
部署应用
Cloudify的应用被称为蓝图(blueprint),这个名字很好地诠释了它在主页上声称的“从蓝图到生产环境(From Blueprint to Production)”。官方已经为我们的第一次使用准备了一个Hello World,让我们先下载下来:
1 | wget -c https://github.com/cloudify-examples/simple-python-webserver-blueprint/archive/master.zip |
接下来初始化下载的蓝图并传入端口等参数:
1 | cfy local init --blueprint-path blueprint.yaml --inputs '{"webserver_port": "8000", "host_ip":"localhost"}' |
Cloudify使用工作流(workflow)来管理应用程序。现在启动install工作流来部署一个python的web服务器:
1 | cfy local execute --workflow install |
也可以在启动vagrant虚拟机的主机上访问:http://192.168.33.18:8000:
短短几步,我们便顺利部署了一个应用。通过以下命令可以看到一些运行的参数:
1 | cfy local outputs |
我们看到的内容称之为模型(model)。蓝图是应用的模板,蓝图的实例称为部署(deployment),部署就是模型的内容之一。蓝图里的每个实体称之为节点(node),节点在部署里称为节点实例(node-instances),它们是一对多的关系。但是在这个例子里,我们有两个节点,每个节点各有一个节点实例。可以用以下命令查看节点实例:
1 | cfy local instances |
我们能看到这两个节点实例分别是host和http_web_server,其中http_web_server运行在host之上。可以用以下命令来结束部署:
1 | cfy local execute -w uninstall |
蓝图解析
现在让我们看一看刚才所用的蓝图的结构:
1 | cat blueprint.yaml |
这就是一个yaml格式的文件,里面都是cloudify的DSL。文件分为以下五个部分:
- tosca_definitions_version:蓝图的DSL版本,这里是cloudify_dsl_1_2
- imports:引用yaml文件的地址
- inputs:蓝图的配置信息,也就是一开始初始化蓝图时传入的参数
- node_templates:描述了应用的资源以及应用是如何被部署的,可以跟刚才看到的节点实例相对应起来
- outputs:输出信息,也就是刚才看到的模型里的内容
其中包括了三个内置函数(Intrinsic Functions),分别是get_input,get_property和concat,只能在蓝图里使用。它们的意思也都比较明显,可以从函数名推断出来。所有的内置函数可以在这里查看到。
部署容器
Cloudify通过docker插件来支持docker。这个插件依赖于Docker Python API库,而不是Docker CLI,所以体验上有所不同。比如说,docker run将会被分解为docker create和docker start。接下来让我们来尝试部署一个tomcat容器。首先需要生成一个tomcat容器的蓝图:
1 | mkdir ../docker |
这个蓝图需要docker的插件,所以必须先安装一下,然后就可以初始化蓝图(这次不传参数,使用默认值):
1 | cfy local create-requirements -o requirements.txt -p blueprint.yaml |
现在可以运行啦。由于第一次运行需要下载镜像,可能会比较慢:
1 | cfy local execute -w install |
总算是可以访问了:
1 | curl localhost:8080 |
也可以在启动vagrant虚拟机的主机上访问:http://192.168.33.18:8080。查看运行参数和节点实例:
1 | cfy local outputs |
可以用以下命令来结束部署:
1 | cfy local execute -w uninstall |
看起来容器会被删除。感觉怎么样?你愿意天天这样来部署docker么?
Cloudify管理器
除了命令行以外,cloudify也支持使用管理器来部署应用。Cloudify管理器有自己的用户界面,提供历史记录、授权和鉴权等功能,并且支持并行运行工作流。下面我们来试着安装一个cloudify管理器。启动cloudify管理器就像是启动一个普通的蓝图一样。可是安装需要下载一大堆的依赖,比较繁琐,有兴趣的童鞋可以参考官方教程。官方另外还提供了一个vagrant镜像,里面已经配置好了整个Cloudify管理器,因为我们启动vagrant的时候就已经导入了,直接用它更方便。只要虚拟机启动起来(按照本教程的话,现在是起来的状态),可以直接访问http://192.168.33.17/来打开cloudify管理器的页面了:
接下来我们来上传一个官方的蓝图,这是nodejs调用mongodb的应用:
1 | cd blueprints |
-b参数的nodecellar是这个蓝图的名字。刷新蓝图的界面,我们就能看到一个名为nodecellar的蓝图。点击进去,还能看到更详细的拓扑结构、节点信息等。甚至还可以点击图上的各个组件查看详细信息:
这里有4个节点:
- host:部署的主机
- mongod:mongoDB,运行在host上
- nodejs:nodejs服务器,运行在host上
- nodec…:显示不下的nodecellar,也就是这个酒窖应用,运行在nodejs服务器上,它会去访问mongoDB
接下来让我们生成一个部署对象:
1 | sed -i 's/host_ip: .*/host_ip: 192.168.33.17/' ../inputs/nodecellar-singlehost.yaml |
-d参数的nodecellar是这个部署的ID。页面上点击左边的Deployments,我们就能看到ID为nodecellar的部署了。而Logs & Events里面也生成了好几页日志和事件。与此同时,最左下的Nodes也出现了4条记录。接下来,真正地开始部署:
1 | cfy executions start -w install -d nodecellar |
部署需要一些时间,在笔者的mac上大约5分钟。这时如果刷新部署页面,就能看到Action显示Install,旁边还有一个×号,可以通过点击它来取消本次部署。点击部署页面上nodecellar的ID,就能看到一系列详细信息,甚至还有监控:
部署完成后,就可以直接访问http://192.168.33.17:8080/来打开这个nodejs酒窖的网站了:
还可以用以下命令来停止nodecellar的部署,并删除这个部署:
1 | cfy executions start -w uninstall -d nodecellar |
值得一提的是,刚才我们输入的命令,都可以通过cloudify manager的界面来操作。如果需要停止cloudify manager,可以用以下命令:
1 | cfy teardown -f |