2019独角兽企业重金招聘Python工程师标准>>>
虚拟化技术
云计算是近几年的重头戏,云计算包括PaaS、SaaS和IaaS三大领域,目前国内比较强大的是PaaS和IaaS领域,SaaS最近在某些ERP公司也很火热,相信不久的将来,云ERP会成为主要增长点。
虚拟化技术在云计算的发展起着重要的作用,世界范围内,领先的虚拟化产品包括Vmware 系列,Redhat,微软,Oracle等,其中以VMware vsphere 是vmware公司的旗舰产品最为著名,使用简单方便操作备受好评,但是价格昂贵,支撑云计算平台(主要支撑PaaS,IaaS)显然成本高昂。不过,VMWare Vsphere中的VMware Esxi(vmware hypervisor)是免费的,部署私有云是一个不错的选择。
体验Vmware Esxi请参考:体验vSphere 6之1-安装VMware ESXi 6 RC版 。
以上是商业虚拟化软件,虽然ESXi免费,但是其他功能组件收费,使用以上软件发展虚拟化,高昂的成本必然影响云计算的发展。既然如此,那还要什么可以替代的技术么?在Linux世界有两种免费技术可以用来实现虚拟化:Docker和KVM,当然,你可能听的最多的是Docker与openStack技术,实际上openstack用来管理KVM。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,Docker基于LXC(Linux Container)技术,Linux Container容器是一种Linux内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,免费开源。
kvm是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。 是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的linux全虚拟化解决方案。 它包含一个为处理器提供底层虚拟化可加载的核心模块kvm.ko(kvm-intel.ko 或 kvm-AMD.ko)。 kvm还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。kvm能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(ps:它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)。 在主流的linux内核,如2.6.20以上的内核均包含了kvm核心。
Docker与KVM对比
KVM虚拟化结构
Docker虚拟化结构
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
1. Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
2. 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
3. 虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操作系统上,利用操作系统的containerization技术,所以docker甚至可以在虚拟机上运行。
4. 虚拟化系统一般都是指操作系统镜像,比较复杂,称为“系统”;而docker开源而且轻量,称为“容器”,单个容器适合部署少量应用,比如部署一个redis、一个memcached。
5. 传统的虚拟化技术使用快照来保存状态;而docker在保存状态上不仅更为轻便和低成本,而且引入了类似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。
6. 传统的虚拟化技术在构建系统的时候较为复杂,需要大量的人力;而docker可以通过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile可以手动编写,这样应用程序开发人员可以通过发布Dockfile来指导系统环境和依赖,这样对于持续交付十分有利。
7. 当然KVM对比于容器也有一个比较大的优势就是可以使用不同的操作系统或内核。所以,举例说,你可以使用微软Azure,同时运行Windows Server2012的实例和SUSE Linux企业级服务器的实例。至于Docker,所有容器都必须使用同样的操作系统和内核。
Docker的优势
具体说来,Docker 在如下几个方面具有较大的优势。
1 更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2 更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3 更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4 更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
5 对比传统虚拟机(KVM)总结
特性 |
容器 |
虚拟机 |
启动 |
秒级 |
分钟级 |
硬盘使用 |
一般为 MB |
一般为 GB |
性能 |
接近原生 |
弱于 |
系统支持量 |
单机支持上千个容器 |
一般几十个 |
Docker在实际应用中的一些问题和局限性
-
LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
-
隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
-
网络管理相对简单,主要是基于namespace隔离
-
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是安内存收费)
-
container随着用户进程的停止而销毁,container中的log等用户数据不便收集
另外,Docker是面向应用的,其终极目标是构建PAAS平台,而现有虚拟机主要目的是提供一个灵活的计算资源池,是面向架构的,其终极目标是构建一个IAAS平台,所以它不能替代传统虚拟化解决方案。目前在容器可管理性方面,对于方便运维,提供UI来管理监控各个containers的功能还不足,还都是第三方实现。因为容器技术本身更适于解决大规模应用场景,所以通常都是集群基础上的部署、运维,但是目前对这一系列任务的自动化处理尚无统一的或者标准的框架。如果要让Docker真正在实际环境中发挥最大的效能并且易于维护,就需要有成熟稳定的资源编排(orchestration)、资源调度(scheduling)和部署(deployment)的支持,但是这方面暂时还没有很明显的最佳解决方案,所以大多数人都在摸索和搭建自己的解决方案。