zoukankan      html  css  js  c++  java
  • 总结多种容器化技术对比

    总结多种容器化技术对比

    1、chroot和jails

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

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

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

    图片

    2、Linux VServer和OpenVZ

    接下来在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这种技术方案。

    图片

    3、namespace 和 cgroups

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

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

    对于namespace的操作当中,通常会有三种。

    1)Clone

    可以指定子进程在什么namespace下面。

    2)Unshare

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

    3)Setns

    就是为进程设置 namespace。

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

    图片

    4、LXC 和 CloudFoundry

    在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它最大的不同就是它可以管理跨计算机的容器集群,这其实就已经有了现代容器技术的相关特性了。

    图片

    5、LMCTFY和systemd-nspawn

    在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去做资源隔离的,其实这也是这两种两种技术方案的组合。

    图片

    6、Docker

    而在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)。

    图片

    7、Kubernetes

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

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

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

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

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

    图片

    8、更多的容器化技术

    除了刚才我们提到的这些主要的技术以外,其实还有很多我们没有提到的一些容器化的技术,比如说像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。

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

  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/Serverlessops/p/14972098.html
Copyright © 2011-2022 走看看