挑战
经过八年的发展,Pinterest 已经成长为拥有 1000 个微服务和多层基础设施,以及各种不同的设置工具和平台。2016 年,该公司启动了一个通往新计算平台的路线图,其愿景是在不让工程师担心底层基础设施的情况下,创建从想法到生产的最快路径。
解决方案
第一阶段涉及将服务迁移到 Docker 容器。一旦这些服务在 2017 年初投入生产,团队就开始研究编排,以帮助提高效率并以分散的方式管理它们。在评估了各种解决方案后,Pinterest 选择了 Kubernetes。
影响
Pinterest 的云和数据基础设施组产品经理 Micheal Benedict 说:“通过迁移到 Kubernetes,团队能够构建按需扩展和新的故障转移策略,此外还简化了像 Jenkins 这样复杂的基础设施的整体部署和管理。” “我们不仅看到了构建时间的减少,还获得了巨大的效率提升。例如,该团队在非高峰时段回收了超过 80% 的容量。因此,与之前的静态集群相比,Jenkins Kubernetes 集群现在每天使用的实例小时数减少了 30%。”
自推出以来,Pinterest 已成为家喻户晓的名字,拥有超过 2 亿的月活跃用户和 1000 亿个保存的对象。在底层,有 1000 个微服务在运行和数十万个数据作业。
随着这样的增长,不同的工作负载出现了多层基础设施和各种不同的设置工具和平台,导致了不一致且复杂的端到端开发者体验,并最终降低了投入生产的速度。因此,在 2016 年,该公司启动了一个通往新计算平台的路线图,其愿景是在不让工程师担心底层基础设施的情况下,拥有从想法到生产的最快路径。
第一阶段涉及迁移到 Docker。“Pinterest 长时间以来一直在虚拟机上,直接在 EC2 实例上大量运行,”云和数据基础设施组产品经理 Micheal Benedict 说。“为了解决关于软件包软件的问题,以及不让工程师拥有部分机群和这些类型的挑战,我们标准化了打包机制,然后将其移动到虚拟机上的容器。没有太大的变化。我们当时不想大刀阔斧地改革。”
迁移的第一个服务是为 Pinterest 的大部分功能提供支持的单体 API 机群。与此同时,Benedict 的基础设施治理团队建立了计费和容量规划系统,以分析公司如何在 AWS 上使用其虚拟机。“很明显,以我们正在做的事情来看,在虚拟机上运行是不可持续的,”Benedict 说。“很多资源没有得到充分利用。以前有提高效率的措施,在一定规模上运行良好,但现在您必须转向更加分散的方式来管理。因此,我们认为编排可以帮助解决这个问题。”
这导致了路线图的第二阶段。在 2017 年 7 月,经过八周的评估期后,该团队选择了 Kubernetes 而不是其他编排平台。“Kubernetes 当时缺乏一些东西,例如,我们想要在 Kubernetes 上运行 Spark,”Benedict 说。“但我们意识到,即使是尝试构建它,我们投入的开发周期也值得这个结果,这对 Pinterest 和社区都有好处。我们一直在大数据 SIG 中进行这些对话。我们意识到,当我们最终将其中许多东西投入生产时,我们将能够利用社区正在做的事情。”
在 2018 年初,该团队开始将第一个用例引入 Kubernetes 系统:Jenkins 工作负载。“尽管我们在一天的特定时间段内进行构建,但我们始终需要分配峰值容量,”Benedict 说。“它们没有任何自动扩展功能,因此该容量保持不变。很难加快构建速度,因为增加容量需要更多时间。因此,考虑到这些类型的担忧,我们认为这将是一个完美的用例,让我们来研究。”
他们启动了集群,并与一个由四人组成的团队合作,为生产准备了 Jenkins Kubernetes 集群。“我们仍然有我们的静态 Jenkins 集群,”Benedict 说,“但在 Kubernetes 上,我们正在进行类似的构建,测试整个管道,准备好工件,并进行比较,看看在这里构建需要多长时间。SLA 是否正常,生成的工件是否正确,那里是否存在问题?”
“到目前为止,一切都很好,”他补充说,“特别是关于我们如何在 Kubernetes 共享集群上配置我们的 Jenkins 工作负载的弹性。这是我们一直追求的胜利。”
到 2018 年第一季度末,该团队成功地将 Jenkins Master 迁移到在 Kubernetes 上原生运行,并且还合作开发了 Jenkins Kubernetes 插件来管理工作节点的生命周期。“我们目前正在这个新集群上构建整个 Pinterest JVM 堆栈(Pinterest 上最近被 bazelized 的更大的单体存储库之一),”Benedict 说。“在高峰期,我们在数百个节点上运行数千个 pod。总的来说,通过迁移到 Kubernetes,该团队能够构建按需扩展和新的故障转移策略,此外还简化了像 Jenkins 这样复杂的基础设施的整体部署和管理。我们不仅看到了构建时间的减少,还获得了巨大的效率提升。例如,该团队在非高峰时段回收了超过 80% 的容量。因此,与之前的静态集群相比,Jenkins Kubernetes 集群现在每天使用的实例小时数减少了 30%。”
Benedict 指出了一个“非常健全的路线图”。除了 Pinterest 大数据团队在 Kubernetes 上使用 Spark 进行的实验之外,该公司还与亚马逊的 EKS 团队合作开发了一个 ENI/CNI 插件。
一旦 Jenkins 集群脱离暗模式并投入运行,Benedict 希望在迁移下一个服务之前,建立最佳实践,包括建立治理原语,包括与计费系统的集成。“我们有一个健康的用户案例管道需要加入。在 Jenkins 之后,我们希望启用对 Tensorflow 和 Apache Spark 的支持。在某个时候,我们的目标是迁移公司的单体 API 服务。如果我们迁移了它并了解了其复杂性,它会建立我们的信心,”Benedict 说。“它为我们迁移所有其他服务做好了准备。”
经过多年的云原生先锋,Pinterest 渴望分享其正在进行的旅程。“我们有能力在公共云环境中大规模地运行事物,并以许多人可能无法做到的方式测试事物,”Benedict 说。“我们有很好的条件可以回馈一些经验教训。”