挑战
全球最大的长途拼车社区 BlaBlaCar 连接了 22 个国家的 4000 万会员。自 2012 年以来,该公司一直在经历指数级增长,其基础设施需要跟上步伐。“当你考虑将服务器数量增加一倍时,你就会开始思考,‘我应该做些什么来提高效率?’”BlaBlaCar 的基础设施工程师 Simon Lallemand 说道。“答案不是雇佣越来越多的人来处理服务器和安装。”团队知道他们必须扩展平台,但希望继续使用自己的裸机服务器。
解决方案
BlaBlaCar 团队选择不转向云虚拟化或在其自己的服务器上使用私有云,而是成为容器化的早期采用者,使用 CoreOs 运行时 rkt,最初使用 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 中找到了答案,Kubernetes 当时刚刚开始支持 rkt 实现。
在与他们在 CoreOS 和 Google 的联系人讨论了他们的需求后,他们确信 Kubernetes 将适用于 BlaBlaCar。“我们意识到它周围有一个非常强大的社区,这意味着我们不必维护自己的许多工具,”Lallemand 说道。“如果我们能够为像 Kubernetes 这样更大的项目做出贡献,那就更好了。”他们还开始使用 Prometheus,因为他们正在寻找“可以每晚更新的面向服务的监控”。Kubernetes 的生产环境于 2016 年 12 月开始。“我们喜欢在圣诞节前后做疯狂的事情,”他笑着补充道。
BlaBlaCar 现在拥有大约 3,000 个 Pod,其中 1,200 个在 Kubernetes 上运行。Lallemand 领导着一个由 25 名成员组成的“基础团队”,他们负责大约 100 名开发人员的网络、数据库和系统。到目前为止,已经遇到了一些挑战。“rkt 的实现还没有 100% 完成,”Lallemand 指出。“它真的很好,但还缺少一些功能。我们对如何处理有状态服务(如数据库)有疑问。我们知道我们将如何迁移某些服务;其他一些服务处理起来要复杂一些。但 Kubernetes 社区在这方面正在取得很大进展。”
该团队特别高兴的是,他们现在能够更好地规划公司数据中心的容量。“由于我们在服务与我们运行的硬件之间进行了这种抽象,因此我们的限制更少了,”Lallemand 说道。“如果我们因为硬件问题而丢失了一台服务器,我们只需将容器移动到另一台服务器上即可。这效率要高得多。我们只需更改配置文件中的一行即可做到这一点。而使用 Kubernetes,这应该是自动的,所以我们什么都不用做。”
这些进步最终会惠及 BlaBlaCar 的用户。“我们总体上提高了网站的可用性,”Lallemand 说道。“当你转向这种云原生模型并在容器中运行所有内容时,你必须确保在任何时候你都可以在没有任何停机时间和流量损失的情况下重新启动服务器或数据容器。所以现在我们的基础设施更具弹性,并且比以前具有更高的可用性。”
在 BlaBlaCar 的技术部门,云原生之旅带来了一些深刻的变化。Lallemand 认为,在构思阶段的定期会议和实施过程中的培训课程对此有所帮助。“在那之后,每个人都参与了迁移过程,”他说。“然后,我们将组织分成不同的‘部落’——团队,将开发人员、产品经理、数据分析师,所有不同的职位,聚集在一起,负责产品的特定部分。以前,他们是按职能组织的。这样做的目的是让所有这些部落都能以自助服务的方式直接访问基础设施,而无需提出请求。这些人是真正自主的。他们对产品的这一部分负责,并且可以更快地做出决策。”
事实证明,这种 DevOps 转型对公司的员工来说是积极的。“团队对 DevOps 转型感到非常兴奋,因为它是全新的,而且我们正在努力使事情变得更加可靠、更加面向未来,”Lallemand 说。“我们喜欢做很少有人在做的事情,除了互联网巨头。”
随着这些变化已经产生影响,BlaBlaCar 希望将其应用程序的越来越多的部分拆分为服务。“我没有说微服务,因为它们不是那么微,”Lallemand 说。“如果我们能够在开发团队之间分担责任,那么管理起来会更容易,也更可靠,因为如果一个服务出现故障,我们可以轻松地添加和删除服务。您可以轻松地处理它,而不是添加我们仍然拥有的庞大的单体应用。”
当 Lallemand 与其他对 BlaBlaCar 在其基础设施方面所做的事情感到好奇的欧洲公司交谈时,他告诉他们加入进来。“我告诉他们,与我们以前拥有的基础设施相比,处理我们今天拥有的基础设施真是太令人愉快了,”他说。“他们只需要牢记他们的真正动机,无论是开发的灵活性、可靠性还是其他方面,然后逐步实现这些目标。这就是我们所做的。重要的是不要为了技术而技术。要为目的而做。我们的重点是帮助开发人员。”