公司 Pinterest 地点 美国加州旧金山 行业 网络和移动应用

挑战

成立八年后,Pinterest 已发展到 1,000 个微服务,拥有多层基础设施和各种设置工具及平台。2016 年,公司推出了新计算平台的路线图,愿景是创建从想法到生产环境的最快路径,让工程师无需担心底层基础设施。

解决方案

第一阶段涉及将服务迁移到 Docker 容器。这些服务于 2017 年初投入生产后,团队开始寻求编排技术,以帮助提高效率并以去中心化的方式对其进行管理。在评估了各种解决方案后,Pinterest 选择了 Kubernetes。

影响

“通过迁移到 Kubernetes,团队能够构建按需扩展和新的故障转移策略,此外还简化了 Jenkins 这种复杂基础设施的整体部署和管理,”Pinterest 云和数据基础设施部门产品经理 Micheal Benedict 说。“我们不仅缩短了构建时间,还获得了巨大的效率提升。例如,在非高峰时段,团队回收了超过 80% 的容量。因此,与之前的静态集群相比,Jenkins Kubernetes 集群现在每天使用的实例小时数减少了 30%。”

Pinterest 天生云原生——自 2010 年第一天起就运行在 AWS 上——但即使是云原生公司也会经历成长的烦恼。

自推出以来,Pinterest 已成为家喻户晓的品牌,每月活跃用户超过 2 亿,保存的对象达 1000 亿个。在底层,运行着 1,000 个微服务和数十万个数据作业。

伴随这种增长而来的是多层基础设施以及针对不同工作负载的各种设置工具和平台,导致端到端的开发者体验不一致且复杂,最终影响了上线生产环境的速度。因此,在 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 中较大的单体仓库之一,最近已 bazel 化),”Benedict 说。“在高峰期,我们在几百个节点上运行数千个 Pod。总的来说,通过迁移到 Kubernetes,团队能够构建按需扩展和新的故障转移策略,此外还简化了 Jenkins 这种复杂基础设施的整体部署和管理。我们不仅缩短了构建时间,还获得了巨大的效率提升。例如,在非高峰时段,团队回收了超过 80% 的容量。因此,与之前的静态集群相比,Jenkins Kubernetes 集群现在每天使用的实例小时数减少了 30%。”

Benedict 指出,未来有一个“非常稳健的路线图”。除了 Pinterest 大数据团队在 Kubernetes 上进行的 Spark 实验外,公司还与 Amazon 的 EKS 团队合作开发了 ENI/CNI 插件。

一旦 Jenkins 集群退出灰度模式并正常运行,Benedict 希望建立最佳实践,包括在迁移下一个服务之前建立治理基础(包括与费用分摊系统的集成)。“我们有一系列健康的用例等待引入。在 Jenkins 之后,我们想支持 Tensorflow 和 Apache Spark。在某个时候,我们的目标是迁移公司的单体 API 服务。如果我们迁移它并理解其复杂性,这将增强我们的信心,”Benedict 说。“这将为我们迁移所有其他服务做好准备。”

作为多年的云原生先驱,Pinterest 渴望分享其正在进行的旅程。“我们能够在公有云环境中大规模运行和测试很多其他人可能无法做到的事情,”Benedict 说。“我们有很好的机会将这些经验回馈给社区。”