近日,教育类通讯软件 Remind 同名母公司 开源 了他们的自管理PaaS平台 Empire 。Empire是 Amazon EC2容器服务(ECS) 上面的一个控制层,提供了一个基于 Docker 的容器集群。Remind工程师Eric Holmes 撰文 介绍了Empire产生的过程及相关技术。
2011年,Remind始于一个托管在 Heroku 上的单体Rails应用程序。Heroku使他们可以专注于产品构建,而不用关心基础设施建设。在起步阶段,那是个很好的选择。但现在,他们已经有2500万用户,其产品有大约50个后端服务构成。为此,他们需要超过200个 dynos 来支撑所有应用程序。他们开始认识到,需要创建一种可以满足业务增长需求的架构,而那在Heroku上是无法办到的,这主要是因为:
而对于未来的解决方案,他们希望可以满足如下要求:
为了达成上述目标,他们研究了支持Docker的开源平台 Deis 和 Flynn 。Deis的复杂度超出预期,而Flynn没有一个稳定的版本,并且使用了一个完全自定义的负载均衡器,而不是一种像 HAProxy 、 Nginx 或 ELB 这样的稳定的方案。因此,他们放弃了这两个选项。
于是,Remind的一个团队开始了Empire的构建工作。由于受Deis、Flynn、 Netflix Asgard 、 SoundCloud Bazooka 等项目的影响,他们最初选择基于 CoreOS 构建,并将 fleet 用于后台调度,但调度后台被设计为可插拔的。但是,在测试故障模式时,他们发现, etcd (当时是0.4版本)的脆弱和 fleet的Bug 导致了许多问题,他们无法解决像零宕机部署这样的问题。之后,他们还考察了 Kubernetes ,但是,由于需要运行一个 虚拟网络 ,他们放弃了该选项。
巧合的是,Amazon ECS在那时正式公开发布,他们觉得它可以解决他们的大部分问题,比如,该服务集成了AWS Elastic Load Balancing(ELB),可以实现零宕机和“ 连接清空(connection draining) ”。经过一些基本的测试后,他们将调度后台换成了Amazon ECS。每个定义在 Procfile 文件中的进程都直接映射到Amazon ECS中的一个“服务”。ELB取代了自定义的路由层。 Route53 解决了服务发现问题。DHCP使得服务只需要知道需要访问的应用的名称。如此一来,他们从系统中去除了许多变化中的部件,如etcd;他们的集群主机现在是部署了Docker和Amazon ECS代理的Ubuntu裸机。下图是迁移完成后的系统架构示意图:
可以看出,他们将一个“路由器”应用程序附加到了面向互联网的ELB上。该应用运行着Nginx及 OpenResty ,并将请求路由到恰当的私有应用程序。它还负责生成请求ID,用于追踪请求在服务间的传递路径。这样做的最大好处是,他们可以像管理Empire内其它应用程序那样管理这个路由器应用。将来,他们可能会用 Kong 取代Nginx 。
如今,Empire已经成为一个 易于安装 的自管理PaaS平台。它实现了Heroku平台API的一个子集,这意味着用户除了可以使用Remind提供的 emp CLI之外,还可以使用 hk 或 Heroku CLI 。虽然还没有达到1.0版本,但Empire已经运行着Remind的大部分应用程序和服务。而且,由Heroku迁移到Empire之后,服务的性能获得了大幅提升。Remind后续还会为Empire增加 许多功能 ,他们希望Empire最终也能够支持以Kubernetes作为调度后台。
按照Holmes的说法,小型初创公司应该选择Heroku,因为那是部署应用程序的最简单方式。Empire需要用户构建自己的日志和指标基础设施,而且目前还处在活跃的开发中。但如果遇到了Remind公司遇到的限制,那么可以选择Empire作为基础设施。
Holmes的文章在Hacker News上引发了激烈的讨论,话题主要围绕相关技术和平台,比如, Vulcand 、Kong、 Cloud Foundry 、 OpenShift 、 DigitalOcean 、 Dokku 等。要了解更多信息或参与讨论,请点击 这里 。
感谢郭蕾对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 )。