挑战
经过八年的发展,Pinterest 已经发展到拥有 1,000 个微服务、多层基础设施以及各种设置工具和平台。2016 年,该公司推出了一项通向全新计算平台的路线图,其愿景是创建从构思到生产的最快路径,而无需工程师担心底层基础设施。
解决方案
第一阶段涉及将服务迁移到 Docker 容器。一旦这些服务在 2017 年初投入生产,团队就开始寻求编排来帮助提高效率并以去中心化的方式管理它们。在评估了各种解决方案后,Pinterest 选择了 Kubernetes。
影响
“通过迁移到 Kubernetes,团队能够构建按需扩展和新的故障转移策略,此外还简化了 Jenkins 等复杂基础设施的整体部署和管理,”Pinterest 云和数据基础设施组产品经理 Micheal Benedict 说。“我们不仅看到了构建时间的缩短,还看到了巨大的效率提升。例如,该团队在非高峰时段回收了超过 80% 的容量。因此,与之前的静态集群相比,Jenkins Kubernetes 集群现在每天使用的实例小时数减少了 30%。”
自推出以来,Pinterest 已成为家喻户晓的名字,每月活跃用户超过 2 亿,保存的对象超过 1000 亿个。在幕后,有 1,000 个微服务在运行,还有数十万个数据作业。
随着这种增长,出现了多层基础设施以及针对不同工作负载的各种设置工具和平台,导致端到端的开发者体验不一致且复杂,最终降低了投入生产的速度。因此,在 2016 年,该公司推出了一项通向全新计算平台的路线图,其愿景是拥有从构思到生产的最快路径,而无需工程师担心底层基础设施。
第一阶段涉及迁移到 Docker。“长期以来,Pinterest 一直在虚拟机上、直接在 EC2 实例上大量运行,”云和数据基础设施组产品经理 Micheal Benedict 说。“为了解决软件打包方面的问题,并且不让工程师拥有部分机群以及应对这些挑战,我们对打包机制进行了标准化,然后将其迁移到虚拟机之上的容器中。没有太多剧烈的变化。我们当时不想进行大刀阔斧的改革。”
第一个迁移的服务是为 Pinterest 大部分功能提供支持的单体 API 机群。与此同时,Benedict 的基础设施治理团队构建了计费和容量规划系统,以分析公司如何在 AWS 上使用其虚拟机。“很明显,在我们正在做的事情中,在虚拟机上运行是不可持续的,”Benedict 说。“很多资源都没有得到充分利用。我们做了一些效率提升的工作,这些工作在一定规模下效果很好,但现在你必须转向一种更加去中心化的管理方式。所以我们认为编排可以帮助解决这个问题。”
这导致了路线图的第二阶段。2017 年 7 月,经过八周的评估期后,该团队选择了 Kubernetes,而不是其他编排平台。“Kubernetes 当时缺乏某些东西——例如,我们希望在 Kubernetes 上运行 Spark,”Benedict 说。“但我们意识到,即使是尝试构建它所投入的开发周期也是非常值得的,无论是对 Pinterest 还是对社区而言。我们一直在 Big Data SIG 中进行这些对话。我们意识到,当我们开始将许多东西投入生产时,我们将能够利用社区正在做的事情。”
2018 年初,该团队开始将其第一个用例——Jenkins 工作负载——加入 Kubernetes 系统。“虽然我们在一天中的某个时段进行构建,但我们始终需要分配峰值容量,”Benedict 说。“它们没有任何自动扩展功能,因此容量保持不变。很难加快构建速度,因为增加容量需要更多时间。因此,考虑到这些问题,我们认为这将是我们开展工作的完美用例。”
他们扩大了集群规模,并与一个四人团队合作,让 Jenkins Kubernetes 集群为生产做好准备。“我们仍然有静态 Jenkins 集群,”Benedict 说,“但在 Kubernetes 上,我们正在进行类似的构建,测试整个管道,准备好工件,并进行比较,看看构建需要多长时间。SLA 是否正常,生成的工件是否正确,是否存在问题?”
“到目前为止,一切都很顺利,”他补充说,“尤其是在我们如何在 Kubernetes 共享集群上配置 Jenkins 工作负载方面的弹性。这是我们一直在努力争取的胜利。”
到 2018 年第一季度末,该团队成功地将 Jenkins Master 迁移到 Kubernetes 上本地运行,并合作开发了 Jenkins Kubernetes 插件 来管理工作器的生命周期。“我们目前正在这个新集群上构建整个 Pinterest JVM 堆栈(Pinterest 上最大的单体仓库之一,最近进行了 bazelize 处理),”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 说。“我们非常乐意回馈我们的一些经验教训。”