阿里巴巴开源容器 Pouch Container
2018-11-02侯前明
侯前明
我于2009年加入阿里,那时,阿里还没有容器产品。当时,阿里进行了有史以来最大的架构升级,即从集中式走向分布式。架构升级后,淘宝从最初的应用拆分成很多小服务,通过软负载做负载均衡,很多服务协同完成整个淘宝的功能。随着服务拆分、业务量增长,服务拆分得越来越细。分布式服务架构的演进经历了很多年,到现在也还是基本模式。分布式服务拆分对运维层面造成的最大挑战是服务的实例变多了,由于服务的单个实例在物理机上面,所以物理服务器在分布式服务拆分之后不够用了。当时,引进了虚拟化技术,把一台物理机分成三台,数量一下翻了三倍,一段时间内撑住了业务的增长。但是,虚拟化技术存在很多的问题。比如,它是有开销的,一些技术本身受瓶颈限制,使得一台物理机不能虚拟出多台使用,物理机的利用率很低。我们在思考,用什么方法能把物理机的资源做更小力度的拆分,让一台物理机运行更多的服务实例。
我们考察了淘宝业务量的增长,分布式服务体系把服务拆分得非常多、非常细,随着服务的拆分,功能不断完善,新成立了一套支撑分布式服务架构的运维体系。这个运维体系对服务实例的运行有四点要求:第一,要有独立的IP;第二,能够ssh登陆;第三,有独立的、隔离的文件系统;第四,资源隔离—使用量和可见性。我们尝试根据这四点要求模拟一个虚拟化环境,让服务跑起来,有独立的IP,用虚拟的网卡,在自己的内核上做PouchContainer,实现内核可见性隔离。经过验证,模拟的虚拟化环境能够行得通,阿里容器第一代版本正式实施。
阿里容器第一代在2015年已经有很广泛的应用,应用范围包括在线业务、电商、业务系统。2015年,我们仔细研究了Docker,我们看到Docker系统化解决文件的构建,可以非常明确的定义服务实例,使运行时的环境可以被重建恢复、可以很方便地分发,所以我们把Docker镜像机制引入阿里容器里,形成了现在的Pouch Container产品形态。我们引入Docker镜像系统之后,面临的第一个问题是怎么让镜像在大规模的现场环境快速分发。我们引入Docker镜像之前,应用服务交付的产物是一个代码包,只有几百兆,要依赖基础的SDK、基础的二方和三方以及系统服务。那时,我们的规模服务量非常多,仓库的压力和网络的压力非常大,我们引入了P2P技术,通过P2P二级分发网络来解决镜像分发的问题。
阿里巴巴集团的测试环境很特殊,应用服务非常多,镜像做开发时经常超时、经常卡顿。我们做了一个方案,把应用的镜像直接放到远端的分布式存储里面,镜像构建的时候每一层都推到远端的分布式存储集群里面,把远端的ID作为内容傳到仓库,然后把ID远程到本地,到本地目录里面做文件系统,再映射到容器里面。这样处理后,在容器启动时,一启动看到远程盘,执行使用文件时才做原始加载,从而在分发期解决了超时和卡顿的问题。这个过程中,我们支持对远程分布式存储系统的对接,包括容器编排系统和容器远程分布式系统的对接。阿里巴巴集团内部有多个网络环境,虚拟化网络集团内部也在做网络的虚拟化,有一些微链的网络,内部有插件去适配不同的网络环境,容器编排系统叫Sigma。2018年开始做全面兼容的接口,演化的过程需要CNA的接口,我们做了到内部网络插件的适配。我们内部的在线系统向无盘化演进,操作系统在做远程加载,镜像在做远程化,应用本身的数据和日志在做分离,最终形态是计算节点只跑计算服务。
阿里巴巴从2012年开始,都是基于Pouch引入镜像化,Pouch支持了绝大部分在线业务,现在的实例有百万的级别。我们覆盖不同的模式、不同的场景、不同的编程语言和监测站,也包括新兴的业务。阿里巴巴从2011年开始推动内部产品开源,目前阿里巴巴开源和维护的开源项目有150多个,涵盖中间件、开发框架、数据库和各种工具类软件。Pouch Container于2017年初酝酿开源,和浙江大学SEL实验室合作孵化,2017年11月正式开源。我们内部的Pouch版本和内部的运维体系、工具体系监控,有非常紧密的集成,耦合性比较多,解决方法不够通用,没办法把代码直接放出来。所以,我们的开源项目是在外部重新孵化。
Pouch Container现在的版本已经到了Pouch Container0.5,准备于2018年“双11”返迁集团内部,让一部分业务使用起来。Pouch Container开源过程中的策略是尽量融入社区生态,追随社区的标准、规范和接口。Pouch Container开源希望提供独特价值:友好的兼容性,更好的隔离性;存量业务的快速容器化支持;规模化应用中的最佳实践沉淀。我们在容器核心的管理层用了RunD,内部存储管理系统会引入CSI对接存储和容器。同时,会在内部适配网络环境,在外部用通用的方式去适配外部环境。但是,外部特殊的解决方式不太通用,我们引入一些开源解决方案来解决特定问题。比如,我们引入lxcfs、采用prjquota等。Pouch Container的开源之路,已经形成开源的生态架构,开源项目已经开发,已经有60多个贡献者。 (根据演讲内容整理,未经本人审核)