写点什么

简单的 Docker 编排工具 TOSCA

  • 2015-04-06
  • 本文字数:3208 字

    阅读完需:约 11 分钟

时下 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 的应用是多么简单。我希望这篇文章能为社区的讨论和头脑风暴提供良好的基础。

参考

关于作者

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2015-04-06 04:1110907

评论

发布
暂无评论
发现更多内容

加密算法是什么?有哪几种类型?有什么用?

行云管家

加密算法

HUAWEI DevEco Studio 3.1版本发布,配套ArkTS声明式开发全面升级

HarmonyOS开发者

HarmonyOS

有奖报名|StarRocks 获开源热力值增速第一,有你的贡献

StarRocks

数据库

计算机网络:IEEE 802.11无线局域网

timerring

计算机网络 11月月更

学历不是问题!社招大专老哥阿里 腾讯Java面试,上岸入职京东

钟奕礼

java程序员 java面试 java编程 #java

千万级学生管理系统设计试卷存储方案

Geek_92ba6f

HMS Core手语服务荣获2022中国互联网大会“特别推荐案例”:助力建设数字社会

HMS Core

手语 HMS Core

node.js的模块化与npm

急需上岸的小谢

11月月更

StarRocks 与 DataPipeline 完成兼容性互认证,携手共建数据基础设施生态

StarRocks

数据库

云服务器的四大作用讲解-行云管家

行云管家

云计算 服务器 云服务 云服务器

解析 RocketMQ 多样消费功能-消息过滤

阿里巴巴云原生

阿里云 RocketMQ 云原生

软件测试 | 接口自动化你不懂?听HttpRunner的作者怎么说

测试人

软件测试 自动化测试 接口测试 接口自动化 HttpRunner

分布式锁

急需上岸的小谢

11月月更

阿里P8出,入职阿里必会199道SpringCloud面试题,你能掌握多少?

钟奕礼

Java java程序员 java面试 java编程

EventBridge 生态实践:融合 SLS 构建一体化日志服务

阿里巴巴云原生

阿里云 云原生 EventBridge

战略合作再升级!合合信息与腾讯云联合推出海外智能风控方案

科技热闻

首次!阿里巴巴团队共同携手编写“大厂面试参考指南”v1.0版本

钟奕礼

Java 面试 java程序员 java 编程 #java Java 面试题

kubernetes下jenkins实战maven项目编译构建

程序员欣宸

DevOps jenkins 11月月更

一文带你回顾操作系统的内存知识点

华为云开发者联盟

操作系统 开发 内存 华为云

洞见科技姚明:隐私计算行业将会发展为多层级多领域的数据智能流通网络

洞见科技

DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术

华为云开发者联盟

云计算 后端 华为云

张文歆:思维需碰撞,才有更大的“火花”|对话 Doris

SelectDB

开源 职场 成长 学习路线 开源治理

「Go实战」在 Go 项目中基于本地内存缓存的实现及应用

Go学堂

golang 缓存 开源 程序员 性能

应用程序现代化指南

世开 Coding

应用现代化 软件升级

视频清晰度优化指南

得物技术

深度学习 算法 H.265 视频质量 图像超分

软件测试校招面试题 | 实习生和应届生有什么区别?

测试人

面试 软件测试 自动化测试 测试开发 实习

IM通讯协议专题学习(二):快速理解Protobuf的背景、原理、使用、优缺点

JackJiang

打开时空隧道,重演云栖72小时云世界

阿里云视频云

阿里云 云栖大会

精彩议程更新,从云原生到 Serverless 的思考和收获,邀你共同见证丨PingCAP DevCon 2022

PingCAP

TiDB

探知数字化研发4 - 底座篇

薛飞

数字化研发 数字化底座

node.js的path路径模块和http模块

急需上岸的小谢

11月月更

  • 扫码加入 InfoQ 开发者交流群
简单的Docker编排工具TOSCA_DevOps & 平台工程_Nati Shalom_InfoQ精选文章