小数表示最近雾锁京城真是有些可怕,迷迷蒙蒙让人看不清远处,你们外出也要注意防霾哦!git
容器管理面板Crane,是 数人云的第一个开源项目,那么它是如何诞生的,从设计理念到技术实现,你们是否也是一头雾水呢?数人云CTO肖德时在2016中国开源年会上的演讲将给你答案——github
数人云从2014年开始创业,是一家技术为驱动的轻量级PaaS平台公司。今天为你们介绍的容器管理工具Crane是数人云基于最新Docker SwarmKit技术的一个开源项目。今天从技术角度分享一下数人云Crane从设计到开发的实践之路。web
数人云是一家开源技术的公司,最初但愿作一个开源项目,至关于作了一次内部创新。数人云的技术栈是Golang,正好与Docker十分密切。始于开源技术,成长于开源技术,是数人云的最初开始。shell
纵观Docker相关的product,关于控制面板的部分是最主要的,同时也是最容易介入的。咱们想经过这个开源项目探索Docker全部的构件,可以更快熟悉Docker的技术。由于理解Docker有两种方法,一种是看文档,另外一种是写代码。做为一家创业公司,写代码必然是最方便最快速的方式。咱们想作一个与Docker UCP界面如出一辙的工具,因而就有了Crane的诞生。数据库
目前容器还未达到企业集群的程度,虽然咱们提供的是企业的服务,可是这个核心技术Docker自己没有达到企业集群,这是其一。第二,容器技术内在的需求是由于DevOps的需求很是迫切,你们但愿可以变革IT的infrastructure方法。什么是DevOps?简单来讲,就是开发变成运维、运维变成开发,但实际上它们须要一个媒介,而Docker的出现正好切入这个点。你们都觉得找到了一个救星,但其实它只是一个工具,一个引爆点,并不能解决全部的问题,因此我认为现阶段还是云计算浪潮的初始阶段。后端
第三,对于原来VM的管理,你们都知道有很是成熟的Openstack,有AWS 的IaaS 实现做为模板,你们也都了解企业级的集群如何管理,可是一旦把颗粒度变得更细,一台机器能够跑几百个容器,把它们当成VM,这样一个超大规模的集群如何管理?它的安全指标不像之前那么可用,企业级的集群管理在容器方面是没有标准的,这就是咱们面临的现状。安全
Crane是一个新的项目,在开发Crane的时候须要本身定义功能,提早设定好目标才能成功,这也是项目刚启动时的一个技巧。从给它定义来看,咱们的想法不少,除了应用编排、日志监控、网络管理这三大块,还有插件的管理,一些辅助信息、Docker自己对主机的管理也加进去了。可是咱们重点关注了其中最核心的功能,就是应用编排、日志监控、网络管理,这是DevOps最关心的三个点,也是该项目的亮点。网络
具体到应用编排如何设置,它必定是rolling update,好比资源分配, 是能够在配置里面配置的;它能作ACL的隔离,更酷的是它能扩缩,而且是无痛的,这些都是很是智能的功能,也是在容器编排里面很是容易作到的事情。再加上SSH,由于它并非一台主机,因此如今利用的技术叫web shell,即在web界面让你可以打开一个shell,能模拟的SSH的登陆界面。运维
除了跑的任务以外,还有一些批处理的任务,能够把它想象成就是一个VM,机器里面不会想着要跑一些Cron Job之类。把这些功能实现之后,利用Docker的API把它的统计信息还有日志导出来。最后,把tasks的历史信息存在DB里面并显示出来。这就是Crane的所有设计。分布式
那接下来如何实现?一般开源分为两个级别:若是时间比较充足,就能够从第一行代码开始作起;另外一种方法是基于成熟的开源项目,学习它的代码,开源项目鼓励你们这么作,它的license free&open,帮助你们互相创新。数人云也是基于开源技术,Docker功能里面有一个DAB,它发布了一个叫分布式的Distributed Application Bundle,把一个应用拆成不少小模块,简单来讲就是一个web一个DB。复杂来讲,还要加一个Reddis 做为Cache 层。通常发布的时候都是一步一步发,它用一个DSL的文件,是一个Jason,就能够直接用一个API发下去,并保证它的编排,刚才说的功能均可以实现。
它把 DAB 的实现放在了Docker Client端逻辑里面,Crane是开源项目,它的媒介、它的界面是web界面,是咱们写的一个后端,因此我把它命令行端的实现代码直接merge到Crane的界面里面,这样就有了一部分创新,即能让用户可以经过界面发这个代码,可以发布应用。
第二件事是命令行,写完API工具之后,须要一个命令行工具来管理界面,用Python写一个脚本,而后调用API。它能够帮助开发者很快地经过界面就可以去操纵Crane,而后再操做集群。
开发一个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的特性,而后直接参与到这个项目中来。
任何一个开源项目都有本身的roadmap,若是不作roadmap,那就是一个我的项目,而数人云要作一个至少是标准的开源项目。通过一个月的时间,Crane目前是四百个星,也在持续地增长。虽然这个项目自己的核心技术并非特别高,可是这个项目的标准化程度以及它的代码质量都是有保证的,咱们为此也写了不少unit test。
对于Crane的将来,咱们会对事件流作一个补充,日志、存储方面也会实现。由于Docker自己是是无状态的应用,因此存储这一块很是方便。Docker自己是plugin机制,它能够装一些存储的插件,好比Flocker。
长远来讲,Crane由于是一个开源项目,因此咱们也避免跟其它项目同质化。虽然你们都认为控制面板很好作,但每一个人的方向不同,Crane这个开源的项目没有商业利益,它主要的目的是为了推广Docker的技术,让开发者在学习中成长。
总结一下,再小的一个开源项目也是要投入的,在两个月周期内,咱们投入了开发至关多的时间。也但愿你们关注这个开源项目,上图是Crane的界面,你们能够去看看,很是简单在本地就能够搭建。今天分享就到这儿,谢谢你们。