时至今日
企业IT领域中最常见的问题之一
在于执行开发和运维工作时
如何去建立一些独立高效的系统环境
使它们在降低资源占用率、提升效率的同时
又能互不干涉,做好安全隔离
以避免各团队间协作问题的出现
令企业尽快实现DevOps
而服务器虚拟化和容器技术的先后诞生
都是为了能切实处理这类问题
并解决多操作系统/应用程序堆栈间的矛盾
什么是服务器虚拟化技术
对于服务器虚拟化技术来说,虚拟层为用户提供了一个完整的虚拟机:包括内核在内的一个完整的系统镜像。CPU虚拟化技术可以为每个用户提供一个独享且和其他用户隔离的系统环境,虚拟层可以为每个用户分配虚拟化后的CPU、内存和IO设备资源。
什么是容器技术
容器为应用程序提供了隔离的运行空间:每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。此外,容器之间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升。
服务器虚拟化解决的核心问题是资源调配
而容器解决的核心问题是应用开发、测试和部署
那么,在实际操作中
谁是更好的满足所有虚拟化任务的方案呢?
如果从服务器虚拟化的角度来寻找最好的环境隔离方案,那么系统级的虚拟化是更好的方案:和容器相比,邻居租户(Noisy neighbours)对系统的影响在虚拟化的方案下将不是一个问题。尽管现在很多容器都在专注于提高其隔离能力,但是虚拟机的隔离还是要优于容器。从物理服务器过渡到虚拟服务器是一个很自然的过程,并且现在针对虚拟服务器的管理的生态系统也很完善。
大多数虚拟机都是相对独立的,每台虚拟机都包含自己的操作系统、驱动和应用程序组件。只要拥有合适的hypervisor,还可以将虚拟机迁移到其他任何虚拟化平台当中。
基于hypervisor的虚拟机拥有完善的隔离特性,由于系统硬件资源完全是虚拟的,由hypervisor分配给虚拟机使用,因此bug、病毒或者入侵有可能影响一台虚拟机,但是不会蔓延到其他虚拟机上。
与之相对比,容器的隔离性较差是因为其容器运行在物理操作系统之上,相互之间共享大量底层的操作系统内核、库文件以及二进制文件,在开始运行之前就已经获得了统一的底层授权(对于Linux环境来说通常是root权限)。因此,漏洞和攻击更加有可能进入到底层的操作系统,或者转移到其他容器当中——潜在的传播行为远比最初的事件更加严重。
如果只是希望将应用运行的实例进行隔离,那么对于管理应用运行环境、启动应用实例以及控制资源开销来说,容器将是一个极为高效的工具。容器化的最大优势在于对于相同的硬件占用空间更小,可以比虚拟机运行更多的实例。
像Docker这一类具有代表性的容器技术,其设计原则就是为了解决应用环境的修改以及应用部署的问题,并且这十分符合 DevOps理念。研发云的DCOS平台就是以Docker技术为引擎,对持续集成流程框架进行升级,演变成容器化持续部署框架,并在能力开发平台进行实施,实现了产品的自动化持续集成和部署。快速和可移植性是容器技术的两大特点。
快速
以Docker容器技术为例:普通的虚拟机在每次开机时都需要启动一个完整的新操作系统实例,而Docker的容器能够通过内核共享的方式,共享一套托管操作系统。这意味着,Docker容器的启动和停止不需要几分钟,只要几百毫秒就足够了。
更快的速度就意味着,使用Docker容器创建的软件系统比起使用基于虚拟机的解决方案能够实现更高级别的敏捷性,即使将那些基于虚拟机的解决方案通过基于微服务的架构进行组织也是一样。此外,“容器化”的应用比起虚拟机和裸机的性能更好,在2014年IBM发布的一份研究报告中表明:“在几乎所有情况下,容器都能表现出与虚拟机相等、或者是更好的性能。”
容器可以被大量快速复制,这是容器技术的重要优势之一,但是也有可能在管理员没有注意到的情况下消耗大量计算资源。如果对一个容器化应用程序进行扩展之后忘记将其缩减回之前的规模,那么将会为企业带来大量不必要的云计算开销。
可移植性
在基于虚拟机的解决方案中,应用的可移植性通常来说会受到云提供商所支持的地区的限制,如果是在自托管的环境中运行企业软件,那么可移植性就限制在数据中心内。原因在于,不同的云提供商通常会提供不同格式的虚拟机。如果使用Packer这样的工具,那么在不同的云服务中使用运行相同的虚拟机镜像文件也是可以的,但需要进行许多额外的工作。虽然可行,但它也将用户限制在一个单一的平台中。
而容器技术非常适合用于开发微服务类型的应用程序——这种方式将复杂的应用程序拆分为基本的组成单元,每个组成单元部署在独立的容器当中,之后将相关容器链接在一起,形成统一的应用程序。可以通过增加新的组成单元容器的方式对应用程序进行扩展,而不再需要对整个应用程序进行重新开发。
还是以Docker容器技术为例:工程团队与运维团队可以将他们的基础设施扩展到多个云提供商的服务中,只要Docker的守护进程还在运行,就能够保证应用程序的正常运行。这种将应用从云提供商中进行解耦的方式能够给予IT团队更大的自由度,也可以在与各个提供商之间的对冲中,提高软件解决方案的适应性。
不过,容器之间的现有依赖关系可能会限其在服务器之间的可移植性。比如,位于Linux操作系统上的Docker容器就不能运行在当前版本的Windows Server操作系统上。
总结来说
全虚拟化的系统分配到的是独有的一组资源
有更强的隔离性
但是更加重了对总资源的占用和依赖程度
而容器的隔离性更弱,但是它们更加轻量
即使在有限的资源下
也可以毫不费力地启动上千个容器
或许服务器虚拟化和容器技术
都不是一种
能够满足所有虚拟化任务的完美方案
但从实际应用的角度来说
它们通常能在同一个数据中心中共存
因此这两种技术可以互补并协同工作
比如,我们可以选择
在一个容器中运行一个虚拟机
在一个虚拟机中运行一个或多个容器
这样就能同时利用它们所带来的各种便利