Cloudify是一个开源的云应用编排系统,它允许使用DSL来描述应用的拓扑结构,并部署到任意环境中。本文大量参考了官方教程从零开始搭建并管理一个cloudify 3.3.1集群。
准备工作
我们需要先安装virtualBox和vagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test
,运行以下命令:
virtual box host1 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。
Vagrantfile1 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 11 2
| vagrant up vagrant ssh manager
|
搭建环境
在Ubuntu上安装cloudify很简单,在agent上运行以下命令即可:
agent1 2
| wget -c http://repository.cloudifysource.org/org/cloudify3/get-cloudify.py sudo python get-cloudify.py
|
安装完了之后,运行以下命令可以看到cloudify命令行的版本及帮助文档:
部署应用
Cloudify的应用被称为蓝图(blueprint),这个名字很好地诠释了它在主页上声称的“从蓝图到生产环境(From Blueprint to Production)”。官方已经为我们的第一次使用准备了一个Hello World,让我们先下载下来:
agent1 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/
|
接下来初始化下载的蓝图并传入端口等参数:
agent1
| cfy local init --blueprint-path blueprint.yaml --inputs '{"webserver_port": "8000", "host_ip":"localhost"}'
|
Cloudify使用工作流(workflow)来管理应用程序。现在启动install工作流来部署一个python的web服务器:
agent1 2
| cfy local execute --workflow install curl localhost:8000
|
也可以在启动vagrant虚拟机的主机上访问:http://192.168.33.18:8000:
短短几步,我们便顺利部署了一个应用。通过以下命令可以看到一些运行的参数:
我们看到的内容称之为模型(model)。蓝图是应用的模板,蓝图的实例称为部署(deployment),部署就是模型的内容之一。蓝图里的每个实体称之为节点(node),节点在部署里称为节点实例(node-instances),它们是一对多的关系。但是在这个例子里,我们有两个节点,每个节点各有一个节点实例。可以用以下命令查看节点实例:
我们能看到这两个节点实例分别是host和http_web_server,其中http_web_server运行在host之上。可以用以下命令来结束部署:
agent1
| cfy local execute -w uninstall
|
蓝图解析
现在让我们看一看刚才所用的蓝图的结构:
这就是一个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容器的蓝图:
agent1 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的插件,所以必须先安装一下,然后就可以初始化蓝图(这次不传参数,使用默认值):
agent1 2 3
| cfy local create-requirements -o requirements.txt -p blueprint.yaml sudo pip install -r requirements.txt cfy local init -p blueprint.yaml
|
现在可以运行啦。由于第一次运行需要下载镜像,可能会比较慢:
agent1 2 3
| cfy local execute -w install docker ps docker images
|
总算是可以访问了:
也可以在启动vagrant虚拟机的主机上访问:http://192.168.33.18:8080。查看运行参数和节点实例:
agent1 2
| cfy local outputs cfy local instances
|
可以用以下命令来结束部署:
agent1 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的应用:
manager1 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个节点:
- host:部署的主机
- mongod:mongoDB,运行在host上
- nodejs:nodejs服务器,运行在host上
- nodec…:显示不下的nodecellar,也就是这个酒窖应用,运行在nodejs服务器上,它会去访问mongoDB
接下来让我们生成一个部署对象:
manager1 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条记录。接下来,真正地开始部署:
manager1
| cfy executions start -w install -d nodecellar
|
部署需要一些时间,在笔者的mac上大约5分钟。这时如果刷新部署页面,就能看到Action显示Install,旁边还有一个×
号,可以通过点击它来取消本次部署。点击部署页面上nodecellar的ID,就能看到一系列详细信息,甚至还有监控:
部署完成后,就可以直接访问http://192.168.33.17:8080/来打开这个nodejs酒窖的网站了:
还可以用以下命令来停止nodecellar的部署,并删除这个部署:
manager1 2
| cfy executions start -w uninstall -d nodecellar cfy deployments delete -d nodecellar
|
值得一提的是,刚才我们输入的命令,都可以通过cloudify manager的界面来操作。如果需要停止cloudify manager,可以用以下命令: