方舟系统——docker容器云的一次实践
Sat, Apr 02, 2016 in bigData Docker Python
自从docker出现以来,许多黑客就一直想用它来构建集群,容器云的概念虽然早已被提出,但只有在docker出现之后,这种概念才有了真正实践的技术基础,一系列开源和闭源的项目被创建出来,旨在基于docker来构建一种或是通用,或是专用的容器云。
比如百度的BAE和腾讯大名鼎鼎的gaia,以及开源项目K8S,都在这方面作出了努力,借着毕设的契机,我也想在这方面做出我的稚嫩的探索。
首先介绍一下方舟,方舟项目的目的是为实验室构建一个可以快速生成和销毁,扩容和缩容一些容器云(比如spark和hadoop集群)的平台,最终的构想是用户可以通过图形化的界面操纵这些集群,也可以向这些集群提交一些任务。
这里牵涉到的东西非常多,docker容器的构建,容器网络通信,容器云和外界通信方式,容器调度,容错容灾等等等等,每个方面做下去都非常深,真正想要做起来绝对不是我一个人几个月可以完成的,所以,在这么短的时间里,我能做的仅仅是写出一个基本能用的东西,然后祈祷它不出错。
经过一周左右的前期调研,我决定不使用K8S,自己另起炉灶来做容器云的生成和调度,在当时看这个决定好像也没什么问题,现在看的话我又相当不确定是否不用K8S是一个明智的选择。但是工程已经进行了很多了,反悔也已经来不及。
方舟系统的结构大概就是图中的那样,由一个主控和多个从控节点组成,主控和从控采用从控轮讯的方式通信,从控会不断地向主控请求自己的命令,并且执行,主控则通过用户行为产生这些命令,从控会根据这些命令产生或者销毁一些docker镜像,并且向主机汇报登记这些docker镜像,这些镜像则会组成我们需要的集群。
思路差不多就是这么简单,但是实际做起来的时候还是有一定难度,有一些坑需要注意:
GFW
由于大中华局域网的一些问题,境内的服务器可能会访问不到官方的dockerhub,从而会下载不到一下docker镜像,这个坑目前比较推荐用daocloud来解决。daocloud有自己的一套镜像,甚至有一个dao命令来下载docker镜像,甚至docker本身也可以在daocloud下载,真是个好项目,上链接。
https://www.daocloud.io
docker 容器的网络通信
这一块真的是难点中的难点,docker容器跨主机的连通一直也没有一个最好的办法,只有几个可以凑合着用的:
至于我用的,则是weave,https://github.com/weaveworks/weave 。其实weave也有自己坑的地方,weave的网络结构是一个链状网络,也就是说不管连接进weave的哪一个主机崩了,整个网络就跟着一起崩了。。。
多容器服务协同
docker-compose 当之无愧地可以完成这个任务
spark/hadoop的docker镜像构建
这个是基于amplab的一系列开源项目改的。