摘要:继重启维护Dubbo后,阿里技术在开源方面的动态不断,在中国开源年会上,阿里巴巴又正式开源了其自研容器技术Pouch。
在中国开源年会现场,阿里巴巴正式开源了基于 Apache 2.0 协议的容器技术 Pouch。Pouch 是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的作到内部业务的交付,同时提升超大规模下数据中心的物理资源利用率。开源以后,Pouch 成为一项普惠技术,人人均可以在 GitHub 上获取,GitHub 项目地址:
https://github.com/alibaba/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 存在很多独有的技术优点。
隔离性强
隔离性是企业走云化之路过程当中,没法回避的一个技术难题。隔离性强,意味着技术具有了商用的初步条件;反之则几乎没有可能在业务线上铺开。哪怕是阿里巴巴这样的技术公司,实践容器技术伊始,安全问题都没法幸免。众所周知,行业中的容器方案大多基于 Linux 内核提供的 cgroup 和 namespace 来实现隔离,而后这样的轻量级方案存在弊端:
- 容器间,容器与宿主间,共享同一个内核;
- 内核实现的隔离资源,维度不足。
面对如此的内核现状,阿里巴巴采起了三个方面的工做,来解决容器的安全问题:
- 用户态加强容器的隔离维度,好比网络带宽、磁盘使用量等;
- 给内核提交 patch,修复容器的资源可见性问题,cgroup 方面的 bug;
- 实现基于 Hypervisor 的容器,经过建立新内核来实现容器隔离。
容器安全的研究,在行业中将会持续至关长时间。而阿里在开源 Pouch 中,将在原有的安全基础上,继续融合 lxcfs 等特性与社区共享。同时阿里巴巴也在计划开源“阿里内核”,将多年来阿里对 Linux 内核的加强回馈行业。
P2P 镜像分发
随着阿里业务爆炸式增加,以及 2015 年以后容器技术的迅速普及,阿里容器镜像的分发也同时成为亟待解决的问题。虽然,容器镜像已经帮助企业在应用文件复用等方面,相较传统方法作了不少优化,可是在数以万计的集群规模下,分发效率依然使人抓狂。举一个简单例子:若是数据中心中有 10000 台物理节点,每一个节点同时向镜像仓库发起镜像下载,镜像仓库所在机器的网络压力,CPU 压力可想而知。
基于以上场景,阿里巴巴镜像分发工具“蜻蜓”应运而生。蜻蜓是基于智能 P2P 技术的通用文件分发系统。解决了大规模文件分发场景下分发耗时、成功率低、带宽浪费等难题。大幅提高发布部署、数据预热、大规模容器镜像分发等业务能力。目前,“蜻蜓”和 Pouch 同时开源,项目地址为:
https://github.com/alibaba/dragonfly
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 的开源计划中,明年 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 地址为:
https://github.com/alibaba/pouch
做者介绍
孙宏亮,阿里巴巴技术专家,毕业于浙江大学,目前在阿里巴巴负责容器项目 Pouch 的开源建设。数年来一直从事云计算领域,是国内第一批研究和实践容器技术的工程师,在国内起到极为重要的容器技术布道做用。拥有著做《Docker 源码分析》,我的崇尚开源精神,同时是 Docker Swarm 项目的全球 Maintainer。