作者:Bright Liao
链接:https://www.zhihu.com/question/35425470/answer/62993113
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1. 基于虚拟机的虚拟化和基于容器的虚拟化
非正式的说,虚拟化是通过软件手段对计算机硬件资源镜像整合管理和再分配的一种技术。最常用的就是基于虚拟机(Hypervisor-based)的虚拟化,经过40年的发展,基于虚拟机的虚拟化技术已经比较成熟,它通过一个软件层的封装,提供和物理硬件相同的输入输出表现,实现了操作系统和计算机硬件的解耦,将OS和计算机间从1对1变成了多对多(实际上是1对多)的关系。该软件层称为虚拟机管理器(VMM/Hypervisor),它可以直接运行在裸机上(Xen、VMware EXSi),也可以运行在操作系统上(KVM、VMware workstation)。
然而这样的方案有一个缺陷,在虚拟机上运行了一个完整的操作系统(GuestOS),在其下执行的还有虚拟化层和宿主机操作系统,一定比直接在物理机上运行相同的服务性能差。而且有GuestOS的存在,虚拟机镜像往往有几个G到几十个G,占用的存储空间大,便携性差,迁移时通信代价大,不便于集群管理。另外每次想要使用更多硬件资源,需要启动一台新的虚拟机,要等待GuesOS启动,可能需要几十秒到几分钟不等。这些问题都是GuestOS带来的,虚拟化层的技术再怎么进步也无法解决这几个问题。
实际使用场景中,我们使用虚拟化技术其实是为了按需分配资源来完成服务的部署和使用,同时对服务所依赖的环境进行隔离,不被其它服务感知或干扰。为此启动一个GuestOS并不是必需的,为什么不考虑让多个虚拟机公用一个操作系统内核,只隔离开服务运行环境同时控制服务使用的系统资源呢?基于容器的虚拟化就是这样一种技术。
容器是没有GuestOS的轻量级“虚拟机”,多个容器共享一个OS内核,容器中包含需要部署的应用和它依赖的系统环境,容器大小通常只有几十到几百MB。由于共享操作系统内核,所以容器依赖于底层的操作系统,各个操作系统大都有自己的容器技术和容器工具。
Docker是一个Linux容器管理工具,随着Docker的兴起,Linux容器技术也是当下最时兴的容器虚拟化技术。Linux容器工具有很多,OpenVZ、LXC、Docker、Rocket、Lmctfy等等,大都是基于Linux内核提供的两个机制:Cgroups(实现资源按需分配)和Namespace(实现任务隔离)。
由于使用的技术完全不同,容器和虚拟机也有很多不同的地方:
最直观的区别就是容器比虚拟机明显更轻量级,对宿主机操作系统而言,容器就跟一个进程差不多。因此容器有着更快的启动速度(秒级甚至更快),更高密度的存储和使用(镜像小)、更方便的集群管理等优点。同时由于没有GuestOS存在,在容器中运行应用和直接在宿主机上几乎没有性能损失,比虚拟机明显性能上有优势。
还有一点是虚拟机技术已经发展了很多年,虚拟机和虚拟化层间的接口、虚拟机镜像格式等都已经标准化了,相应的管理工具、分布式集群管理工具都有比较完善的解决方案,而容器最近几年才兴起,配套技术和标准还在完善中。
此外虚拟机由于有GuestOS存在,可以和宿主机运行不同OS,而容器只能支持和宿主机内核相同的操作系统。而且虚拟机由于有VMM的存在,虚拟机之间、虚拟机和宿主机之间隔离性很好,而容器之间公用宿主机的内核,共享系统调用和一些底层的库,隔离性相对较差。
2.云计算和虚拟化
云计算是最近几年才兴起的概念,但是这样的需求其实早都有了,现阶段广为接受的是美国国家标准与技术研究院(NIST)定义:
云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
云计算最基本的特性是:“按使用量付费”、“资源共享池”和多租户隔离。就如前面提到的,虚拟化技术就是解决了资源共享、按需分配和任务隔离的功能,于是云计算和虚拟化技术的结合是很自然的。于是问题来了,是选取基于虚拟机的虚拟化呢,还是基于容器的虚拟化。早期由于容器技术的不完善,云计算只有虚拟机这一种选择。随着现在容器技术兴起,基于容器的虚拟化性能更高,交付速度快,方便管理,而且资源利用率高,看起来是比虚拟机更好的方案。
但是它现有的两个比较大的缺点(隔离性不够强、操作系统依赖性)让他无法完全替代VM,对于 SaaS用户和部分PaaS用户而言这两个缺点可能不那么明显。现阶段Container和云计算主要结合的场景也是在SaaS和PaaS中(事实上大多数SaaS和PaaS服务提供商都使用了容器技术)。
但是对于 IaaS的用户来说,他们租用的是基础设施,上面承载着他们自己运行的系统和服务,隔离性不强意味着安全性和可信性不高,在这种情况下大客户们(一些公司会把自己的服务托管在云上,租用公有云,省下来机房、服务器和运维的成本,他们也是公有云最主要的客户)肯定是不放心的。同时操作系统依赖性也是限制Container在 IaaS层应用的一个主要问题,也是绝大多数解决方案都是将container运行在VM上的原因,这样Container性能好的优势实际上在云上根本发挥不出来,优点只有启动快了。
3. OpenStack和Kubernetes
题主可能对云计算理解不够透彻,不是一个大型分布式集群虚拟化平台就能称之为云计算平台的的。OpenStack作为时下最成功的开源云计算管理平台(现阶段主要致力于IaaS平台),能提供的管理功能比Kubernetes 强太多了,Kubernetes只是提供一个容器的分布式集群管理工具,OpenStack里光是Nova+Heat两个组件就比Kubernetes的功能更多(事实上在Magnum正式立项之前,OpenStack先后推出过Nova-docker-driver和Heat-docker-driver用来提供容器服务)。
如前面云计算定义所说的:”云平台需要提供可用的、便捷的、按需的网络接入“,”资源能快速被提供“,”只投入很少的管理工作“。于是一个云平台需要具备多租户访问控制、网络虚拟化、存储虚拟化、计算虚拟化、虚拟化集群管理和编排、用户友好的接入方式、故障监控功能等等,Openstack经过几年十几个版本的更迭,已经拥有了Keystone、Nova、Neutron、Cinder、Glance、Swift、Heat、Ceilometer等等组件,比较完整的提供了一个云平台应有的各个模块。而Kubernetes只是提供了容器的虚拟化集群管理和编排功能,而且就这个功能也不够完善。
此外OpenStack也在不断整合新的东西进来,正在开发中的Magnum是容器管理和编排的组件,Magnum中使用了Kubernetes作为容器的集群管理和编排,此外结合其它组件的功能才能提供比较完整的一个基于容器的云平台解决方案。
作者:网易云
链接:https://www.zhihu.com/question/35425470/answer/215969689
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1、 OpenStack作为IaaS事实标准,积极主动兼容Docker,说明容器化很有诱惑,是未来的技术方向。虽然OpenStack是越做越庞大,但也不是什么项目都会集成的。而OpenStack和Docker分别偏向IaaS(资源层)和PaaS(应用层),让两者有深度结合的基础。
2、 很多公司将二者结合,既是因为已经部署OpenStack在先,也是因为Docker的隔离性比较差,尤其是在网易云这样的公有云,隔离性非常重要,所以也采用了VM+Docker。
3、 VM+Docker注定有性能损失,不利于发挥Docker的轻量级优势,因此需要很多的优化工作,包括网络、后端存储等方面,可以参考<网易云容器服务研发实践分享>,而为了提供更好的性能,网易云也基于裸金属推出了超级容器方案。
4、 Kubernetes社区在Google的推动下非常活跃,Kubernetes稳定版发布已经满两周年,越来越强大,已经承载很多有状态、数据类莹莹,可以说是容器管理的技术标准了,Azure、AWS都大力支持Kubernetes了。当然,Kubernetes也还不完美。Kubernetes 技术带头人Tim Hockin在2017年6月总结:“所有简单的问题都已经得到了解决,还剩下什么?那是 90% 的疑难杂症!”
5、 Google直接用容器技术管理数据中心,没用OpenStack。之前部署OpenStack的,也已经有互联网公司从OpenStack切换到Kubernetes。因为OpenStack组件多,运维复杂,整体运营成本高,而Kubernetes功能丰富而清晰、灵活,设计理念很Google(比如Pod、RC、Service的抽象很棒)。当然,也不是全部切换,只是大部分。
6、 不认为Docker是虚拟化,因为是共享内核。也不推荐将容器当做虚机用,那样不好发挥容器对微服务、对DevOps的价值。当然,技术债多的团队,要发挥Kubernetes的优势,玩好微服务,也需要很强的技术实力,深刻理解Kubernetes高级配置。
作者:张乾
链接:https://www.zhihu.com/question/62985699/answer/204233732
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
OpenStack:公认的云计算IaaS平台,其管理的核心目标对象是机器(虚拟机或物理机),当然也可以管理存储和网络,但那些也大都是围绕着机器所提供的配套资源。近年来容器技术火了之后,OpenStack也开始通过各种方式增加对容器的支持,但目前OpenStack还不被视为管理容器的主流平台。
Docker:这里我假定你指的是Docker engine(也叫做Docker daemon,或最新的名字:Moby),它是一种容器运行时(container runtime)的实现,而且是最主流的实现,几乎就是容器业界的事实标准。Docker是用来创建和管理容器的,它和容器的关系就好比Hypervisor(比如:KVM)和虚拟机之间的关系。当然,Docker公司对Docker engine本身的定位和期望不仅仅在于在单机上管理容器,所以近年来一直在向Docker engine中加入各种各样的高级功能,比如:组建多节点的Docker集群、容器编排、服务发现,等等。
Kubernetes(K8s):搭建容器集群和进行容器编排的主流开源项目(亲爹是Google),适合搭建PaaS平台。容器是Kubernetes管理的核心目标对象,它和容器的关系就好比OpenStack和虚拟机之间的关系,而它和Docker的关系就好比OpenStack和Hypervisor之间的关系。一般来说,Kubernetes是和Docker配合使用的,Kubernetes调用每个节点上的Docker去创建和管理容器,所以,你可以认为Kubernetes是大脑,而Docker是四肢。Mesos:哈,终于说到我目前正在做的啦!Mesos是一个通用资源管理平台,它所管理的核心目标对象既不是虚拟机/物理机,也不是容器,而是各种各样的计算资源(CPU、memory、disk、port、GPU等等)。
Mesos会收集各个节点上的计算资源然后提供给运行在它之上的应用框架(比如:Spark、Marathon、甚至是Kubernetes)来使用,应用框架可以将收到的计算资源以自己喜欢的任何方式创建成计算任务来完成特定工作(比如:创建一个大数据任务计算个π什么的)。由于容器技术近年来的火热,Mesos也对容器进行非常深层次的支持,它内部完整地实现了一个容器运行时(类似于Docker),所以,上层的应用框架可以方便地把自己的计算任务以容器的方式在Mesos管理的计算集群中运行起来。使用Mesos的门槛相对较高(需要应用框架编写代码调用Mesos的API和其集成),但一旦用起来之后灵活性和可扩展性更高,因为Mesos并不限制应用框架如何使用计算资源(可以以容器的方式使用,也可以是其它方式,比如:传统的进程),主动权完全在应用框架自己手中。作为对比,Kubernetes只能管理容器,所有任务都必须以容器的方式来运行。为了解决门槛较高的问题(当然也是为了赚钱),Mesosphere(Mesos这个开源项目背后的商业公司)推出了DC/OS,其核心就是Mesos加一个内置的应用框架Marathon(可以用做容器编排),能够达到开箱即用的效果,安装好之后立刻就可以创建和管理容器和非容器类的任务了。
作者:网易云
链接:https://www.zhihu.com/question/62985699/answer/298615132
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这四项技术都对云计算的普及应用都发挥了很大的作用。
在 Docker 概念普及期,有很多人担心 Docker 可能会取代 OpenStack,但 OpenStack 社区大牛用上面这张图解释了二者的关系:
- Docker 主要针对 Paas 平台,是以应用为中心。
- OpenStack 主要针对 Iaas 平台,以资源为中心,可以为上层的 PaaS 平台提供存储、网络、计算等资源。
我们也看到,OpenStack 社区和 Docker 的结合越来越紧密。然而正如其他回答所示,OpenStack 主要还是用来管理 VM(虚拟机)。
另外两项技术,Kubernetes 是面向应用的 PaaS 层,Mesos 也偏向资源管理,但 Mesos 框架设计不错,基于它很容易构建 PaaS。
OpenStack 很庞大,底层资源管理能力很强。
Kubernetes 的强项在于容器编排,可以很好解决应用上云的问题。Kubernetes 可以运行在 OpenStack 上。Kubernetes 的好处,推荐来自浙大的这篇文章:请注意,容器技术圈已迈入后Kubernetes时代!
Mesos 牛叉在于数据中心资源统一管理,可以为多个框架分配资源,但不负责调度,可视为分布式操作系统内核,也可以部署在 OpenStack 上,也支持物理资源。
如果只用容器,Kubernetes 是不二之选;如果是运行的不仅仅是容器化的应用,Mesos 配合 Marathon 调度框架甚至 Kubernetes 都不错。