挑战
全球最大的长途拼车社区 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 现在大约有 3000 个 Pod,其中 1200 个运行在 Kubernetes 上。Lallemand 带领着一个由 25 名成员组成的“基础设施团队”,他们负责大约 100 名开发人员的网络、数据库和系统。在达到这一目标的过程中,他们遇到了一些挑战。“rkt 的实现还没有完成 100%,”Lallemand 指出。“它确实很好,但仍然缺少一些功能。我们对如何处理有状态服务(如数据库)有一些疑问。我们知道我们将如何迁移一些服务;有些服务处理起来更复杂。但 Kubernetes 社区在这方面取得了很大进展。”
团队特别高兴的是,他们现在能够更好地规划公司数据中心的容量。“由于服务和我们运行的硬件之间存在抽象,我们有了更少的限制,”Lallemand 说。“如果我们丢失了一台服务器,因为服务器上出现了硬件问题,我们只需将容器移动到另一台服务器上。这样效率更高。我们只需更改配置文件中的一行就能做到这一点。使用 Kubernetes,它应该是自动的,所以我们什么都不用做。”
这些进步最终惠及 BlaBlaCar 的用户。“我们网站的整体可用性得到了提升,”拉勒曼德说。“当你转向这种云原生模型,将所有东西都运行在容器中时,你必须确保你可以在任何时候重启服务器或数据容器,而不会造成任何停机或流量丢失。因此,现在我们的基础设施更加健壮,可用性也比以前更高。”
在 BlaBlaCar 的技术部门,云原生之旅带来了深刻的变化。拉勒曼德认为,在概念阶段的定期会议和实施阶段的培训课程起到了很大作用。“在那之后,每个人都参与了迁移过程,”他说。“然后我们将组织分成不同的‘部落’——这些团队将开发人员、产品经理、数据分析师以及所有不同职位的人员集合起来,共同负责产品的某个特定部分。以前,他们都是按照职能来组织的。我们的目标是让所有这些部落都能直接以自助的方式访问基础设施,而无需请求。这些人真正地实现了自主。他们对产品的这部分负责,可以更快地做出决策。”
这场 DevOps 转型对公司的员工来说是积极的。“团队对 DevOps 转型感到非常兴奋,因为它是一种新事物,我们正在努力让事情变得更加可靠、更具前瞻性,”拉勒曼德说。“我们喜欢做一些只有少数人(除了互联网巨头)在做的事情。”
随着这些变化已经开始产生影响,BlaBlaCar 正在寻求将越来越多的应用程序拆分成服务。“我不会说微服务,因为它们并不那么微,”拉勒曼德说。“如果我们能够在开发团队之间划分职责,那么管理起来会更容易,也更加可靠,因为如果一个服务出现故障,我们可以轻松地添加和删除它。你可以轻松地处理它,而不是添加一个我们仍然保留的大型单体架构。”
当拉勒曼德与其他对 BlaBlaCar 在基础设施方面所做工作感兴趣的欧洲公司交谈时,他会告诉他们一起加入这场旅程。“我告诉他们,与以前相比,现在处理我们拥有的基础设施是多么令人愉快,”他说。“他们只需要记住他们的真正动机,无论是开发的灵活性还是可靠性等等,然后一步一步地朝着实现这些目标前进。这就是我们所做的。重要的是不要为了技术而做技术。要为了目的而做。我们的重点是帮助开发人员。”