挑战
全球最大的长途拼车社区 BlaBlaCar 连接了 22 个国家/地区的 4000 万会员。自 2012 年以来,该公司经历了指数级增长,需要其基础设施跟上步伐。“当您考虑将服务器数量翻倍时,您会开始思考,‘我应该如何做才能更有效率?’”BlaBlaCar 的基础设施工程师 Simon Lallemand 说。“答案不是雇佣越来越多的人来处理服务器和安装。”该团队知道他们必须扩展平台,但希望留在自己的裸机服务器上。
解决方案
BlaBlaCar 团队没有选择转移到云虚拟化或在自己的服务器上使用私有云,而是成为容器化的早期采用者,最初使用 rkt 作为 CoreOs 运行时,并使用 fleet 集群管理器进行部署。去年,该公司转而使用 Kubernetes 进行编排,现在还使用 Prometheus 进行监控。
影响
“在使用容器之前,创建一个新服务有时需要一天,有时需要两天,”Lallemand 说。“通过我们围绕容器构建的所有工具,现在复制一个新服务只需要几分钟。这真是一个巨大的进步。我们在数据中心进行容量规划的能力更强了,因为由于服务和我们运行的硬件之间的抽象,我们受到的约束更少了。对于开发人员来说,这也意味着他们可以只专注于他们正在开发的功能,而不是基础设施。”
然而,在幕后,基础设施却远远落后于骑手社区的指数级增长。该公司成立于 2006 年,并在 2012 年左右达到了目前的规模。“我们的基础设施非常传统,”基础设施工程师 Simon Lallemand 说,他于 2014 年开始在该公司工作。“刚开始时,有点混乱,因为我们必须快速[增长]。但后来就到了您必须设计东西使其可管理的时候。”
到 2015 年,该公司拥有约 50 台裸机服务器。该团队正在使用 MySQL 数据库和 PHP,但 Lallemand 说,“这是一种非常静态的方式。”他们还使用了配置管理系统 Chef,但其流程中几乎没有自动化。“当您考虑将服务器数量翻倍时,您会开始思考,‘我应该如何做才能更有效率?’”Lallemand 说。“答案不是雇佣越来越多的人来处理服务器和安装。”
相反,BlaBlaCar 开始了其云原生之旅,但不确定该走哪条路线。“我们可以选择进入云虚拟化,甚至在我们自己的服务器上使用私有云,”Lallemand 说。“但进入云意味着我们必须对应用程序工作进行大量更改,而且我们还没有准备好从本地切换到云。”他们希望保持在裸机上获得的良好性能,因此他们不想在本地进行虚拟化。
解决方案:容器化。这是 2015 年初,容器仍然相对较新。“这在当时是一个大胆的举动,”Lallemand 说。“我们决定,我们在新数据中心购买的下一批服务器都将是相同的型号,这样我们就可以外包服务器的维护工作。我们决定使用容器和 CoreOS Container Linux 作为此硬件的抽象。使用容器似乎是面向未来的,因为我们可以看到公司已经在容器方面所做的工作。”
接下来,他们需要为容器选择运行时,但“当时在生产中的部署非常少,”Lallemand 说。他们尝试了 Docker,但决定使用 rkt。Lallemand 解释说,对于 BlaBlaCar 而言,“集成 rkt 上的东西要简单得多。”当时,该项目仍处于 v1.0 之前,因此“我们可以与 rkt 的开发人员交谈并向他们提供反馈。这是一个优势。”此外,他指出,即使在这个早期阶段,rkt 也非常稳定。
在那个夏天做出这些决定后,该公司制定了实施计划。首先,他们成立了一个特别工作组,创建一个由 Lallemand 团队中 10 名成员中的 3 名成员测试的工作流程。但他们注意定期与所有 10 名成员举办研讨会,以确保每个人都加入进来。“当您专注于您的产品时,有时您会忘记它是否真的对用户友好,其他人是否也能管理创建容器,”Lallemand 说。“因此,我们进行了很多迭代以找到一个好的工作流程。”
在建立工作流程之后,Lallemand 笑着说“我们有一个奇怪的想法,我们应该先尝试最困难的事情。因为如果它有效,它将适用于一切。”因此,该团队决定容器化的第一个项目是数据库。“当时没有人这样做,而且我们想要做的事情真的没有任何现有工具,包括构建容器镜像,”他说。因此,该团队创建了自己的工具,例如 dgr,它构建容器镜像,以便整个团队都有一个通用的框架,可以在具有相同标准的相同镜像上进行构建。他们还改进了服务发现工具 Nerve 和 Synapse;他们的版本 Go-Nerve 和 Go-Synapse 是用 Go 编写的,旨在提高效率并包含新功能。所有这些工具都是开源的。
与此同时,该公司正在努力将其整个平台迁移到容器,截止日期定在 2015 年圣诞节。由于所有工作都在并行完成,BlaBlaCar 能够在截止日期前将大约 80% 的生产转移到容器中,并且在 12 月期间有实时流量在容器上运行。(现在是 100%。)“这是一年中流量非常繁忙的时间,”Lallemand 说。“我们知道,通过使用带有容器的新服务器,它将帮助我们处理流量。”
在拼车高峰季节中期,一切都进展顺利。“我们所产生的最大影响是新服务的部署,”Lallemand 说。“在使用容器之前,我们必须首先部署一台新服务器,并使用 Chef 创建配置。有时需要一天,有时需要两天才能创建一个新服务。通过我们围绕容器构建的所有工具,现在复制一个新服务只需要几分钟。所以这是一个巨大的进步。对于开发人员来说,这意味着他们可以只专注于他们正在开发的功能,而不是基础设施或他们测试代码的时间,或它部署的时间。”
为了满足他们自己设定的截止日期,他们做出的决定之一是在第一个生产对齐中不进行任何容器“编排魔术”。相反,他们使用了 CoreOS 的基本 fleet 工具来部署他们的容器。(他们确实构建了一个名为 GGN 的工具,他们将其开源,使其对他们的系统工程师来说更容易管理。)
尽管如此,该团队知道他们想要更多的编排。“我们的工具做得相当不错,但在某些时候,您希望给开发人员团队更多的自主权,”Lallemand 说。“我们还意识到,当开发人员想要启动新服务时,我们不想成为他们唯一的联系人。”到 2016 年夏天,他们在 Kubernetes 中找到了答案,该软件刚刚开始支持 rkt 实现。
在与 CoreOS 和 Google 的联系人讨论他们的需求后,他们确信 Kubernetes 将适用于 BlaBlaCar。“我们意识到围绕它有一个非常强大的社区,这意味着我们不必维护很多我们自己的工具,”Lallemand 说。“如果我们能够为像 Kubernetes 这样更大的项目做出贡献,那就更好了。”他们还开始使用 Prometheus,因为他们正在寻找“可以每晚更新的面向服务的监控”。在 Kubernetes 上生产始于 2016 年 12 月。“我们喜欢在圣诞节前后做疯狂的事情,”他笑着补充道。
BlaBlaCar 现在有大约 3,000 个 pod,其中 1200 个在 Kubernetes 上运行。Lallemand 领导着一个由 25 名成员组成的“基础团队”,负责为大约 100 名开发人员管理网络、数据库和系统。到达这一点存在一些挑战。“rkt 的实现仍然没有 100% 完成,”Lallemand 指出。“它真的很好,但仍然缺少一些功能。我们对如何处理有状态服务(如数据库)存在疑问。我们知道我们将如何迁移某些服务;其他一些服务处理起来有点复杂。但是 Kubernetes 社区在这方面正在取得很大进展。”
该团队特别高兴的是,他们现在能够更好地规划公司数据中心的容量。“由于我们服务和运行硬件之间存在这种抽象,我们受到的约束更少了,”Lallemand 说。“如果我们因为硬件问题而丢失了一台服务器,我们只需将容器移动到另一台服务器上即可。效率更高。我们只需更改配置文件中的一行即可实现。使用 Kubernetes,它应该是自动的,所以我们无需做任何事情。”
这些进步最终惠及了 BlaBlaCar 的用户。“我们网站的整体可用性得到了提高,”Lallemand 说。“当你切换到这种云原生模式,所有东西都在容器中运行时,你必须确保可以在任何时候重启服务器或数据容器,而不会造成任何停机,也不会丢失流量。因此,现在我们的基础设施更加具有弹性,可用性也比以前更高。”
在 BlaBlaCar 的技术部门内部,云原生之旅带来了一些深刻的变化。Lallemand 认为,在构思阶段的定期会议和在实施阶段的培训课程起到了帮助作用。“在那之后,每个人都参与了迁移过程,”他说。“然后,我们将组织划分为不同的‘部落’——团队聚集了开发人员、产品经理、数据分析师等所有不同的职位,共同致力于产品的特定部分。在此之前,他们是按职能组织的。我们的想法是让所有这些部落以自助服务的方式直接访问基础设施,而无需请求。这些人真正实现了自治。他们对产品的这一部分负责,并且可以更快地做出决策。”
事实证明,这种 DevOps 转型对公司的员工来说是积极的。“团队对 DevOps 转型感到非常兴奋,因为它很新颖,而且我们正在努力使事情更加可靠、更具前瞻性,”Lallemand 说。“我们喜欢做很少有人做的事情,除了互联网巨头。”
随着这些变化已经产生影响,BlaBlaCar 正寻求将其应用程序的更多部分拆分成服务。“我没有说微服务,因为它们不是那么‘微’,”Lallemand 说。“如果我们可以将开发团队之间的职责分开,那么管理起来会更容易,也更可靠,因为如果某个服务失败,我们可以轻松地添加和删除服务。你可以轻松地处理它,而不是添加我们仍然拥有的一个庞大的单体应用。”
当 Lallemand 与其他对 BlaBlaCar 在基础设施方面所做的工作感到好奇的欧洲公司交谈时,他会告诉他们一起来体验。“我告诉他们,与我们以前的基础设施相比,今天处理基础设施是多么的愉快,”他说。“他们只需要记住他们真正的动机,无论是开发中的灵活性,还是可靠性等等,然后逐步实现这些目标。这就是我们所做的。重要的是不要为了技术而做技术。要为了目标而做。我们的重点是帮助开发人员。”