来认真学习分布式系统开发实战:虚拟化与容器技术,容器与虚拟机

虚拟化与容器技术

虚拟化技术已经改变了现代计算方式,它能够提升系统资源的使用效率,消除应用程序和底层硬件之间的依赖关系,同时加强负载的可移植性和安全性,但是Hypervisor和虚拟机只是部署虚拟负载的方式之一。作为一种能够替代传统虚拟化技术的解决方案,容器虚拟化技术凭借其高效性和可靠性得到了快速发展,它能够提供新的特性,以帮助数据中心专家解决新的顾虑。

本章介绍虚拟化技术与容器技术。

来认真学习分布式系统开发实战:虚拟化与容器技术,容器与虚拟机_第1张图片

 

虚拟化技术

所谓虚拟化技术就是将事物从一种形式转变成另一种形式,最常用的虚拟化技术有操作系统中内存的虚拟化,实际运行时用户需要的内存空间可能远远大于物理机器的内存大小,利用内存的虚拟化技术,用户可以将一部分硬盘虚拟化为内存,而这对用户是透明的。又如,可以利用虚拟专用网技术(VPN)在公共网络中虚拟化一条安全、稳定的“隧道”,用户感觉像是在使用私有网络。

虚拟机技术是虚拟化技术的一种,虚拟机技术最早由IBM于20世纪60、70年代提出,被定义为硬件设备的软件模拟实现,通常的使用模式是分时共享昂贵的大型机。Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,也可称为虚拟机监视器(Virtual Machine Monitor,VMM)。VMM是虚拟机技术的核心,用来将硬件平台分割成多个虚拟机。VMM运行在特权模式,主要作用是隔离并且管理上层运行的多个虚拟机,仲裁它们对底层硬件的访问,并为每个客户操作系统虚拟一套独立于实际硬件的虚拟硬件环境(包括处理器、内存、I/O设备)。VMM采用某种调度算法在各个虚拟机之间共享CPU,如采用时间片轮转调度算法。

容器与虚拟机

容器具有轻量级特性,所需的内存空间较少,提供非常快的启动速度,而虚拟机提供了专用操作系统的安全性和更牢固的逻辑边界。如果是虚拟机,虚拟机管理程序与硬件对话,就如同虚拟机的操作系统和应用程序构成了一个单独的物理机。虚拟机中的操作系统可以完全不同于主机的操作系统。

容器提供了更高级的隔离机制,许多应用程序在主机操作系统下运行,所有应用程序共享某些操作系统库和操作系统的内核。已经证明过的屏障可以阻止运行中的容器彼此冲突,但是这种隔离存在一些安全方面的问题,我们稍后会探讨。

容器和虚拟机都具有高度可移植性,但方式不一样。就虚拟机而言,可以在运行同一虚拟机管理程序(通常是VMware的ESX、微软的Hyper-V,或者开源Zen或KVM)的多个系统之间进行移植。而容器不需要虚拟机管理程序,因为它与某个版本的操作系统绑定在一起。但是容器中的应用程序可以移到任何地方,只要那里有一份该操作系统的副本。

容器的一大好处就是应用程序以标准方式进行了格式化之后才放到容器中。开发人员可以使用同样的工具和工作流程,不管目标操作系统是什么。一旦在容器中,每种类型的应用程序都以同样的方式在网络上移动。这样一来,容器酷似虚拟机,它们又是程序包文件,可以通过互联网或内部网络来移动。

目前,应用最为广泛的容器技术是Docker。Docker支持包括Linux容器、Solaris容器、FreeBSD容器以及Windows容器在内的各种操作系统容器。

Docker容器里面的应用程序无法从一个操作系统迁移到另一个操作系统。确切地说,它能够以标准方式在网络上移动,因而更容易在数据中心内部或数据中心之间移动软件。单一容器总是与单一版本的操作系统内核关联起来。

成熟度方面的比较

虚拟机是一项高度发展、非常成熟的技术,事实证明其可以运行最关键的业务工作负载。虚拟化软件厂商已开发出了能处理成千上万个虚拟机的管理系统,那些系统旨在适合企业数据中心的现有运维。

容器代表了未来的新技术,而这种大有希望的新兴技术未必能解决每一个困难。开发人员正在开发相应的管理系统,以便一启动就将属性分配给一组容器,或者将要求相似的容器分成一组,以便组成网络或加强安全,但是这类系统仍在开发之中。

Docker最初的格式化引擎正成为一种平台,并附有许多工具和工作流程。而容器获得了一些大牌技术厂商的支持。IBM、Red Hat、Microsoft和Docker都加入了Google的Kubernetes项目,这个开源容器管理系统可用于将诸多Linux容器作为单一系统来管理。

Docker有730家厂商为其容器平台贡献代码。CoreOS是一款旨在运行现代基础设施堆栈的Linux发行版,它将广大开发人员的目光吸引到了Rocket,这是一种新的容器运行时环境。

 启动速度的比较

创建容器的速度比虚拟机要快得多,那是由于虚拟机必须从存储系统检索10GB~20GB的空间给操作系统。容器中的工作负载使用主机服务器的操作系统内核,避免了这一步。容器可以实现秒级启动。

拥有这么快的速度让开发团队可以激活项目代码,以不同的方式测试代码,或者在其网站上推出额外的电子商务容量——这一切都非常快。

安全方面的比较

就目前来说,一项安全问题是,虚拟机比容器有更高的安全性,容器技术并不像看上去那么可靠。以应用Libcontainers作为技术支持的Docker为例,在Linux系统的工作模式下,Libcontainers可以访问5个命名空间:流程、网络、安装、主机名和共享内存。这固然很好、很强大,然而仍然有很多重要的Linux核心子系统不能被容器兼容,包括所有的设备、SELinux、Cgroup以及/sys下的所有文件系统。这意味着,如果某位用户或者应用程序获取了容器内部的超级用户权限,底层操作系统理论上可以被破解。这是一件非常糟糕的事情。

现在出现了很多保护Docker和其他容器技术的措施。举例来说,我们可以将一个/sys文件系统设置为“只读”,或者强制某个容器进程对特定的文件系统执行“只写”操作,或者设置网络命名空间以使其只能与特定的企业内联网交流信息。但是,这些办法都不能从根本上解决问题,如此维护容器安全需要耗费大量的时间和精力。

另一项安全问题是,很多人都在发布基于容器的应用,如果未对网络上的这些应用加以识别,很可能会下载到带有木马的应用,这样就可能给我们的服务器带来严重的安全隐患。

性能方面的比较

2014年,IBM研究部门发表了一篇关于容器和虚拟机环境性能比较的论文An Updated Performance Comparison of Virtual Machines and LinuxContainers。这篇论文使用了Docker和KVM作为研究对象,阐述了Docker使用NAT或AUFS时的开销,并且质疑了在虚拟机上运行容器的实践方法。

论文作者在原生、容器和虚拟化环境中运行了CPU、内存、网络和I/O的Benchmark。其中,分别使用KVM和Docker作为虚拟化和容器技术的代表。Benchmark也包含了对不同环境下Redis和MySQL负载的采样。通过小数据包和多客户端的对比发现,Redis侧重于网络栈的性能,而MySQL侧重于内存、网络和文件系统的性能。

结果显示,在每一项测试中,Docker的性能等同于或超出KVM的性能。在CPU和内存性能方面,KVM和Docker都引入了明显的但可忽略不计的开销。但是,对于I/O密集型的应用,两者都需要进行调整以减少开销带来的影响。

当使用AUFS存储文件时,Docker的性能会降低。而相比之下,使用卷(Volume)能够获得更好的性能。卷是一种专门设计的目录,存在于一个或多个容器内。通过这种目录能够绕过联合文件系统(UnionFile System)。这样它就没有了存储后端可能带来的开销。默认的AUFS后端会引起显著的I/O开销,特别是当有多层目录深度嵌套的时候。

Docker的默认网络选项是-net=bridge,由于NAT会重写数据包,因此也引入了性能开销。当数据包收发率变高时,这种开销会变得很明显。可以通过使用-net=host来改善网络的性能。这个选项告诉Docker不要为容器创建一个独立的网络栈,并允许容器拥有宿主机网络接口的完全访问权限。但是,使用这个选项时要小心,因为它允许容器内的进程像其他根进程一样使用数值较小的端口,并允许容器内的进程访问本地网络服务,如D-bus。这使得容器内的进程可以做一些预料之外的事情,如重启宿主机。

尽管自诞生以来,KVM的性能有了相当大的提升,但它仍然不适用于对延时敏感或高I/O访问率的工作负载。因为每次I/O操作,它都会增加一些开销。这个开销对于耗时较短的I/O操作是有意义的,但对于耗时较长的I/O操作是可以忽略的。

尽管在虚拟环境中运行容器是一种常见的实践方法,但是论文中建议直接在物理的Linux服务器上运行它们。否则,相比于直接运行在非虚拟化的Linux上的方法,由于虚拟机的性能开销,这种实践方法不会得到任何额外的好处。

本文给大家讲解的内容是分布式系统开发实战: 虚拟化与容器技术,容器与虚拟机

  1. 觉得文章不错的朋友可以转发此文关注小编;
  2. 感谢大家的支持!

你可能感兴趣的:(Java,网络,docker,大数据,linux,java)