推荐文章 | Article
阿里巴巴正式开源其自研容器技术Pouch
11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于Apache 2.0 协议的容器技术Pouch。Pouch是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率。开源之后,Pouch成为一项普惠技术,人人都可以在GitHub上获取,GitHub项目地址。
Pouch的开源,是阿里看好容器技术的一个信号。时至今日,全球范围内,容器技术在大多数企业中落地,已然成为一种共识。如何做好容器的技术选型,如何让容器技术可控,相信是每一个企业必须考虑的问题。Pouch无疑使得容器生态再添利器,在全球巨头垄断的容器开源生态中,为中国技术赢得了一块阵地。
Pouch技术现状
此次开源Pouch,相信行业中很多专家都会对阿里目前的容器技术感兴趣。到底阿里玩容器是一个侠之大者,还是后起之秀呢?以过去看未来,技术领域尤其如此,技术的沉淀与积累,大致可以看清一家公司的技术实力。
Pouch演进
追溯Pouch的历史,我们会发现Pouch起源于2011 年。当时,Linux内核之上的namespace、cgroup等技术开始成熟,LXC等工具也在同时期诞生不久。阿里巴巴作为一家技术公司,即基于LXC研发了容器技术t4,并在当时以产品形态给集团内部提供服务。此举被视为阿里对容器技术的第一次探索,也为阿里的容器技术积淀了最初的经验。随着时间的推移,两年后,Docker横空出世,其镜像技术层面,极大程度上解决了困扰行业多年的“软件封装”问题。镜像技术流行开来后,阿里没有理由不去融合这个给行业带来巨大价值的技术。于是,在2015 年,t4 在自身容器技术的基础上,逐渐吸收社区中的Docker镜像技术,慢慢演变,打磨为Pouch。
带有镜像创新的容器技术,似一阵飓风,所到之处,国内外无不叫好,阿里巴巴不外如是。2015年末始,阿里巴巴集团内部在基础设施层面也在悄然发生变化。原因很多,其中最简单的一条,相信大家也不难理解,阿里巴巴体量的互联网公司,背后必定有巨大的数据中心在支撑,业务的爆炸式增长,必定导致基础设施需求的增长,也就造成基础设施成本的大幅提高。容器的轻量级与资源消耗低,加上镜像的快速分发,迅速让阿里巴巴下定决心,在容器技术领域加大投入,帮助数据中心全面升级。
阿里容器规模
经过两年多的投入,阿里容器技术Pouch已经在集团基础技术中,扮演着极其重要的角色。2017 年双11,巨额交易1682 亿背后,Pouch在“超级工程”中做到了:
· 100% 的在线业务Pouch化
· 容器规模达到百万级
回到阿里集团内部,Pouch的日常服务已经覆盖绝大部分的事业部,覆盖的业务场景包括:电商、广告、搜索等;覆盖技术栈包括:电商应用、数据库、大数据、流计算等;覆盖编程语言:Java、C++、NodeJS等。
Pouch技术优势
阿里巴巴容器技术如此之广的应用范围,对行业来说实属一大幸事,因为阿里已经用事实说明:容器技术已经在大规模生产环境下得到验证。然而,由于Pouch源自阿里,而非社区,因此在容器效果、技术实现等方面,两套体系存在差异。换言之,Pouch存在不少独有的技术优势。
隔离性强
隔离性是企业走云化之路过程中,无法回避的一个技术难题。隔离性强,意味着技术具备了商用的初步条件;反之则几乎没有可能在业务线上铺开。哪怕是阿里巴巴这样的技术公司,实践容器技术伊始,安全问题都无法幸免。众所周知,行业中的容器方案大多基于Linux内核提供的cgroup和namespace来实现隔离,然后这样的轻量级方案存在弊端:
· 容器间,容器与宿主间,共享同一个内核;
· 内核实现的隔离资源,维度不足。
面对如此的内核现状,阿里巴巴采取了三个方面的工作,来解决容器的安全问题:
· 用户态增强容器的隔离维度,比如网络带宽、磁盘使用量等;
· 给内核提交patch,修复容器的资源可见性问题,cgroup方面的bug;
· 实现基于Hypervisor的容器,通过创建新内核来实现容器隔离。
容器安全的研究,在行业中将会持续相当长时间。而阿里在开源Pouch中,将在原有的安全基础上,继续融合lxcfs等特性与社区共享。同时阿里巴巴也在计划开源“阿里内核”,将多年来阿里对Linux内核的增强回馈行业。
P2P镜像分发
随着阿里业务爆炸式增长,以及2015 年之后容器技术的迅速普及,阿里容器镜像的分发也同时成为亟待解决的问题。虽然,容器镜像已经帮助企业在应用文件复用等方面,相较传统方法做了很多优化,但是在数以万计的集群规模下,分发效率依然令人抓狂。举一个简单例子:如果数据中心中有10000 台物理节点,每个节点同时向镜像仓库发起镜像下载,镜像仓库所在机器的网络压力,CPU压力可想而知。
基于以上场景,阿里巴巴镜像分发工具“蜻蜓”应运而生。蜻蜓是基于智能P2P技术的通用文件分发系统。解决了大规模文件分发场景下分发耗时、成功率低、带宽浪费等难题。大幅提升发布部署、数据预热、大规模容器镜像分发等业务能力。目前,“蜻蜓”和Pouch同时开源,项目地址。
Pouch与蜻蜓的使用架构图如下:
富容器技术
阿里巴巴集团内部囊括了各式各样的业务场景,几乎每种场景都对Pouch有着自己的要求。如果使用外界“单容器单进程”的方案,在业务部门推行容器化存在令人难以置信的阻力。阿里巴巴内部,基础技术起着巨大的支撑作用,需要每时每刻都更好的支撑业务的运行。当业务运行时,技术几乎很难做到让业务去做改变,反过来适配自己。因此,一种对应用开发、应用运维都没有侵入性的容器技术,才有可能大规模的迅速铺开。否则的话,容器化过程中,一方面得不到业务方的支持,另一方面也需要投入大量人力帮助业务方,非标准化的实现业务运维。
阿里深谙此道,内部的Pouch技术可以说对业务没有任何的侵入性,也正是因为这一点在集团内部做到100% 容器化。这样的容器技术,被无数阿里人称为“富容器”。
“富容器”技术的实现,主要是为了在Linux内核上创建一个与虚拟机体验完全一致的容器。如此一来,比一般容器要功能强大,内部有完整的init进程,以及业务应用需要的任何服务,当然这也印证了Pouch为什么可以做到对应用没有“侵入性”。技术的实现过程中,Pouch需要将容器的执行入口定义为systemd,而在内核态,Pouch引入了cgroup namespace这一最新的内核patch,满足systemd在富容器模式的隔离性。从企业运维流程来看,富容器同样优势明显。它可以在应用的Entrypoint启动之前做一些事情,比如统一要做一些安全相关的事情,运维相关的agent拉起。这些需要统一做的事情,倘若放到用户的启动脚本,或镜像中就对用户的应用诞生了侵入性,而富容器可以透明的处理掉这些事情。
内核兼容性
容器技术的井喷式发展,使得不少走在技术前沿的企业享受到技术红利。然后,“长尾效应”也注定技术演进存在漫长周期。Pouch的发展也在规模化进程中遇到相同问题。
但凡规模达到一定量,“摩尔定律”决定了数据中心会存有遗留资源,如何利用与处理这些物理资源,是一个大问题。阿里集团内部也是如此,不管是不同型号的机器,还是从2.6.32 到3.10+ 的Linux内核,异构现象依然存在。倘若要使所有应用运行Pouch之中,Pouch就必须支持所有内核版本,而现有的容器技术支持的Linux内核都在3.10 以上。不过技术层面万幸的是,对2.6.32 等老版本内核而言,namespace的支持仅仅缺失user namespace;其他namespace以及常用的cgroup子系统均存在;但是 /proc/self/ns等用来记录namespace的辅助文件当时还不存在,setns等系统调用也需要在高版本内核中才能支持。而阿里的技术策略是,通过一些其他的方法,来绕过某些系统调用,实现老版本内核的容器支持。
当然,从另一个角度而言,富容器技术也很大程度上,对老版本内核上的其他运维系统、监控系统、用户使用习惯等实现了适配,保障Pouch在内核兼容性方面的高可用性。
因此综合来看,在Pouch的技术优势之上,我们不难发现适用Pouch的应用场景:传统IT架构的的迅速容器化,企业大规模业务的部署,安全隔离要求高稳定性要求高的金融场景等。
Pouch架构
凭借差异化的技术优势,Pouch在阿里巴巴大规模的应用场景下已经得到很好的验证。然而,不得不说的是:目前阿里巴巴内部的Pouch与当前开源版本依然存在一定的差异。
虽然优势明显,但是如果把内部的Pouch直接开源,这几乎是一件不可能的事。多年的发展,内部Pouch在服务业务的同时,存在与阿里内部基础设施、业务场景耦合的情况。耦合的内容,对于行业来说通用性并不强,同时涉及一些其他问题。因此,Pouch开源过程中,第一要务即解耦内部依赖,把最核心的、对社区同样有巨大价值的部分开源出来。同时,阿里希望在开源的最开始,即与社区站在一起,共建Pouch的开源社区。随后,以开源版本的Pouch逐渐替换阿里巴巴集团内部的Pouch,最终达成Pouch内外一致的目标。当然,在这过程中,内部Pouch的解耦工作,以及插件化演进工作同样重要。而在Pouch的开源计划中,明年3月底会是一个重要的时间点,彼时Pouch的1.0 版本将发布。
从计划开源的第一刻开始,Pouch在生态中的架构图就设计如下:
Pouch的生态架构可以从两个方面来看:第一,如何对接容器编排系统;第二,如何加强容器运行时。
容器编排系统的支持,是Pouch开源计划的重要板块。因此,设计之初,Pouch就希望自身可以原生支持Kubernetes等编排系统。为实现这点,Pouch在行业中率先支持container 1.0.0。目前行业中的容器方案containerd主要停留在0.2.3 版本,新版本的安全等功能还无法使用,而Pouch已经是第一个吃螃蟹的人。当前Docker依然是Kubernetes体系中较火的容器引擎方案,而Kubernetes在runtime层面的战略计划为使用cri-containerd降低自身与商业产品的耦合度,而走兼容社区方案的道路,比如cri-containerd以及containerd社区版。另外,需要额外提及的是,内部的Pouch是阿里巴巴调度系统Sigma的重要组成部分,同时支撑着“混部”工程的实现。Pouch开源路线中,同样会以支持“混部”为目标。未来,Sigma的调度(scheduling)以及混部(co-location)能力有望服务行业。
生态方面,Pouch立足开放;容器运行时方面,Pouch主张“丰富”与“安全”。runC的支持,可谓顺其自然。runV的支持,则表现出了和生态的差异性。虽然docker默认支持runV,然而在docker的API中并非做到对“容器”与“虚拟机”的兼容,从而Docker并非是一个统一的管理入口。而据我们所知,现有企业中仍有众多存量虚拟机的场景,因此,在迎接容器时代时,如何通过统一的运维入口,同时管理容器和虚拟机,势必会是“虚拟机迈向容器”这个变迁过渡期中,企业最为关心的方案之一。Pouch的开源形态,很好的覆盖了这一场景。runlxc是阿里巴巴自研的lxc容器运行时,Pouch对其的支持同时也意味着runlxc会在不久后开源,覆盖企业内部拥有大量低版本Linux内核的场景。
Pouch对接生态的架构如下,而Pouch内部自身的架构可参考下图:
和传统的容器引擎方案相似,Pouch也呈现出C/S的软件架构。命令行CLI层面,可以同时支持Pouch CLI以及Docker CLI。对接容器runtime,Pouch内部通过container client通过gRPC调用containerd。Pouch Daemon的内部采取组件化的设计理念,抽离出相应的System Manager、Container Manager、Image Manager、Network Manager、Volume Manager提供统一化的对象管理方案。
写在最后
如今Pouch的开源,意味着阿里积累的容器技术将走出阿里,面向行业。而Pouch的技术优势,决定了其自身会以一个差异化的容器解决方案,供用户选择。企业在走云化之路,拥抱云原生(Cloud Native)时,Pouch致力于成为一款强有力的软件,帮助企业的数字化转型做到最稳定的支持。
Pouch目前已经在GitHub上开源,欢迎任何形式的开源参与。GitHub地址。
作者介绍
孙宏亮,阿里巴巴技术专家,毕业于浙江大学,目前在阿里巴巴负责容器项目Pouch的开源建设。数年来一直从事云计算领域,是国内第一批研究和实践容器技术的工程师,在国内起到极为重要的容器技术布道作用。拥有著作《Docker源码分析》,个人崇尚开源精神,同时是Docker Swarm项目的全球Maintainer。