陈奇网络工作室

从虚拟化到云原生——容器技术发展史

近年来,云原生是IT行业最热门的概念之一,许多互联网巨头都开始积极拥抱云原生。说到云的诞生,我们不得不了解主角——容器。容器技术可谓支撑了云原生生态的半壁江山。容器作为一种先进的虚拟化技术,已经成为云原生时代软件开发和运维的标准基础设施。在了解它之前,我们不妨先从虚拟化技术说起。

什么是虚拟化技术?

1961年,—— IBM709实现了分时系统。

计算机历史上第一个虚拟化技术实现于1961年。IBM709计算机第一次将CPU的使用划分为几个极短(1/100秒)的时间片,每个时间片用于执行不同的任务。通过轮询这些时间片,一个CPU可以被虚拟化或伪装成多个CPU,每个虚拟CPU看起来都在同时运行。这是虚拟机的原型。

容器的功能其实和虚拟机差不多。无论是容器还是虚拟机,实际上都是在计算机的不同层面上进行虚拟化,也就是用逻辑来表示资源,从而摆脱物理限制的束缚,提高物理资源的利用率。虚拟化技术是一个抽象而丰富的概念,在不同的领域或层次有不同的含义。

这里我们先说一下计算机的层次结构。对于大多数软件开发人员来说,计算机系统可以分为以下层次结构:

应用层、函数库层、操作系统层和硬件层。

所有层次都是自下而上的,每一层都提供了向上的接口。同时,每一层只需要知道下一层的接口就可以调用下层的函数实现上层的操作(不需要知道下层的具体运行机制)。

但是,由于早期计算机厂商生产的硬件遵循自己的标准和规范,不同计算机硬件之间的操作系统兼容性很差;同样,不同的软件在不同的操作系统下兼容性也很差。因此,一些开发人员人为地在层间创建了抽象层:

应用层函数库层API抽象层操作系统层硬件抽象层硬件层

就我们而言,所谓虚拟化,就是人为地在上下层之间创建一个新的抽象层,让上层软件直接运行在新的虚拟环境中。简单来说,虚拟化就是通过访问下层原有的功能模块创建接口来“欺骗”上层,从而达到跨平台开发的目的。

结合以上思路,我们可以重新认识几种众所周知的虚拟化技术:

虚拟机:存在于硬件层和操作系统层之间的虚拟化技术。

虚拟机通过“锻造”一个硬件抽象接口,将一个操作系统以及操作系统层之上的层嫁接到硬件上,实现与真实物理机几乎相同的功能。例如,如果我们在Windows电脑上使用Android虚拟机,我们可以使用这台电脑打开Android系统上的应用程序。

容器:存在于操作系统层和函数库层之间的虚拟化技术。

容器通过“锻造”操作系统的接口,将函数放在操作系统的函数库层之上。以docker为例,它是一个基于Linux操作系统的Namespace和Cgroup函数的隔离容器,可以模拟操作系统的功能。简单来说,如果虚拟机将整个操作系统封装隔离实现跨平台应用,那么容器将各个应用分别封装隔离实现跨平台应用。因此,容器比虚拟机小得多,理论上占用的资源也更少。

JVM:存在于函数库层和应用程序之间的虚拟化技术。

Java虚拟机也有跨平台的特性,所谓的跨平台特性其实是虚拟化的功劳。我们知道Java语言调用操作系统的函数库,JVM就是在应用层和函数库层之间建立一个抽象层,通过不同的版本适配不同的操作系统函数库,为程序和开发者提供一个统一的运行环境,让开发者可以调用不同操作系统的函数库。

对虚拟化技术有了大致的了解之后,我们就可以了解容器的诞生历史了。虽然容器的概念是在Docker出现之后才在全球范围内流行起来的,但是在Docker之前,无数的先行者已经在探索这种前瞻性的虚拟化技术了。

集装箱“监狱”的前身

1979年,——贝尔实验室发明了chroot。

容器的主要特征之一是进程隔离。早在1979年,贝尔实验室在开发Unix V7的过程中就发现,当一个系统软件被编译安装后,整个测试环境的变量会发生变化。如果我们下次想要构建、安装和测试,我们必须重新构建和配置测试环境。要知道,在那个年代,一块64K的内存芯片就要419美元,“快速摧毁重建基础设施”的成本真的太高了。

开发者开始思考,能否在现有的操作系统环境下,隔离出一个独立的环境来进行软件的重构和测试?于是,一个叫做chroot(改变根)的系统调用函数诞生了。

Chroot可以将一个进程及其子进程的根目录重定向到文件系统上的一个新位置,这意味着它可以分离每个进程的文件访问权限,使进程无法接触外部文件,因此这个隔离的新环境也被命名为Chroot Jail。之后只要把需要的系统文件复制到Chroot Jail,就可以实现软件的重新配置和测试。这一进步打开了进程隔离的大门,为Unix提供了简单的系统隔离功能,尤其是jail的思想为容器技术的发展奠定了基础。但此时chroot的隔离功能仅限于文件系统,进程和网络空间并没有得到相应的处理。

21世纪,虚拟机(VM)技术相对成熟,人们可以通过VM技术实现跨操作系统开发。但由于VM需要封装隔离整个操作系统,占用大量资源,在生产环境中过于繁琐。于是人们开始追求一种更具移植性的虚拟化技术,许多基于chroot扩展的进程隔离技术相继诞生。

2000年,FreeBSD在——推出了FreeBSD监狱。

chroot诞生21年后,FreeBSD 4.0版本推出了一套微主机环境共享系统FreeBSD Jail,扩展了chroot的现有机制。在FreeBSD Jail中,程序有自己的文件系统,有独立的进程和网络空间。监狱中的进程既不能访问也不能看到监狱外的文件、进程和网络资源。

2001年,——Linux VServer诞生。

2001年,在Linux内核中加入了Linux VServer(虚拟服务器),为Linux系统提供虚拟化功能。Linux VServer还采用了监狱机制,可以在一个计算机系统上划分文件系统、网络地址和内存,允许多个虚拟单元同时运行。

Sun在2004年发布了Solaris容器。

这项技术也是chroot进一步开发的。2004年2月,SUN发布了类Unix系统Solaris 10 beta版,增加了操作系统虚拟化功能容器,在Solaris 10正式版中有所改进。Solaris容器支持x86和SPARC系统,SUN创建了一个区域函数来与容器协作。前者是单个操作系统中完全隔离的虚拟服务器,进程隔离通过区域提供的系统资源控制和边界分隔来实现。

——OpenVZ出生于2005年。

与Solaris Containers类似,它通过修补Linux内核来提供虚拟化、隔离、资源管理和状态检查检查点。每个OpenVZ容器都有一组独立的文件系统、用户和用户组、进程树、网络、设备和IPC对象。

这一时期的进程隔离技术大多基于Jail模式,基本实现了进程相关资源的隔离操作。但是,由于此时在生产和开发中缺乏相应的使用场景,这项技术一直被局限在一个小而有限的世界里。

就在这时,一种叫做“云”的新技术正在悄然萌芽.

“云”的诞生

从2003年到2006年,Google相继发表了三篇产品设计论文,从计算模式到存储模式,创造性地提出了分布式计算架构,奠定了大数据计算技术的基础。在此基础上,谷歌颠覆者提出了“谷歌101”计划,正式开创了“云”的概念。一时间,“云计算”、“云存储”等新词轰动全球。随后,亚马逊、IBM等行业巨头也纷纷公布了自己的“云”计划,宣告了“云”技术时代的到来。

也是从这个时期开始,工艺隔离技术进入了更高级的阶段。在Google提出的云计算框架下,孤立的进程不仅仅是一个与外界隔绝的监狱,也是静止不动的。它们需要像便携容器一样,除了与外界隔离之外,还可以被控制和部署,从而实现分布式应用场景下的跨平台、高可用性和可扩展性的特点。

2006年,Google推出了Process Containers,后来改名为Cgroups。

进程容器(Process Container)是Google工程师眼中“容器”技术的雏形,用于限制、记账和隔离资源(CPU、内存、磁盘I/O、网络等。)为一组流程。这其实和上面提到的进程隔离技术的目标是一致的。由于技术更加成熟,Process Container于2006年正式推出,次年进入Linux内核主干,并正式更名为Cgroups,这标志着Linux阵营中的“容器”概念开始被重新审视和认识。

2008年,—— Linux容器工具LXC诞生了。

2008年,通过将Cgroups的资源管理能力与Linux命名空间的视图隔离能力相结合,在Linux内核中出现了一个完整的容器技术LXC(Linux Container ),这就是今天广泛使用的容器技术的实现基础。我们知道,一个进程可以调用其物理机上的所有资源,这会挤占其他进程的可用资源。为了限制这种情况,Linux内核开发者提供了一个特性,在Cgroup中运行的进程类似于在命名空间中运行的进程,但是Cgroup可以限制进程的可用资源。虽然LXC提供给用户的能力与前面提到的Jails、OpenVZ等早期Linux沙盒技术非常相似,但随着各种Linux发行版迅速占领商业服务器市场,包括Google在内的众多云计算先行者已经能够充分利用这种早期的容器技术,这使得LXC在云计算领域获得了远超前辈的发展空间。

同年,谷歌推出了基于LXC的首个应用托管平台GAE (Google App Engine),并首次将开发平台作为服务提供。GAE是一种分布式平台服务。Google通过虚拟化技术为用户提供开发环境、服务器平台、硬件资源等服务。用户可以基于该平台定制和开发自己的应用,并通过谷歌的服务器和互联网资源进行分发,这大大降低了对自身硬件的要求。

值得一提的是,谷歌使用了一个工具—— Borg(Kubernetes的前身),可以安排和调度LXC在GAE。Borg是谷歌内部使用的大规模集群管理系统,可以承载数十万个任务,数千个不同的应用程序,同时管理数万台机器。Borg通过权限管理、资源共享和性能隔离实现高资源利用率。它可以支持高可用性应用,通过调度策略降低失败概率,并提供任务描述语言、实时任务监控和分析工具。如果孤立的集装箱是集装箱,博格可以说是最早的港口系统,LXC博格是最早的集装箱排列框架。至此,容器不再是简单的进程隔离功能,而是一种灵活轻量的程序打包模式。

2011年,——云代工厂推出了Warden。

Cloud Foundry是知名云服务提供商VMware在2009年推出的云平台。这也是业内第一个正式定义PaaS(平台即服务)模式的项目。“PaaS项目通过对应用的直接管理、安排和调度,使开发者能够专注于业务逻辑而不是基础设施”和“PaaS项目通过容器技术封装和启动应用”等概念都来自Cloud Foundry。Warden是Cloud Foundry核心部分的资源管理容器。起初,它是由LXC封装的,后来它被重新构建成一种直接在Cgroups和Linux命名空间上运行的架构。

随着“云”服务市场的不断发展,各种PaaS项目相继出现,容器技术也迎来了爆发式增长的时代,大量围绕容器技术的创业项目层出不穷。当然,后来的故事很多人都知道。一家名为Docker的创业公司诞生了,让Docker几乎成了“容器”的代名词。

多克出生了

——Docker出生于2013年。

Docker最初是一家名为dotCloud的PaaS服务公司的内部项目,后来公司更名为Docker。Docker初期类似于Warden,使用LXC,之后开始用自己开发的libcontainer替代LXC。与其他纯容器项目不同,Docker引入了一套管理容器的生态系统,包括高效且分层的容器镜像模型、全局和局部容器注册库、clear REST API、命令行等。

Docker本身实际上是一个属于LXC的包,它提供了一个易于使用的容器接口。它最大的特点是引入了容器镜像。Docker通过容器镜像将应用程序和运行应用程序所需的环境打包在一个文件中。运行这个文件将生成一个虚拟容器。

更重要的是,Docker项目还采用了Git ——的思想,并在容器图像的制作中引入了“层”的概念。基于不同的“层”,容器可以添加不同的信息,这样就可以像管理普通代码一样进行版本管理、复制、共享和修改。通过制作Docker映像,开发人员可以通过DockerHub这样的映像托管仓库直接分发软件。

换句话说,Docker的诞生不仅解决了软件开发的容器化问题,也解决了软件分发的问题,为“云”时代的软件生命周期流程提供了完整的解决方案。

很快,Docker在业界声名鹊起,被多家公司选为云计算基础设施建设的标准。集装箱化技术也成为业内最热门的前沿技术,围绕集装箱的生态建设已经热火朝天地展开。

集装箱与江湖之争

一项新技术的兴起也带来了新的市场,一场关于集装箱的蓝海之争不可避免。

2013年发布了——款奥利奥。

Docker爆了之后,同年年底,CoreOS应运而生。CoreOS是基于Linux内核的轻量级操作系统,专门针对云计算时代计算机集群的基础设施建设而设计,具有自动化、易部署、安全可靠、可规模化等特点。当时它有一个非常显眼的标签:为容器设计的操作系统。

在Docker的帮助下,CoreOS在云计算领域迅速走红。一时间,Docker CoreOS成为行业内容设备部署的黄金合作伙伴。同时,CoreOS也为Docker的推广和社区建设做出了巨大的贡献。

然而,日益壮大的码头工人似乎有更大的“野心”。Docker不甘于只是“一个简单的基础单元”,自己开发了一系列相关的容器组件,收购了一些容器技术公司,开始搭建自己的容器生态平台。显然,这对CoreOS形成了直接的竞争关系。

2014年,—— CoreOS发布了开源的容器引擎火箭。

2014年底,CoreOS推出了自己的集装箱引擎火箭(rkt),试图与Docker竞争。与Docker类似,rkt可以帮助开发者将应用和依赖包打包到便携容器中,简化搭建环境等部署工作。rkt和Docker的区别在于,rkt没有Docker为企业用户提供的“友好功能”,比如云服务加速工具、集群系统等。反过来,rkt想做的是更纯粹的行业标准。

2014年,—— Google推出开源容器编排引擎Kubernetes。

为了适应混合云场景下大规模集群的容器部署和管理问题,Google于2014年6月推出了容器集群管理系统Kubernetes(简称K8S)。K8S来自我们前面提到的Borg,在混合云场景的生产环境中,具有管理和排列容器的功能。Kubernetes在容器的基础上引入了Pod功能,使得不同的容器之间可以相互通信,实现容器的分组和部署。

得益于Google在大规模集群基础设施建设方面的强大积累,脱胎于Borg的K8S迅速成为业界标准应用,堪称容器排列的必备工具。作为容器生态系统中举足轻重的一员,Google在Docker和rkt的容器之争中站在了CoreOS一边,将K8S对rkt的支持视为一个重要的里程碑。

2015年,—— Docker推出了容器集群管理工具Docker Swarm。

作为回应,Docker公司也开始在2015年发布的Docker 1.12版本中加入容器集群管理工具Docker swarm。

随后,2015年4月,谷歌领投CoreOS 1200万美元,与Core OS合作发布了第一款企业分发版Kubernetes —— structural。从此,集装箱江湖分成了两大阵营,Google派和Docker派。

两派的竞争愈演愈烈,并逐渐扩展到行业标准的制定之争。

2015年6月,—— Docker率先成立OCI。

Docker和Linux基金会成立了OCI (Open Container Initiative)组织,旨在“制定和维护容器映像格式和容器运行时的正式规范”,围绕容器格式和运行时制定一个开放的工业标准。

2015年7月,——谷歌率先成立CNCF。

同年7月,专注于“云”的谷歌也与Linux基金会共同成立了CNCF(Cloud Native Computing Foundation),并将Kubernetes作为第一个纳入CNCF管理体系的开源项目,旨在“构建以基础设施为中心的架构cloud native computing ——,动态调度微服务、容器和应用,并促进其广泛使用”。

这两个围绕容器相关的开源项目构建的开源基金会,对云的未来发展起到了重要的推动作用。它们互为补充,制定了一系列行业事实标准,成为目前最活跃的开源组织。

Kubernetes生态统一了河流和湖泊

虽然Docker多年来一直力推rkt成为当之无愧的容器兄弟,但作为一个庞大的容器技术生态,Docker生态在后来的容器排列之争中输给了Google的Kubernetes。

随着越来越多的开发者使用Docker部署容器,编排平台的重要性日益凸显。Docker流行之后,大量开源项目和专有平台相继出现,解决容器排列问题。Mesos、Docker Swarm和Kubernetes都提供了不同的抽象来管理容器。在这期间,对于软件开发者来说,选择一个容器编排平台就像是一场赌博,因为一旦选择的平台在未来的竞争中落败,就意味着接下来的开发将在未来失去市场。就像当初Android、iOS、WP的手机系统之争,只有赢家才能获得更大的市场前景,输家甚至会消失。集装箱布局平台之战开始了。

—— CRI-O诞生于2016年。

2016年,Kubernetes项目推出了CRI(容器运行时接口),该接口使kubelet(用于创建pod和启动容器的集群节点代理)能够使用不同的符合OCI的容器运行时环境,而无需重新编译Kubernetes。基于CRI,一个名为CRI-O的开源项目诞生了,为Kubernetes提供一个轻量级的运行时环境。

CRI-O允许开发者直接从Kubernetes运行容器,这意味着Kubernetes可以在不依赖传统容器引擎(如Docker)的情况下管理容器化的工作负载。这样在Kubernetes平台上,只要容器符合OCI标准(不一定是Docker),CRI-O就可以运行,让容器回归最基本的功能,——就可以封装运行云原生程序。

同时,CRI-O的出现让使用容器技术进行软件管理和运维的人发现,Kubernetes技术栈(如调度系统、CRI和CRI-O)比Docker自带的标准容器引擎更适合管理复杂的生产环境。可以说CRI-O把容器编排器放在了容器技术栈的重要位置,从而降低了容器引擎的重要性。

在K8S成功拔得头筹的情况下,Docker在推广自己的集装箱排列平台Docker Swarm时犯了一个错误。2016年底,业内有消息透露,为了更好地适应Swarm,Docker可能会更改Docker标准。这使得很多开发者在平台的选择上更倾向于与市场更兼容的Kubernetes。

所以进入2017年后,更多的厂商愿意押注K8S,投入K8S相关生态的建设。容器安排之争以谷歌阵营的胜利而告终。与此同时,以K8S为核心的CNCF也开始迅速发展,成为目前最火的开源项目基金会。近两年,阿里云、腾讯、百度等中国科技企业也加入CNCF,全面拥抱容器技术和云原生。

标签

从几十年前实验室对进程隔离功能的探索,到遍布生产环境的云原生基础设施的构建,可以说容器技术从一个小小的容器发展到一个大型的现代化港口,凝聚了几代开发者的心血。可以预见,从现在到未来很长一段时间内,容器技术都将是软件开发和运维的重要基础设施。

更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理官网:www.chenqinet.cn。

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3