时下 Docker 编排工具一瞥
从《 Docker orchestration》这篇有趣的文章中,我们要思考为什么需要编排工具?基本的前提是,编排工具扮演了创建基于应用的容器及其层依赖的时间编排的角色,也就是使容器之间能够通信、彼此可以传递运行期的属性。在此我们更深入地探讨这篇文章的观点。
今日,尚无关于容器作为可移植的部署单位的讯息。但是,通常应用由多个容器构建会增加复杂度。而且,由多个 Docker 镜像组建集群的方式颇为笨重,因为这需要让容器感知其他容器的存在并暴露内部信息给其需要通信的容器。这并非小事一桩,尤其是当容器分布在不同主机上时。例如,构建一个由 Docker 容器组成的 Mongo 或者 Cassandra 集群,需要考虑集群环境内,哪些端口需要暴露、哪些卷(volume)需要挂载(mount)等复杂信息。
这些场景驱动了一些编排工具的发展,正如这篇关于 Docker 容器和微服务的优秀文章提出并由这篇 InfoQ 文章所引述的,列表中的容器编排工具正在快速成长。这里列出其中著名的工具(当然这不是全部)。
- Kubernetes - Google 出品的开源 Docker 容器编排工具,特别为微服务的编排而设计。
- Fleet - CoreOS 的 Docker 编排工具,为在 CoreOS 上安装容器而设计。
- Docker - Docker 最近公布了 Docker Swarm 和 Compose,这是为运行 Docker 集群而设计的编排服务。
此外,CoreOS 最近公布了 Rocket,我们将有幸一窥这另一种格式的容器将如何影响编排工具的前景。
纯粹的编排标准的必要性
我们经常使用可搬运的容器(shipping containers)来形容软件容器作为标准打包单位的角色。可搬运的容器是标准化益处的极佳示例。没有标准的容器,搬运货物的场景将与今天完全不同。就可搬运的容器而言,容器的形状、体积和装配的实际标准不会受制于单一的容器厂商,而更趋向于多家厂商共存。CoreOS 近期公布的 Rocket 只是这一趋势的首个象征。
用 TOSCA 来解决
TOSCA (云应用的拓扑编排标准,Topology Orchestration Specification for Cloud Applications)是由 OASIS 组织 (XML 的制定者)管理的。从 TOSCA 编排工具的跟踪记录和发展速度上看,已经发展得相当成熟,许多组织正在投注和促进其成功。 自多年前的第二版以来,TOSCA 得到了长足的发展,同时在商业和开源项目中吸引眼球,博得了诸如 Juju、Cloudify、IBM Cloud Orchestrator 和 OpenStack Heat 的芳心。同时也被电信供应商领袖阿尔卡特 - 朗讯、 华为和思科所采纳。
事实上,TOSCA 由标准团体(OASIS)在背后支持,使其成为强大的平台来定义能够可移植于各种云环境和容器提供商的标准容器编排工具的规范。
本文将提供一个示例来展示把当前的 Docker API 标准映射到可移植的 TOSCA 标准是多么的简单,因此,我们将使用直观的声明式方式来描述复杂的基于 Docker 的应用拓扑。
Docker 的 TOSCA 规划
为使初始的映射过程简单,我们使用 python 客户端 docker-py 作为如下提案的基础。
接下来是 TOSCA 规划的代码片段,用来描述基于 Docker 的 MongoDB 服务器–更大的应用拓扑的一部分。映射按照最新的 TOSCA 规范中的 YAML 格式和 Docker 容器建议的模型工具来使用 TOSCA。
mongod: type: docker_container properties: image: dockerfile/mongodb command: mongod --rest --httpinterface --smallfiles exported_ports: - 27017 - 28017 port_bindings: - 27017: 27017 - 28017: 28017 volumes: - ~/my-host-dir, container-dir, rw
TOSCA 格式非常类似其他类型的依赖注入,主要的不同是基于 YAML 并且更特定于编排领域。因此,其中包含了生命周期、关系、策略和计划,还描述了应用服务的运作方面的定义。
使用 TOSCA 运行简单的 Docker 示例
我将使用 Cloudify 上的开源编排工具、一个简单的 TOSCA 命令行分析器让你感受基于 TOSCA 的编排工具是如何工作的。
我们将使用基于 NodeJS 的 web 应用 nodecellar 示例,后台数据库使用 MongoDB。每个服务将运行在独立的 Docker 容器中,如下图所示。
从 DockerHub 下载 nodecellar TOSCA 规划的 Docker 镜像,该镜像可以重用于后续的安装和卸载。从镜像启动整个应用的镜像启动约 10 秒左右!
示例逐步指导
示例在 12.04 作为底层的操作系统的环境中测试过。示例可以有两种规划实现,一种是单一主机部署,另一种是 OpenStack 上的集群部署。简单起见,本文重点放在单一主机部署的示例上。
通过如下步骤运行示例
搭建环境 安装 Docker |> curl -sSL https://get.docker.com/ubuntu/ \| sudo sh
使用如下命令检查安装是否正确:
sudo docker ps 安装 Cloudify |> pip install cloudify
使用如下命令检查安装是否正确:
cfy --version
也可以使用 vagrant-box 获取 cloudify 的预配置镜像或者其他安装选项如这里所述 安装 TOSCA/Docker 示例 下载示例 从此处下载和解压缩示例 将当前 TOSCA 规划指向示例规划文件 |>cfy local init -p blueprint/docker-singlehost-blueprint.yaml -i blueprint/cfy-local-inputs.json --install-plugins 执行安装流程 |>sudo cfy local execute -w install
这个命令将在规划上执行上一步设置好的安装流程。
安装 / 卸载流程是每个规划的隐式工作流程之一。安装流程将遍历 TOSCA 依赖关系图,并按照指定的关系和依赖定义的顺序,在每个节点上执行生命周期命令。卸载流程是类似的逆操作。
在这份规划中,在第一次运行时将下载 Docker 镜像(这将耗时几分钟),然后运行两个 Docker 实例,一个是 mongod 实例,另一个是 nodejs 实例,应用和数据库会安装到对应的实例上。 检查输出 > cfy local outputs
输出应当打印出 nodecellar 应用的主机: 端口号 打开应用 使用上一步的主机名和端口号在浏览器中打开如下链接: http:// 输出的主机名: 输出的端口号 注意,如果运行在 vagrant-box 上,应当替换默认的 host_ip 属性值 localhost 为 vagrant 虚拟机主机 IP
写在最后
以当前 IT 基础设施的演进速度,可以假设我们将继续拥有多家容器供应商和编排引擎。照此观点,定义和管理容器集群的规范将会标准化,并由多家容器或编排工具的供应商支持,否则容器作为可移植的搬运单位将受到质疑。
此外,我们必须假设许多公司将全部应用都运行于容器之内的期待是不切实际的,更可能的情况是运行混合的应用。为每种应用类型设计编排引擎很容易出现运作上的噩梦,这是存在多种既支持不同容器又支持混合环境(包括基于 Chef、 Puppet、SaltStack 等等的非容器化服务)的独立编排引擎另一个原因。
TOSCA 当前编排规范的先进性使其成为容器标准蓝图的定义的理想候选者。
拥有标准的编排格式并非考虑选择 TOSCA 的唯一因素,不像大多数当下基于容器的编排工具几乎完全处理初试设置和安装阶段的事情,TOSCA 覆盖了整个应用的生命周期,包括部署后的事情,如监控、额外的工作流程(持续部署、水平扩展、订正)以及自动触发这些工作流程的策略,从而提供了更全面的编排定义。
这项工作的目的是为了说明使用标准的 TOSCA YAML 编排 Docker 的应用是多么简单。我希望这篇文章能为社区的讨论和头脑风暴提供良好的基础。
参考
- ANNOUNCING DOCKER MACHINE, SWARM, AND COMPOSE FOR ORCHESTRATING DISTRIBUTED APPS
- Docker orchestration…what it means and why you need it.
关于作者
Nati Shalom是 GigaSpaces 的创始人和 CTO、云计算和大数据技术的思想领袖。最近,Shalom 被 CIO Magazine 认定为顶级云计算博主,他的博客被 YCombinator 列为 卓越博客,同时因其在OpenStack 社区的贡献获得 HP Helion MVP 奖 。Shalom 还是 OpenStack 以色列组的创始人和领导者之一,经常出席行业会议。
查看英文原文: Simple TOSCA Orchestration for Docker
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流。
评论