当前位置: 首页 > 科技观察

容器简史:从1979年至今

时间:2023-03-17 17:50:58 科技观察

随着云计算的发展,容器的应用越来越广泛。特别是近两年,越来越多的企业开始采用容器作为新的IT基础设施。回顾历史,其实集装箱在20世纪70年代后期就已经有了雏形。Jails、Zones、VPS、VM和容器都是关于隔离和资源控制的,但是每一种技术都以不同的方式实现它,每一种都有其局限性和优势。1979:UnixV7在计算资源稀缺的时代,通过快速破坏和重建基础设施来解决测试环境污染问题几乎是不可能的。为了隔离可用于软件构建和测试的环境,chroot(更改根目录)系统调用程序应运而生。1979年UnixV7开发过程中,正式引入chroot系统调用,为每个进程提供独立的磁盘空间,将进程及其子进程的根目录更改到文件系统中的新位置,让这些进程只能访问该目录。这个新的隔离环境称为ChrootJail。这标志着进程隔离的开始,隔离每个进程的文件访问权限。如下图所示,贝尔实验室正在为UnixV7操作系统的发布做最后的开发和测试。图1:Unix操作系统测试2000年:FreeBSDJails2000年,FreeBSD操作系统正式发布了FreeBSDjails隔离环境,真正实现了进程的沙盒化。这在文件系统、用户、网络等的隔离上增加了进程沙箱功能,实现了对客户业务的隔离和管理。该沙箱的实现依赖于操作系统层面的隔离和限制能力,而非硬件虚拟化技术。FreeBSDJails允许管理员将一个FreeBSD计算机系统分成几个独立的、更小的系统,称为“监狱”,并为每个系统分配IP地址和配置,并且可以自定义软件的安装和配置。2001:LinuxVServer与FreeBSDJails一样,LinuxVServer也是一种类似于上述Jails的机制,可以对计算机系统上的资源(文件系统、网络地址、内存)进行分区。每个划分的分区称为一个安全上下文(securitycontext),其中的虚拟系统称为虚拟专用服务器(virtualprivateserver,VPS)。2001年推出,操作系统的虚拟化是通过给Linux内核打补丁来实现的。测试补丁仍然可用,但最后一个稳定补丁是在2006年发布的。2004年:SolarisContainers2004年2月,Oracle发布了OracleSolarisContainers,这是一个用于X86和SPARC处理器的Linux-Vserver版本。Solaris容器是通过区域提供的系统资源控制和边界分离的组合。区域是单个操作系统实例中完全隔离的虚拟服务器。2005年:OpenVZ(OpenVirtuzzo)这是Linux操作系统级别的虚拟化技术,以Linux内核补丁的形式实现虚拟化、隔离、资源管理和状态检查。操作系统级虚拟化有一些局限性,因为容器共享相同的体系结构和内核版本,当来宾需要与主机不同的内核版本时,这个缺点就会显现出来。该代码未作为官方Linux内核的一部分发布。每个OpenVZ容器都有一组独立的文件系统、用户和用户组、进程树、网络、设备和IPC对象。2006年:ProcessContainersProcessContainer(由Google于2006年推出)旨在限制、计算和隔离一系列进程的资源使用(CPU、内存、磁盘I/O、网络)。一年后,为了避免与Linux内核上下文中的“容器”一词混淆,将其更名为ControlGroups或简称Cgroups,最终并入Linux内核2.6.24。这也说明谷歌很早就参与了容器技术的开发。2008年:LXCLinux容器(LXC)是第一个也是最完整的Linux容器管理器实现。2008年,通过结合Cgroups的资源管理能力和LinuxNamespace的视图隔离能力,LXC完整的容器技术出现在Linux内核中,可以运行在单个Linux内核上,无需任何补丁。LXC存在于liblxc库中,它提供了各种编程语言的API实现,包括Python3、Python2、Lua、Go、Ruby和Haskell。目前LXC项目由Canonical赞助和托管。2011年:WardenWarden由CloudFoundry于2011年创立,作为一个API用于管理孤立的、短暂的和资源受控的环境。在其第一个版本中,Warden使用了LXC,后来用他们自己的实现替换了它。与LXC不同,Warden与Linux没有紧密耦合,可以为任何系统提供一个隔离的运行环境。Warden作为守护进程运行,并提供用于容器管理的API。它开发了一种CS(客户端-服务器)模型来管理跨多个主机的容器集群,而Warden提供了管理cgroups、命名空间和进程生命周期的相关服务。2013:LMCTFYLMCTFY是谷歌2013年开始的容器技术的开源版本,提供Linux应用容器,旨在提供性能有保障、资源利用率高、资源共享、可超量预订、近乎零消耗的容器。2015年,Google开始将LMCTFY的核心概念贡献给Docker发起的Libcontainer后,LMCTFY在2015年主动停止部署,Libcontainer现在是开放容器基金会(OpenContainerFoundation)的一部分。2013年:Docker随着2013年Docker的出现,容器开始流行起来。它最初是一家名为dotCloud的PaaS服务公司的内部项目,后来更名为Docker。Docker的成长并非偶然。它引入了一整套用于管理容器的生态系统,包括高效、分层的容器镜像模型、全局和本地容器注册表、清晰的RESTAPI、命令行等。与Warden一样,Docker一开始也使用LXC,后来取代了它有自己的库libcontainer。Docker促进了名为DockerSwarm的容器集群管理解决方案的实施。2014年:RocketRocket是CoreOS发起的一个与Docker非常相似的项目,但修复了Docker中发现的一些问题。CoreOS的初衷是提供比Docker更严格的安全和产品要求。更重要的是,它是在更加开放的标准AppContainer规范上实现的。除了Rocket之外,CoreOS还开发了其他几款可以用于Docker和Kubernetes的容器相关产品,例如:CoreOS操作系统、etcd和flannel。2016年:Windows容器2015年,微软在WindowsServer上添加了对基于Windows的应用程序的容器支持,称为Windows容器。它与WindowsServer2016一起发布,Docker可以在Windows上原生运行Docker容器,而无需启动虚拟机来运行Docker(早期在Windows上运行Docker需要Linux虚拟机)。2017:容器工具成熟。2017年之前,市场上有数百种管理容器的工具。这些类型的工具已经存在多年,但2017年是其中许多工具脱颖而出的一年。比如Kubernetes,自2016年被纳入云原生计算基金会(CNCF)以来,VMWare、Azure、AWS甚至Docker都宣布在其基础设施之上提供相关支持。随着容器市场的发展壮大,一些工具已经开始定义容器的一些功能。Ceph和REX-Ray为容器存储设定了标准,而在CI/CD中,Jenkins彻底改变了应用程序的构建和部署方式。2017年,CoreOS和Docker联合提出将rkt和containerd作为新项目纳入CNCF,标志着容器生态初步形成,丰富了容器项目间的协作。从Docker最初宣布将剥离其核心运行时到2017年向CNCF协会捐赠,“containerd”项目在过去两年中经历了显着的增长和进步。Docker捐赠的主要目的是通过提供容器系统供应商和编排项目(如Kubernetes、Swarm等)可以利用的核心容器运行时,促进容器生态系统的进一步创新。“containerd”的一个重要设计原则是为Kubernetes提供一流的支持,但又不完全依赖Kubernetes,这也打通了开发者桌面、CI/CD、单节点部署、边缘和物联网等诸多容器应用新门。2018年:容器化作为现代软件基础设施的基础越来越标准化,Kubernetes被用于大多数企业容器项目。2018年,GitHub上的Kubernetes项目拥有超过1500名贡献者,是最重要的开源社区之一,拥有超过27000颗星。Kubernetes的广泛采用促使AWS等云提供商提供托管Kubernetes服务。此外,VMWare、RedHat和Rancher等领先的软件供应商也开始提供基于Kubernetes的管理平台。2019年:历史性变革2019年是容器发生历史性变革的一年。这一年发生了很多历史性的变化,包括容器的生态变化、产业资本的并购、新的技术解决方案的出现。在这一年,新的运行时引擎开始取代docker运行时引擎。最具代表性的新引擎是CNCF的Containerd和CRI-O(Kubernetes的轻量级运行时)。CRI-O允许用户直接从Kubernetes运行容器,无需任何不必要的代码或工具。只要容器符合OCI,CRI-O就可以运行它。2019年,行业也发生了很大的变化。DockerEnterprise被卖给了Mirantis(一家专注于OpenStack和Kubernetes的云计算公司),可以预见DockerSwarm将被淘汰。同时也可以看出,虽然rkt已经正式成为CNCF的一部分,但是其知名度却在逐渐下滑。此外,VMware先后收购了Heptio和PivotalSoftware(包括PAS和PKS),可以更好地帮助企业客户建立和运行基于Kubernetes的容器化架构。其中,Heptio由2014年帮助谷歌共同建立Kubernetes项目的两位主要参与者共同创立(当时有3位项目负责人)。创始人和他的团队将一起加入VMware。如此鲜明的创始人背景,或许意味着VMware有意向Kubernetes领域发起全面冲击,甚至预示着VMware已经将Kubernetes视为企业业务运营的根本基石之一。2019年,容器技术领域也出现了新的变化。服务(“功能”或“无服务器”)已成为一种新的抽象趋势。它允许开发人员更轻松地运行和部署代码片段,并且这些代码片段将能够快速扩展和缩减以响应事件需求。例如,企业只要使用由Google、Pivo??tal、IBM、RedHat和SAP联合开发的跨云无服务器管理平台Knative,就可以在支持Kubernetes的云平台上自由迁移工作负载,无论是跨私有云还是公有云云和各种混合云架构都可以。图2:使用尽可能高的抽象2019年还出现了基于Kubernetes的混合云解决方案,例如IBMCloudPaks、GoogleAnthos、AWSOutposts和AzureArc。这些云平台模糊了云和本地环境之间的传统界限,使管理本地和提供商云服务变得更加容易。Kubernetes现在已经成为构建容器化平台系统的默认抽象解决方案。这些新功能的出现也代表着Kubernetes下一步的演进方向,比如Anthos、Arc和Outposts。在超抽象中,计算资源与管理层解耦,类似于Kubernetes的工作方式,它将工作负载与管理层解耦。2020年:容器安全亟待解决。容器作为一种轻量级的虚拟化技术,简单易用、易于操作,大大提高了开发人员的工作效率,在业界得到了广泛的应用。但与此同时,容器安全事件频发,包括镜像源不安全、容器入侵事件、运行环境安全问题等。(1)镜像来源不安全开发者通常从Docker官方的DockerHub仓库下载镜像。其中部分镜像来自开发镜像中对应软件的官方机构,大量镜像来自第三方机构甚至个人。在从这些镜像仓库中获取镜像的同时,也带来了潜在的安全隐患。例如下载的镜像中的软件是否存在漏洞,下载的镜像是否被恶意植入后门,镜像在传输过程中是否被篡改等。(2)容器入侵事件可能是由docker本身的结构和机制引起的。这种攻击场景主要发生在黑客已经控制了宿主机上的一些容器(或者通过在公有云上创建容器来获得这个条件),然后对宿主机或者其他容器发起攻击来产生影响。(3)运行环境的安全性除了docker自身的问题外,docker运行环境的问题也会给docker的使用带来风险。由于容器是介于基础设施和平台之间的虚拟化技术,传统的基础设施虚拟化云安全解决方案无法彻底解决上述安全问题。如果以容器为支撑技术构建DevOps环境,则需要设计一套涵盖从容器镜像创建到生产上线全生命周期的容器安全方案。目前,市场上涌现了多家容器安全产品安全厂商,如Neuvector、Twistlock、StackRox、Aqua等。从容器安全产品的技术方案来看,目前容器安全厂商大多采用并行容器的方式来保护宿主机上的容器,而青藤云安全则采用基于宿主机代理的方式。并行容器技术方案:利用容器的隔离性和良好的资源控制能力,在容器的宿主机中启动一个容器,容器挂载宿主机的所有文件系统,然后在容器内部实时监控这些文件系统并处理响应以保护容器。基于HostAgent的技术方案:基于IvyAgent的主机保护能力,对容器相关的文件、进程、系统调用等进行监控。实现一个Agent,达到主机安全和容器安全保护的效果。以上两种方案的示意图如下。