容器时代,这就是我们要去的未来!

原载于 DockOne,周峰,原文链接: http://blog.circleci.com/it-really-is-the-future/

内容简介:本文言简意赅地指出大家多年来各种建构大规模互联网服务的最佳实践,归根到底就是分布式架构一些基本问题。Docker + Mesos 目标就是针对这些问题,才是构建一个长久稳固的 IT 服务治本之道。

上周我写了一篇博客 It’s the Future,讽刺了容器生态圈,顺带嘲讽了下 Docker、Google、CoreOS 和其它技术。不少 Docker 爱好者看起来是可以接受这篇文章的观点,但也有很多人反对。

也许很多人看完文章后会更容易理解容器的生态系统是怎么被“炒”起来的。Docker 是什么,这并不是那么容易理解。它是容器化的过程 —— 近似虚拟化,但并不完全是。Docker 使用了类似 Chef 的 Dockerfile,并加入了一些称为“层”的文件系统。它所解决的问题与 AWS、Heroku、VMware 和 Vagrant 貌似相同,但仔细想想又很不一样。Docker 衍生了27个相关的工具,而且每个名字都很滑稽,比如 Machine、Swarm、Flannel、Weave、etcd、rkt、Kubernetes、Compose 和 Flocker。不知何故 Docker 也和炫酷的微服务绑到了一起 —— 微服务更有意思,想想维护一大堆服务运行有多难也是醉了。但就是这样,微服务和容器人气爆棚,竟然有数十家创业公司和大公司支持它。

审视 Docker 和 Container 生态圈后感慨 “这就是一帮大忽悠”,这真的不太过分!

STOP!这个抱怨确实过份。

实际上它就是我们梦寐以求的未来。

为什么会是新动力?

憎恨的由来

为什么有许多兄弟会赞同《It’s The Future》文中的观点,因为这压根不是愤青,他们也质疑整个容器的技术炒作。Docker 出生带着虚拟化、SOA 和操作系统的印记,这样一来引起很多人的不满:那些怀疑新事物的家伙,我不明白为什么每个人都在谈论它。反过来 Docker 又完全改变了这个世界,它抛弃了操作系统、部署、运维、打包、防火墙、PaaS 以及一切旧规则。一些开发人员瞬间就爱上它 —— 有些出于解决问题,而有些是因为向别人炫耀新技术。总之,不管喜欢还是讨厌,在这个过程中感性大过了理性。

就技术本身而言,对 Docker 有这样的反应是完全没有必要的。大多数反感不是来自 Docker 自身的复杂度,更多的是因为他们没有遇到过相应的问题 —— 建构大规模分布式应用。如果你不了解 “Cattle not Pets” 这些经典问题,那么当你面对 Docker 及其工作方法后,自然会觉得是画蛇添足。

交汇点

Docker 是两个经典计算机学科的交汇点:Web 应用和分布式系统。在过去的十年李,我们不断被洗脑,只要会写代码,就能构建 Web 应用。先写一些 HTML、JavaScript、Rails,然后就有了一个网站。再增加了一些 forms、handlers,也许再加一个API,这样就大功告成:这足以推出的一款能够获得投资、客户和收入,甚至可以改变世界的产品!

同时,在过去的二十年中,搞分布式系统的那些人一直在倒腾一些无聊的破事。他们实验过像 CORBA 和 SOAP 这样复杂的协议,研究过 CAP(Consistency, Availability, Partition-tolerance)难题,证明过时钟同步是不可能的,以及拜占庭将军难题,都是以理论居多。对于那些只想做网站的人来说,上面这些问题和讨论毫无意义。

但随后有趣的事情发生了 —— 访问量越来越大,以至于需要快速扩展。网站在单一的 VPS 上再也呆不住了,开始进行垂直扩展(升级主机配置)。当应用规模开始扩展,一些奇妙的 BUG 浮出水面,这些 BUG 有一些很酷的名字:“race conditions”、“network partitions”、“deadlock” 和 “Byzantine failures”。这些都是分布式系统兄弟们一直在努力解决的问题,这些问题不仅非常难,而且在很多情况下理论上是无解的。

规模危机开始不久,Heroku出现了。Heroku 让基础设施的横向扩展非常容易,再一次给了我们自我欺骗的理由 —— 真的可以只是简单地搭个网站,就可以永不掉线。在这种假装和自欺欺人中呆了5年之后,我们现在打破了这种假象 —— 我们发现实际目标是构筑一个能够及时扩展的应用,我们多年来努力重构出一个能扩展的架构,并且也了解到了单体架构(monolithic)的确定,明白为什么单点数据库不堪重任。后来我们搞出像 Immutable Architecture、“Pets vs Cattle”、Microservices 这样的技术,尝试了很多好的不好的方案,都是为了让大规模扩展变得更容易。

在这个节骨眼,Docker 出现了!Docker 没有像 Heroku 这样,告诉我们 —— 扩展不是事儿。反过来 Docker 告诉我们,分布式系统是互联网服务最根本的架构,我们一定要接受这个事实,并且开始深入钻研。

相比那些简单的工具,例如 Web 构架、数据库和操作系统,我们现在有了一些神器,像 Swarm、Weave、Kubernetes、etcd 等等,这些神器不是告诉我们任何事都非常简单,而是更深层次地去理解要解决的问题到底是什么。

好的一面是,只要我们不逃避问题,现在就有能力建立可扩展型架构。我们需要知道什么是“network partitions”、怎样在 AP 和 CP 系统之间做出选择、怎样在恶劣的网络环境下构建可自动扩展(auto scale)的架构。如有时弗吉尼亚州会是雷电天气,有时候会遇到火灾,有时鲨鱼会咬坏海底电缆,有时还有延迟、递送失败、机器挂了和内存泄漏等情况。

一切都需要更加有弹性、更加可靠,而且我们要承认,这些都是在开发应用程序时就需要考虑的事情。我们需要做这些不是因为它时髦,也不是自称是最佳实践,而是因为在 Amazon、Netflix、Google 这样公司的人们,对这些问题已经有 15 年的经验和血泪史,他们告诉了我们如何构建真正上规模的系统。

实际解决的问题

那么 Docker 究竟给我们带来了什么呢?在我们建立 Web 服务时每个组件都比较脆弱,而 Docker 让他们合理化:

  • 通常做法是将应用的代码(Dev 部分)和部署(Ops 部分)分开,两个团队各司其职。这种做法是刻舟求剑,因为一个应用既包括代码逻辑,也包括运行环境,缺一不可。Docker 将开发和运行环境合二为一。

  • 到目前为止,我们已经将 SOA (值应用)运行在 AWS 、Heroku 等 PaaS 和 SaaS上,它们都没有管理 SOA 的工具。是Kubernetes、Mesos 和 Swarm 管理和编排着这些服务。

  • 到目前为止,我们部署应用程序时要安装完整的操作系统,设置各种安全配置,而不是最小的运行环境。通过容器你的应用从外面看起来非常轻,只剩下提供服务的端口,小到和一个静态执行文件一样。

  • 到目前为止,要调整线上应用,或者使用“配置管理工具”,或者将应用干掉后原地重新部署。容器管理框架可以通过增减实例数量来调节应用的规模,只需要从固定镜像不断地生成实例进行部署,底层的服务器配置不需要变化,减少了系统层面的故障。

  • 到目前为止,我们使用的编程语言和环境都是单机的,类似 Rails 里面的 Router 这种跨机器服务调度的框架很少。现在 Kubernetes 和 Compose 允许你为任何应用指定跨服务的拓扑结构。

  • 到目前为止,AWS 只提供几款固定配置的虚拟机,我们没法说“给我来 0.1 核 CPU 和 200M 内存”,大量资源被浪费了。容器可以进行细粒度的资源隔离,从而提高资源利用率。

  • 到目前为止,我们一直在使用来自 Unix 时代的多用户操作系统,用户之间要分享文件系统、可执行程序和数据库等等服务。对于构建互联网应用,这种方式 Overhead 太多了。容器仅仅包含了应用的可执行代码部分,而不是整个操作系统。这种容器内“单用户”机制大大简化了应用的开发部署

唯一不变的就是变化

我们这行业发展的太快,神化了那些新的、令人兴奋的技术,以至于根本等不到这些技术的成熟。Docker正在以惊人的速度发展,这就意味着它离稳定或成熟还很远。对于容器的运行时间、镜像格式、流程控制工具和主机操作系统,我们有很多选择,每种都有不同的用途和范围,都需要扶持和社区的支持。

环顾我们行业的历史,技术稳定之时,就是它过时之日。在我们发现 REST 之前有多少协议已经消亡?我们是踏着 SOAP、CORBA 的尸体建立起 REST、AJAX,而这两个技术的过渡大约用了10年的历程。拿 Rest 举例,我们到今天还是没有 SOAP 十年前就有的编辑 API 的工具,何况 SOAP 还没有完全消亡。

同样的故事也发生在前端,很多兄弟会拿前端开发们正在做的蠢事与我对 Docker 生态系统的滑稽文章作对比。自从我们十年前逃离Java,编程设计语言也在上演同样的故事。自始自终,开发者会不断拿出新的解决方案,直到问题都得到完美解决。更何况 Docker 生态系统有一堆问题需要解决。

我们甚至期望 Docker 还不成熟。当你尝试的时候,仍然衍生出许多奇怪的问题需要你去解答。几年后我们回首,会发现一些决定不止是无法让人理解,实际上完全是错误的。最好的做法是要尝试、失败,再尝试、再失败,直到真正做好。这将花费数年,我们才能领悟这一切,并让它平息下来。但是,这并不意味着容器是废物,或者说我们可以忽略它们。我们总是面临着选择,一面是继续使用我们已经熟悉的技术同时有一点小跳跃,一面是尝试新的东西 —— 从教训和适应、迭代中学习,来提升整个行业。

如果你要找我,我在未来等着你。

翻译:

谢乐冰,数人科技COO,毕业于柏林工业大学,多年电信运营商行业(HP)和云计算创业公司经验。