Docker 正在驱动一个全新的可扩展的 Uber

【原文编者的话】快速创新的迫切要求,使得 Uber 开始在服务部署中应用 Docker 。这篇文章讲述了部署方式的转变过程,强调在全面容器化之前,必须做充足的准备。

无论你对 Uber 的看法如何, Uber 无疑是创新的同义词,因为它在颠覆交通行业的同时引领了共享经济。像Uber 这样的最快创新者,就像 Microsoft, Apple 和 Amazon 公司一样,都面临一个问题:一旦你开始创新并且取得成功,你不得不一直保持这样快的创新速度,这就导致了下面的后果:有时你看不到更远大的前景,有时会被途中的障碍绊倒。

今年初, Uber 发现自己就处于这样的境地。那时候,软件工程师 Casper S. Jensen 加入了 Uber 公司的计算机平台团队。

在 Dockercon EU 的第一天, Jensen 说 Uber 应用有非常易用的用户界面,看起来就是一个简单的应用;“实际上 Uber 是一个非常非常复杂的产品”,“应用只是冰山之一角”,底层包含了无数的功能特性。要知道,目前 Uber 面对的是 69 个国家的不同市场和法律,每天安排百万次行程,有4,000 员工使用 Uber 平台。

以前的软件开发模式

那时候, Jensen 和团队中的其他四个人刚刚加入 Uber 不久。工作简直是“一团糟”,他们正在寻求一种解决方案。

这是去年冬天他们的开发流程:

  1. 编写服务 RFC(Request for Commments,请求评论)—— Uber 是一家极其依赖反馈的公司,在启动一项新服务时,他们首先描述该服务的架构和理念,发布到邮件列表中。
  2. 收集反馈——例如,“你们知道其他人也在做类似的事情吗?”——集中精力,力争在早期就找出错误。
  3. 手工列出该服务的所有依赖。
  4. 开始开发服务。
  5. 等待基础设施团队编写服务的依赖。
  6. 等待 IT 确定服务的位置。
  7. 等待基础设施团队提供服务。
  8. 部署到开发服务器,测试。
  9. 部署到生产环境的服务器。
  10. 监控迭代。

他说,步骤 5-7 “是特别特别令人痛苦的部分,很容易耗费数日乃至数周的时间。”原因何在?“到不是说这些步骤特别难,大部分环节我们都有相应的脚本,”只包括大约十行的集成代码。

“简单是简单,但是这些脚本的扩展性差,因为公司里只有少数人真正地知道如何扩展且不会破坏已有的部署”, Jensen 说。再加上一些小错误——例如,本来应该是连接线,结果写成了斜线——最后导致所有的服务都慢得要命。

2015 年2 月,在一封内部邮件中,他们设置了下列目标:

Jensen 说他们想要做到:

  • 允许服务的拥有者有专用的服务器切片,他们自行决定安装什么,我们不干涉,但是不能影响其它的服务。
  • 并且,他们的安装过程也不用我们参与。
  • 必须得有所改变了,还不能破坏现有的服务。

Uber 需要克服的自身问题

如果一家公司有如此快速增长的基础设施,自然会有一些限定,如 Jensen 所讲,“无论如何,我们必须保证基础设施快速增长,避免拖慢开发团队的高速开发流程”。

这不仅是因为 Uber 要求 7×24 的可用性以及支持无数的本地化特性,更重要的是,“没有任何一个人能够看到 Uber 的所有服务,每个人只能看到自己从事的部分。”他列举了几个特性,像 UberPOOL、UberKITTENs、UberIceCream 和 UberEATS,每一个都在“增加新功能,好像世界末日到了一样”。 Uber 的耀眼成功,是建立在全方位超快发展的基础之上的,包括数据中心、服务器和基础设施。需要找到保持增长的解决方案。

“我们希望有非常方便的流程和基础设施,这样开发者就能非常快地增加新功能。其中最重要的一个部分是创建新服务的流程,” Jensen 说,“我们意识到这不就是 要用 Docker 吗。”理由很简单,“很容易向别人解释 Docker 的作用,人们早就了解过它,理解基本的概念”。每个人都有自己喜欢使用的容器,因此开发团队很容易接受 Docker 。

容器带来的痛苦

他们心想,“我们都能写代码,这还不是小菜一叠?两天就能干完。”实际上不是那么回事。他们 2月份作出决定,直到仲夏,才真正用上 Docker 。

Jensen 解释说,用了 Docker ,“一切都有所改变,思路也必须随之转换。”

采用 Docker 的最大障碍是 Uber 内部使用的集群管理系统 uDeploy 。它要能在支持回滚的前提下做持续的滚动升级。它包含很多报错的触发器,像健康检查或者发生故障时的图形化显示。它还支持有错就回滚的负载测试和集成测试。 uDeploy 包括:

  • 每周 4,000 次升级
  • 每周 3,000 次构建
  • 每周 300 次回滚
  • 管理系统包含的 600 多个服务

做不到完全不使用 uDeploy ,所以 Uber 团队决定同时部署旧有的服务和 Docker 服务。

“我为此花了很多时间,检查每一个功能,添加支持以便能够把它封装为 Docker 服务,” Jensen 说,“ uDeploy 支持显示标准输出和标准错误,我们必须在 Docker 中也实现这一点。”

他们在开始使用 Docker 时,没有那么多规划。后来 Jensen 意识到一开始给予开发者的自由度太大。“不应该这样,”他打了个响指,说:“你真的要考虑到基础设施的方方面面”。

Jensen 说,如果你提前做好规划,真正审视基础设施以及容器在其中的一小部分作用,结果就会好很多。

Docker 正在驱动一个全新的可扩展的 Uber

现在 Uber 大约有 1/3 服务是 Docker 化的,希望不久实现百分之百的容器化。为什么?虽然转换的过程很痛苦,但是最终的结果符合期望,去掉了持续部署中的三个巨大的痛点。有了 Docker ,他们无需再:

  • 等待基础设施团队编写服务的依赖;
  • 等待 IT 确定服务的位置;
  • 等待基础设施团队提供服务。

现在,他们不再手工编写或者复制以前项目的依赖定义,而是使用包含标准服务的配置和构建文件的工具,从而把服务提供时间从以前的几小时、几天缩短到现在的大约 10 分钟。

不仅如此, Uber 认识到, Docker 消除了团队之间的依赖,提供了更高的自由,因为不再绑定在特定的框架和版本。框架和服务的拥有者现在可以尝试新技术,管理自有的环境。

本文作者:柳泉波

来源:51CTO

时间: 2024-12-03 06:38:08

Docker 正在驱动一个全新的可扩展的 Uber的相关文章

对Docker存储驱动的评价

本文讲的是对Docker存储驱动的评价,[编者的话]Docker 的生态系统不断完善,上到容器的编排发布,下到网络存储,都有着各种选择.对于Docker 最底层的存储驱动,也有着Overlay.Zfs等选择,各有利弊,本文从一位使用者的角度对不同的驱动发表了自己的看法,仅供参考. 温馨提示,本文的所有观念谨代表个人看法,所以不要因为你不同意我,就在Hacker News 上和我争论.我可以不那么公正,因为这是我自己的看法. 很坦率的说,我认为每种Docker存储驱动都不好用,所以你要决定哪一种最

如何编写一个全新的 Git 协议

曾几何时,我在持续追踪自己的文件方面遇到一些问题.通常,我忘了自己是否将文件保存在自己的桌面电脑.笔记本电脑或者电话上,或者保存在了云上的什么地方.更有甚者,对非常重要的信息,像密码和Bitcoin的密匙,仅以纯文本邮件的形式将它发送给自己让我芒刺在背. 我需要的是将自己的数据存放一个git仓库里,然后将这个git仓库保存在一个地方.我可以查看以前的版本而且不用提心数据被删除.更最要的是,我已经能熟练地在不同电脑上使用git来上传和下载文件. 但是,如我所言,我并不想简单地上传我的密匙和密码到G

深入了解Docker存储驱动

本文讲的是深入了解Docker存储驱动[编者的话]本文深入探讨了Docker容器的存储驱动,内容包括graphdriver以及各个选项比如Vfs.Aufs.Overlay.Overlay2.Btrfs.ZFS.Devicemapper和Windows,还有具体如何选择的规则. 如果你曾经上手用过Docker,你可能已经见过存储驱动(storage driver)这个词.或者你已经偶然听过graphdriver这个词,并心想这到底是个什么鬼?或者你听过大牛们谈论的话题中出现的aufs和device

使用Docker、CoreOS、Mesos部署可扩展的Web应用

使用Docker.CoreOS.Mesos部署可扩展的Web应用 [编者的话]本文作者重点介绍了如何使用Docker.CoreOS.Mesos.Vulcand.对象存储来部署一个可扩展的Web应用,他首先介绍了 为什么要选择这些工具以及与其它工具相比这些工具的优势.紧接着,他通过实际案例演示了整个部署过程,图文并茂,推荐阅读. 介绍 让我们先来讨论一下为什么我决定使用这些软件来展示如何创建一个可扩展的Web基础架构. 为什么选择Docker? 那问题来了,为啥要选择Linux容器?因为相比于虚拟

Docker 存储驱动详细介绍_java

Docker 存储驱动详细介绍 最近做项目,期间对Docker 存储驱动不会,于是在网上找资料,并解决了,这里就记录下. 目的 理解docker的存储方式 docker的image和container在host上的目录结构 docker image和container的内容与配置不同存储 Docker是一个开源的应用容器引擎,主要利用Linux内核namespace实现沙盒隔离,用Cgroup实现资源限制.Docker用于统一开发和部署的轻量级 Linux 容器,试图解决"依赖地狱"问

5G技术与触觉互联网,一个全新的世界

如今互联网满足着人们的视听需求.假使互联网能够服务人类另一种感官--触觉,那将是什么样的体验?随着移动宽带的数据速率与日俱增,身处前沿的科学家们正开始构建触觉互联网. 时间刚过下午3点,印度尼西亚的大实业家Anthony Salim顶着一头乱发,唐突地与他精力充沛的同伴会面."你能相信吗--每每我的私人飞机需要维修,都只能把它飞到德州去修,"他抱怨着,转动着眼睛."亚洲没有私人飞机维修站点.一个也没有.Mischa,你能不能做点什么?"Mischa的全名是Misch

如何从无到有设计一个全新的互联网产品

文章描述:互联网的产品设计方法. 如何从无到有,设计一个全新的互联网产品:网站.app - 一个什么样的产品是目前市场上最有价值.竞争力的?这个话题比较复杂,而本文是讲述有了这个基础之后. 而在这一切都已经有了目标和方向后,考虑怎么动手开始设计.--更准确的说法是指"产品设计". 不是说"产品经理"在公司召集了各种技术人才,然后按照他自己的想法,把一个产品实现. 当然也不是闭门造车. 互联网产品的设计,需要一个概念:快. 不可能在已经有了方向后,还需要1个月甚至数月

link中如何混编两个不同的数组中的数据,得到一个全新的毫无关联的结果?

问题描述 link中如何混编两个不同的数组中的数据,得到一个全新的毫无关联的结果? link中如何混编两个不同的数组中的数据,得到一个全新的毫无关联的结果? 解决方案 比如 int[] a = {1,2,3,4,5}; int[] b = {6,7,8,9,10}; var query = a.Concat(b).OrderBy(x => Guid.NewGuid().ToString());

一个全新的网上社会似乎正在形成

在社交网站日益风行的今天,很多人通过网络结识了新朋友,一个全新的网上社会似乎正在形成.但一份最新的调查报告显示,Facebook."聚友"(Myspace)和Twitter这些本应让我们联系更加紧密的网络社交平台,可能导致人类越来越孤独. 面对面交谈成奢望 世界新闻报报道,这项调查由英国心理健康基金会发起,对象是18岁到34岁的年轻人.调查结果显示,这些人中有1/3习惯在网络上和自己的家人及朋友联系,而非真正去探望他们.进行面对面交流. 研究孤独症的专家在调查报告中证实,人们面对面接触