总结多种容器化技术对比
您当前的位置 : 首页 > BOB官方网站入口

总结多种容器化技术对比

  在容器化技术方面,其实历史很久远了。虽然我们现在用的容器化技术,或者说 k8s,还有云原生的概念是近几年才火起来的,但是实际上就容器化技术的发展来说,其实是很早的了。比如说最早的时候来自chroot,chroot大家可能都用过,或者都有了解过,在1979年的时候它是来自Unix,它主要的功能是可以修改进程和子进程的/。

  通过使用chroot达到什么样效果呢?使用chroot加某一个目录,然后再启动一个进程,那么这个进程自己所看到的 / ,就是我们平时所说的 / 目录,这个 / 就会是我们刚才指定的文件夹,或者说刚才指定的路径。这样子的话可以轻松又有效的保护我们操作系统上面的一些文件,或者说权限和安全相关的东西。

  在2000年的时候,出现了一个新的技术,叫做jails,其实它已经具备了sandbox,就是沙箱环境的雏形。使用jails的话,可以让一个进程或者说创建的环境拥有独立的网络接口和IP地址,而当我们提到使用jails的话,我们肯定会想到一个问题,就是如果你有了独立的网络接口和IP地址,这样的话就不能发原始的套接字,通常跟原始的套接字接触得比较多的就是个人会使用的Ping命令。默认的情况下,这样子是不允许使用原始的套接字的,而有自己的网络接口和IP地址,这个感觉上就像是我们常用的虚拟机。

  接下来在2001年的时候,在Linux社区当中就出现了一个新的技术叫做Linux VServer。Linux VServer有时候可以简写成lvs,但是和我们平时用到的4层的代理lvs其实是不一样的。它其实是对Linux内核的一种Patch,它是需要修改Linux内核,修改完成之后,我们大家可以让它支持系统级的虚拟化,同时使用Linux VServer的话,它可以共享系统调用,它是没有仿真开销的,也就是说我们常用的一些系统调用、系统调用的一些函数都是可以共享的。

  在2005年的时候,出现的一个新的技术—OpenVZ。OpenVZ其实和Linux VServer有很大的相似点,它也是对内核的一种Patch,这两种技术最大的变化就是它对Linux打了很多的Patch,加了很多新的功能,但是在2005年的时候,没有把这些全部都合并到Linux的主干当中,而且在使用OpenVZ的时候,它可以允许每个进程可以有自己的/proc或者说自己的/sys。

  其实我们大家都知道在Linux当中,比如说启动一个进程,你在他的/proc/self下面,你就能够正常的看到进程相关的信息。如果你有了自己独立的/proc,其实你就能够达到和其他的进程隔离开的效果。

  接下来另外一个显著的特点是它有独立的users和groups,也就是说你可以有独立的用户或者独立的组,而且这个是可以和系统当中其他的用户或者组独立开的。

  其次的话OpenVZ是有商业使用的,就是有很多国外的主机和各种VPS都是用OpenVZ这种技术方案。

  到了2002年的时候,新的技术是namespace。在Linux当中我们有了新的技术叫做namespace,namespace能够达到进程组内的特定资源的隔离。因我们平时用到的namespace其实有很多种,比如说有PID、net等,而且如果你不在相同的namespace下面的话,是看不到其他进程特定的资源的。

  到了2013年的时候,产生了一个新的namespace的特性,就是user namespace。其实当有了user namespace,就和上文提到的OpenVZ实现的独立用户和组的功能是比较像的。

  它是与其他进程不共享的,unshare再加一个-net,就可以与其他的进程独立开,不共享自己的net,不共享自己的网络的namespace。

  到了2008年,cgroups开始被引入到Linux内核当中,它能够适用于隔离进程组的资源使用,比如说可以隔离CPU、内存、磁盘,还有网络,尤其是他在2013年和user namespace进行了一次组合之后,并且进行了重新的设计,这样一个时间段,就变得更现代化了,就像我们现在常常使用到的Docker的相关特性,其实都来自于这样一个时间段。所以说cgroups和namespace构成现代容器技术的基础。

  在2008年的时候,新的一项技术叫做LXC, 我们也会叫他Linux Container(以下均简称LXC)。上文我们提到了很多容器化的技术,比如Linux VServer、OpenVZ,但是这些都是通过打Patch来实现的,而LXC是首个能直接和上游的Linux内核共同工作的。

  LXC是能支持特权容器的,意思就是说可以在机器上面去做uid map、gid map,去做映射,而且不需要都拿root用户去启动,这样子就具备了很大的便利性。而且这样的形式可以让你的被攻击面大大缩小。LXC支持的这几种比较常规的操作,就是LXC-start,可拿来启动container,LXC-attach就能进入container当中。

  到2011年的时候,CloudFoundry慢慢的出现了,他其实就是使用了LXC和 Warden这两项技术的组合,在这样一个时间段不得不提到的,就是他的技术架构是CS的模式,也就是说还有一个客户端和server端,而 Warden容器,它通常是有两层,一层是只读os的,就是只读的操作系统的文件系统,另外一层是用于应用程序和其依赖的非持久化的读写层,就是这两层的组合。

  我们之前提到的技术,大多数都是针对于某一台机器的,就是对于单机的。CloudFoundry它最大的不同就是它可以管理跨计算机的容器集群,这其实就已经有了现代容器技术的相关特性了。

  在2013年的时候, Google开源了自己的容器化的解决方案,叫做LMCTFY。这个方案是能支持CPU、内存还有设备的隔离。而且它是支持子容器的,可以让应用程序去感知到自己当前是处在容器当中的。另外还可以再为自己创建一个子容器,但是随着2013年发展之后,它逐渐发现只依靠自己不停的做这些技术,就等于单打独斗,发展始终是有限的,所以它逐步的将自己的主要精力放在抽象和移植上,把自己的核心特性都移植到了libcontainer。而libcontainer之后就是Docker的运行时的一个核心,再之后就是被Docker捐到了OCI,再然后就发展到了runC。这部分内容我们稍后再详细讲解。

  大家都知道服务器它肯定是有一个 PID为1的进程。就是它的初始进程、守护进程,而现代的操作系统的话,大多数大家都使用的是systemd,同样systemd它也提供了一种容器化的解决方案,叫做 systemd-nspawn。这个技术的话,它是可以和systemd相关的工具链进行结合的。

  systemd除了有我们平时用到的systemctl之类的,还有systemd machine ctl,它可以去管理机器,这个机器支持两种主要的接口,一种是管理容器相关的接口,另外一种是管理虚拟机相关的接口。

  而我们通常来讲,就是说systemd提供的容器技术解决方案,它是允许我们通过machine ctl去容器去进行交互的,比如说你能够最终靠machine ctl start,去启动一个systemd支持的容器,或者通过 machine ctl stop,去关掉它,而在这种技术下,它是支持资源还有网络等隔离的,其实它最主要的是systemd ns,它其实是使用namespace去做隔离。对于资源方面是来自于systemd,systemd是能够正常的使用cgroups去做资源隔离的,其实这也是这两种两种技术方案的组合。

  而在2013年Docker也出现了。通常来讲,Docker是容器时代的引领者,为什么这么说呢?因为Docker在2013年出现的时候,他首先提到了标准化的部署单元,就是Docker image。同时它还推出了DockerHub,就是中央镜像仓库。允许所有人通过DockerHub去下载预先已经构建好的Docker image,并且通过一行Docker run就可以启动这个容器。

  在众多用起来较为繁琐、很复杂的技术下,Docker这时提出来,你只需要一行Docker run,就可以启动一个容器,它大大简化了大家启动容器的复杂度,提升了便捷性。

  所以Docker这项技术就开始风靡全球。而Docker它主要提供的一些功能是什么呢?比如说资源的隔离和管理。而且Docker在0.9之前,它的容器运行时是LXC,在0.9之后,他就开始把LXC替换掉,替换成了libcontainer,而这个libcontainer实际上的意思就是我们在上文提到的Google的 LMCTFY。再之后libcontainer捐给了OCI。而那之后Docker现在的容器运行时是什么呢?是containerd。containerd的更下层是runc,runc的核心实际上的意思就是libcontainer。

  而到了2014年的时候, Google发现大多数的容器化解决方案,其实都只提供了单机的解决方案,同时由于Docker也是CS架构的,所以它需要有一个Docker demand,它是需要有守护进程存在的,而这个守护进程的话,是需要用root用户去启动的,而root用户启动的守护进程,其实是增加了被攻击面,所以 Docker的安全问题也被很多人诟病。

  在这个时候 Google就发现了这个点,并且把自己的Borg系统去做了开源,开源版本就是Kubernetes。Google还联合了一些公司,组建了一个云原生基金会(CNCF)。

  通常来讲Kubernetes是云原生应用的基石,也就是说在Kubernetes出现之后,我们的云原生技术开始慢慢地地发展起来,逐步地引领了潮流,Kubernetes提供了一些主要的特性。

  它可以支持比较灵活的调度、控制和管理,而这个调度程序的话,除了它默认的以外,也可以较为方便的去对它做扩展,比如说我们大家可以自己去写自己的调度程序,或者说亲和性、反亲和性,这些其实都是我们很常用到的一些特性。

  还有包括他提供的一些服务,比如说内置的 DNS、kube-DNS或者说现在的CoreDNS,通过域名的方式去做服务发现,以及Kubernetes当中有很多的控制器。它可以将集群的状态调整至我们预期的状态,就比如说有一个pod挂掉了,它可以自动的把它再恢复到我们预期想要的样子。

  另外就是它支持丰富的资源种类,比如说几个主要的层级,最小的是pod,再往上有deployment,或者有StatefulSets,类似于这样子的资源。

  最后一点是它让我们更喜欢它的因素,就是它有丰富的CRD的拓展,即能够最终靠自己去写一些自定义的资源,然后对它进行扩展,比如CRD。

  除了刚才我们提到的这些主要的技术以外,其实还有很多我们没提到的一些容器化的技术,比如说像runc,上文我们没太多的介绍,还有containerd。containerd实际上也是Docker开源出来的自己的核心,他的目标是做一个标准化工业可用的容器运行时,还有CoreOS开源出来的解决方案叫做rkt。而rkt瞄准的点就是上文提到的Docker相关的安全问题。但是rkt现在项目已经终止了。

  还有红帽(Red Hat)开源出来的 podman, podman是一种可以用它来启动容器,可以用它去管理容器,而且没有守护进程,所以就安全性来讲的话,podman可以说比Docker的安全性直观上来看的话会好一些,但是它的便捷性来讲的话,就要大打折扣了。比如说容器的重启、开机起之类的,但是我们都是有一些不同的解决方案的。

  在2017年的时候,这样一个时间段有一个 Kata Container,而这个Kata Container它有一段发展过程,最开始是英特尔,英特尔在搞自己的容器运行时,还有一家初创公司叫做hyper.sh,此公司也在搞自己的容器运行时,这两家公司瞄准的都是做更安全的容器,他们使用的底层的技术都是基于K8S。而之后这两家公司做了合并,hyper.sh它开源出来的一个解决方案是runv,被英特尔看上了之后就诞生了 Kata Container。在2018年的时候,AWS开源出来自己的Firecracker。

  这两项技术和我们上文提到的机器上的容器化技术其实大有不同,因为它的底层其实相当于是虚拟机,而我们一般来讲,都认为它是轻量级虚拟机的一种容器化的技术。以上就是有关于多样的容器化技术的介绍。

上一篇:ITPub博客2023-10-06
Copyright © BOB体育半岛/登录入口在线 All rights reserved 备案号:辽ICP备05006460号-2 网站地图