Pinterest的容器化实践经验

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是Pinterest的容器化实践经验【编者的话】本文介绍了Pinterest向容器化平台转型的实践和经验。
本文讲的是Pinterest的容器化实践经验【编者的话】本文介绍了Pinterest向容器化平台转型的实践和经验。

Pinterest堪称图片版的Twitter,网民可以将感兴趣的图片在Pinterest保存,其他网友可以关注,也可以转发图片。
过去的一年里,Pinterest云管理平台和站点可靠性工程团队关注于将工作负载从EC2实例迁移到Docker容器上。到目前为止,我们已经迁移了超过一半的无状态服务,包括所有的API fleet。该博文给大家分享整个过程中我们的经历和收获。

最近这些年里,Docker和容器编排技术,比如Mesos和Kubernetes已经成为了业界热点,证明了构建基于容器的平台的优势。对于我们来说,实现容器平台可以带来如下优势:
  • 让开发人员无需再学习Puppet这样的工具,从而提升了他们的效率
  • 提供不可变基础架构,带来更好的可靠性
  • 提高基础架构的敏捷性

我们在2016年初开始了调研,评估和测试。最开始的计划是不仅仅将工作负载迁移到Docker容器上,而且同时引入容器编排器技术,以多租户的方式运行容器。随着进一步的调研,我们决定分阶段实施。首先将服务移动到Docker上,让大家不需要再花时间在Puppet上,并且构建好不可变基础架构。同时,我们也引入容器编排技术,更好地利用资源并使用开源的容器编排技术。

在迁移之前

在容器化工作之前,Pinterest的服务的开发和启动如下图所示:
1.png

  • 有一个基础的Amazon Machine Image(AMI),包括操作系统,通用共享包和安装好的工具。对于一些服务来说,大多数是那些大型并且复杂的服务,还有一个服务特定的AMI,它基于基础AMI构建,包含服务所依赖的包。
  • 这之上,我们使用两个部署工具:Puppet和Teletraan。Puppet用来预配cron job,infra组件,比如服务发现,度量和日志及其配置文件。Teletraan部署生产服务代码以及一些机器学习模型。
  • 这些服务由不同的流程管理器,包括Monit,Supervisor和Upstart运行。

但是,这些流程有如下痛点:
  • 工程师需要负责AMI build以及学习这些流程管理器的不同的配置语言,包括Puppet。
  • Puppet变更可能在任意时间应用到主机上,缺乏更细粒度的控制。
  • 随着时间的流逝,主机上的环境渐渐产生差异,导致运维的问题。

迁移

对于Pinterest 来说,基础架构的迁移是很大的挑战,因为规模大复杂度高。编程语言各异,跨越技术堆栈的技术依赖,性能和可用性的严苛要求,以及技术债务都需要考虑到。

我们的容器化从小型的,CMP和SRE团队负责的不那么重要的应用程序开始。同时,在开发和测试环境里,我们开始将重要的服务放到容器里。以此为基础,容器化开始广泛渗透。

最先迁移的应用程序之一是我们主要的API fleet。我们认为在早期迁移最大最复杂的系统之一有助于从一开始就能遇到并且解决重要的问题。这样的流程帮助我们创建并且加强了基础架构所需的工具集。这样做还降低了未来不得不花时间重写工具以包含其他特性的风险。

早期最大的挑战是性能问题。虽然Docker网络对于开发来说非常棒,但是众所周知,在生产环境中性能不太好。所以我们最终决定使用主机的网络,而不依赖于Docker网络。我们运行了一些测试确保在容器里运行API Fleet不会遇到什么问题。

对于API迁移,我们确保有一个完善的度量集来比较在容器内运行和外部运行。该流程帮助确定哪些运行在Docker里,哪些运行在主机上。它还帮助我们在早期发现测试环境里转换流程导致的问题,并且最终让我们有信心推送到生产环境上。在回归和问题监控下,迁移流程在一个月内就完成了。很庆幸这个流程总体平稳,没有造成任何大问题。

迁移之后

在使用API fleet为基础之上构建primitive后,公司的容器化旅程持续进行。我们能够利用创建的工具来支持最复杂的应用程序,从而支撑其他应用程序的迁移。

Docker平台现在如下:
2.png

  • 所有容器服务只有一个AMI。服务特定的所有依赖都被放入容器内。除了服务容器,所有支持组件(服务发现,度量,日志,服务代理等等)都运行在Docker容器内,和服务容器一起协作。
  • 工程师们仍然使用Teletraan接口部署容器,但是现在使用的是Telefig,我们自己构建的工具,来启动以及停止容器,并且管理容器之间的依赖。
  • Docker容器引擎作为流程管理器来监控并且重启容器。引擎的重启策略设置为永不停止,并且开启了live-restore。

如下是我们如何运行这些Docker容器的更为详细的信息:
  • 所有容器运行在net=host,这样让我们拥有原生的网络性能。AWS依赖,比如IAM角色和安全组还在原模型下运行,无需任何代码变更。
  • Amazon ECR是主要的Docker registry。同时自己维护了第二个Docker registry,从ECR复制而来,保证生产环境的高可用。
  • 工程师用YAML文件描述服务,和Docker compose文件语法类似。它包含一系列Pinterest特定的primitive,这样让开发人员无需编写太长的配置。
  • 每个容器的tag格式为[Name]:[git commit hash],表示唯一的build。
  • 运行在Ubuntu上,使用的是自定制的最新Linux kernel。
  • 一开始使用的是Docker 1.11,现在是在Docker 17.03.1-ce上运行fleet。

展望未来

我们已经达成了容器化服务的第一阶段的目标。下一个阶段里将引入容器编排,构建多租户的集群,为长期运行的服务和批量job提供唯一的接口。

原文链接:Containerization at Pinterest(翻译:崔婧雯)  
===========================
译者介绍

崔婧雯,现就职于IBM,高级软件工程师,负责IBM WebSphere业务流程管理软件的系统测试工作。曾就职于VMware从事桌面虚拟化产品的质量保证工作。对虚拟化,中间件技术,业务流程管理有浓厚的兴趣。

原文发布时间为:2017-09-23

本文作者:崔婧雯

本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Pinterest的容器化实践经验

相关文章
|
1月前
|
运维 安全 Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在数字化转型的浪潮中,企业对于IT基础设施的要求越来越高,不仅需要快速响应市场变化,还要确保系统的稳定与安全。本文深入探讨了如何通过融合DevOps文化和容器化技术来构建一个高效、稳定且易于管理的云基础设施。通过实际案例分析,阐述了持续集成/持续部署(CI/CD)流程的优化、自动化测试、监控以及日志管理等关键环节的实施策略,旨在为运维专业人员提供一套切实可行的解决方案。
29 3
|
1月前
|
运维 Kubernetes Devops
构建高效可靠的云基础设施:DevOps与容器化技术融合实践
【2月更文挑战第30天】 在当今快速迭代和竞争激烈的软件开发领域,传统的IT运维模式已难以满足业务发展的需要。本文将探讨如何通过整合DevOps文化和容器化技术,构建一个既高效又可靠的云基础设施。文章首先回顾了DevOps的核心理念及其对运维工作流的影响,接着深入讨论了容器化技术的优势和挑战,并提出了一套结合两者的实施方案。最后,通过案例分析展示了该方案在实际环境中的应用效果和潜在益处。
|
8月前
|
弹性计算 Kubernetes Cloud Native
现代化部署与管理:ECS容器化与云原生应用实践
本文深入研究了云服务器ECS的容器化与云原生应用部署策略,重点关注了Docker、Kubernetes等容器化技术的基本概念,以及ECS与容器的集成。在第八章的容器化技术简介部分,我们介绍了如何使用Docker打包和部署应用,以及如何在ECS上部署容器化应用。通过示例代码,读者可以了解如何在ECS中集成容器化应用。
315 0
|
10天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
12天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第13天】 在当今快速迭代和持续部署的软件开发环境中,传统的IT运维模式已难以满足业务发展的需求。本文聚焦于如何通过融合DevOps理念与容器化技术,构建一个高效、稳定且易于管理的云基础设施。文章将探讨持续集成/持续交付(CI/CD)流程的优化、容器化技术的最佳实践、以及微服务架构下的应用管理,以期为企业提供一种改进运维效率、加速产品上市时间,同时保障系统稳定性的解决方案。
|
27天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
随着企业数字化转型的不断深入,传统的IT运维模式已经难以满足快速迭代和持续交付的需求。本文将探讨如何通过结合DevOps文化与容器化技术,构建一个既高效又稳定的云基础设施。文章首先概述了DevOps的核心理念及其在现代运维中的重要性,然后详细介绍了容器化技术,特别是Docker和Kubernetes在实现微服务架构中的应用。最后,文中通过案例分析展示了这一融合实践如何在真实环境中提升运维效率和系统稳定性。
21 7
|
30天前
|
运维 Kubernetes 监控
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
在当今云计算时代,企业追求敏捷性、可扩展性以及成本效益的云基础设施。本文将探讨如何通过DevOps文化与容器化技术的融合,打造一个既高效又稳定的运维环境。文章不仅阐述了DevOps和容器化技术各自的优势,还提供了一个具体的实施案例,展示了这种结合如何优化资源利用、提高部署速度并降低运维复杂性。
|
1月前
|
运维 监控 Devops
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
在数字化转型的浪潮中,企业的IT基础设施和软件交付模式正经历着深刻的变革。传统的运维方式已难以满足快速迭代、灵活扩展的现代业务需求。本文将探讨如何通过容器技术实现高效的自动化运维体系,重点分析持续集成(CI)与持续部署(CD)的实践方法及其对企业运维效率的影响。通过引入微服务架构、容器编排、DevOps文化等概念,我们旨在为读者提供一套全面的自动化运维解决方案,以支持业务的敏捷性和可扩展性。
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
1月前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
105 0