老肖有话说:雾霾天带你看清Crane技术实现之路

小数表示最近雾锁京城真是有些可怕,迷迷蒙蒙让人看不清远处,大家外出也要注意防霾哦!

容器管理面板Crane,是数人云的第一个开源项目,那么它是如何诞生的,从设计理念到技术实现,大家是否也是一头雾水呢?数人云CTO肖德时在2016中国开源年会上的演讲将给你答案——

数人云从2014年开始创业,是一家技术为驱动的轻量级PaaS平台公司。今天为大家介绍的容器管理工具Crane是数人云基于最新Docker SwarmKit技术的一个开源项目。今天从技术角度分享一下数人云Crane从设计到开发的实践之路。

从控制面板说起

数人云是一家开源技术的公司,最初希望做一个开源项目,相当于做了一次内部创新。数人云的技术栈是Golang,正好与Docker十分密切。始于开源技术,成长于开源技术,是数人云的最初开始。

20161019202126

纵观Docker相关的product,关于控制面板的部分是最主要的,同时也是最容易介入的。我们想通过这个开源项目探索Docker所有的构件,能够更快熟悉Docker的技术。因为理解Docker有两种方法,一种是看文档,另一种是写代码。作为一家创业公司,写代码必然是最方便最快速的方式。我们想做一个与Docker UCP界面一模一样的工具,于是就有了Crane的诞生。

Docker的现状

20161019202201

目前容器还未达到企业集群的程度,虽然我们提供的是企业的服务,但是这个核心技术Docker本身没有达到企业集群,这是其一。第二,容器技术内在的需求是因为DevOps的需求非常迫切,大家希望能够变革IT的infrastructure方法。什么是DevOps?简单来说,就是开发变成运维、运维变成开发,但实际上它们需要一个媒介,而Docker的出现正好切入这个点。大家都以为找到了一个救星,但其实它只是一个工具,一个引爆点,并不能解决所有的问题,所以我认为现阶段仍是云计算浪潮的初始阶段。

第三,对于原来VM的管理,大家都知道有非常成熟的Openstack,有AWS 的IaaS 实现作为模板,大家也都了解企业级的集群如何管理,但是一旦把颗粒度变得更细,一台机器可以跑几百个容器,把它们当成VM,这样一个超大规模的集群如何管理?它的安全指标不像以前那么可用,企业级的集群管理在容器方面是没有标准的,这就是我们面临的现状。

Crane设计过程-定义功能集

20161019202208

Crane是一个新的项目,在开发Crane的时候需要自己定义功能,提前设定好目标才能成功,这也是项目刚启动时的一个技巧。从给它定义来看,我们的想法很多,除了应用编排、日志监控、网络管理这三大块,还有插件的管理,一些辅助信息、Docker本身对主机的管理也加进去了。但是我们重点关注了其中最核心的功能,就是应用编排、日志监控、网络管理,这是DevOps最关心的三个点,也是该项目的亮点。

20161019202215

具体到应用编排如何设置,它一定是rolling update,比如资源分配, 是可以在配置里面配置的;它能做ACL的隔离,更酷的是它能扩缩,并且是无痛的,这些都是非常智能的功能,也是在容器编排里面非常容易做到的事情。再加上SSH,因为它并不是一台主机,所以现在利用的技术叫web shell,即在web界面让你能够打开一个shell,能模拟的SSH的登录界面。

除了跑的任务之外,还有一些批处理的任务,可以把它想象成就是一个VM,机器里面不会想着要跑一些Cron Job之类。把这些功能实现以后,利用Docker的API把它的统计信息还有日志导出来。最后,把tasks的历史信息存在DB里面并显示出来。这就是Crane的全部设计。

Crane设计的实现

20161019202228

那接下来如何实现?通常开源分为两个级别:如果时间比较充足,就可以从第一行代码开始做起;另一种方法是基于成熟的开源项目,学习它的代码,开源项目鼓励大家这么做,它的license free&open,帮助大家互相创新。数人云也是基于开源技术,Docker功能里面有一个DAB,它发布了一个叫分布式的Distributed Application Bundle,把一个应用拆成很多小模块,简单来说就是一个web一个DB。复杂来说,还要加一个Reddis 作为Cache 层。一般发布的时候都是一步一步发,它用一个DSL的文件,是一个Jason,就可以直接用一个API发下去,并保证它的编排,刚才说的功能都可以实现。

20161019202236

它把 DAB 的实现放在了Docker Client端逻辑里面,Crane是开源项目,它的媒介、它的界面是web界面,是我们写的一个后端,所以我把它命令行端的实现代码直接merge到Crane的界面里面,这样就有了一部分创新,即能让用户能够通过界面发这个代码,能够发布应用。

第二件事是命令行,写完API工具以后,需要一个命令行工具来管理界面,用Python写一个脚本,然后调用API。它可以帮助开发者很快地通过界面就能够去操纵Crane,然后再操作集群。

20161019202244

开发一个project的时候,它的功能会越来越多,最理想的办法是插件化,你编写的代码应该是一个目录或者module,里面有自己的interface,把它注入进去以后,就可以与你的主线代码交互。更直白一点,我们原来写的一批API代码,API的RestfulAPI,想扩展这个API,可以在原来代码基础上继续写,但是这个方式与原来是紧密的耦合。所以我们用Golang interface的方式注入,注入完以后,就可以实现想要的认证,想要的registry,我们想要的各种其它的功能也都可以注入,这种方法在Golang里面非常方便,通过plugin tag的方式在Golang ini的时候就可以load,保证想要什么功能都可以加上。后台其实只实现了少有的功能,即集群管理、日志、监控、编排,其它比如数据库、Docker的应用目录、账号、信息这些都是通过扩展的方式实现的。

Crane还是一个很小的project,所以我们也非常谨慎地引入第三方的组件。回归本质,我们写这个project不是为了去做一件change the world的事情,而是遵从本心,想利用这个项目来学习Docker,学习Docker的东西是如何实现的,它的API是如何调用的,这是数人云Crane项目的本质。这个项目的目的是为了推广或者让更多的开发者能够学习到Docker的特性,然后直接参与到这个项目中来。

Crane的路线图

20161019202251

任何一个开源项目都有自己的roadmap,如果不做roadmap,那就是一个个人项目,而数人云要做一个至少是标准的开源项目。经过一个月的时间,Crane目前是四百个星,也在持续地增加。虽然这个项目本身的核心技术并不是特别高,但是这个项目的标准化程度以及它的代码质量都是有保证的,我们为此也写了很多unit test。

对于Crane的未来,我们会对事件流做一个补充,日志、存储方面也会实现。因为Docker本身是是无状态的应用,所以存储这一块非常方便。Docker本身是plugin机制,它可以装一些存储的插件,比如Flocker。

长远来说,Crane因为是一个开源项目,所以我们也避免跟其它项目同质化。虽然大家都认为控制面板很好做,但每个人的方向不一样,Crane这个开源的项目没有商业利益,它主要的目的是为了推广Docker的技术,让开发者在学习中成长。

总结

20161019202259

总结一下,再小的一个开源项目也是要投入的,在两个月周期内,我们投入了开发相当多的时间。也希望大家关注这个开源项目,上图是Crane的界面,大家可以去看看,非常简单在本地就可以搭建。今天分享就到这儿,谢谢大家。

分享到:更多 ()