天天看点

容器部署在物理机还是虚拟机上?

如果运行在物理机上,那么资源会最大程度的得到利用,但是会牺牲一定的隔离性及安全性,特别是在企业没有规范的CI/CD镜像交付流程时,不同租户的容器会相互影响。

如果运行在虚拟机上,那么隔离性和安全性都会强于前者,但是会增加管理虚机的成本,以及降低资源利用率。

这一块企业该如何去抉择考量呢?

问题来自@sazh 某金融单位,下文来自twt社区众多同行实践经验分享,欢迎大家参与交流,各抒己见。

@gavin_zhang 某股份制银行 系统架构师:

就像问题中提到的,两种方案各有优劣,具体方案需要结合企业的实际需求进行选择,选择时候可以参考:

性能:使用VM+容器方案,中间多了一层Hypervisor,性能大概损耗10%~20%。

成本:对于开源解决方案,没有额外的软件成本;如果是商用解决方案,VM比物理机方案多出宿主机的操作系统和Hypervisor管理软件都是成本。

可维护性:由于VM可以安装Agent进行管理,各种管理软件和配套运维工具齐备,可维护性比物理机高。另外一方面,VM方案由于部署负载,问题特别是网络和存储的性能问题定位比较难。

可靠性:需要从两个方面看,VM多了一层操作系统和Hypervisor,多了故障点,但是VM有可以提供故障迁移的能力,所以可靠性上,各有千秋。

其他:VM方案可以让容器和虚拟机应用共享同一个物理机集群,最大化资源使用率。

综上所述:

如果企业已经有了一个比较稳定的虚拟机平台,而且运维经验也有了的话,建议还是虚拟机部署。

如果容器平台独占物理集群,对性能要求比较高(特别是网络),建议物理集群。

如果成本敏感,而且又计划将所有应用和服务部署在容器上,建议物理集群。

@某企业技术经理:

物理机的扩容成本比较高,效率低。

@海燕 陆金所 系统工程师:

从资源利用率上:1.虚拟机现在最通用的是VMware,就有一层hypervision的开销,这部分一般占用系统总开销的10-15%之间。2.虚拟机的磁盘和内存会因为机器被分配而独享的方式分配出去了。容器的话磁盘和内存虽然requested,limited,但是是用多少,占用多少。

从网络上:虚拟机会在物理机器的网络上添加一层,在之后网络方案的设计、网络性能的转发等等多一层开销。

从运维成本:虚拟机的管理、可能的licence等需要经济成本。

从安全上:容器是共享宿主机器的内核,每个应用都有可能因为被攻击而导致整个机器挂掉。

所以,各有千秋,全看自身关注点考虑。

@Garyy 某保险 系统工程师:

虚拟机也可以像容器一样使用,但虚拟机有几个显著的缺点。最关键的是虚拟化有一个开销,无论部署的guest虚拟机的操作系统(OS)有多精简,在建立新的虚拟机时仍然需要完全复制该操作系统及其整个配置。容器运行自己的初始化进程,文件系统和网络堆栈,在虚拟机或裸机主机操作系统之上进行虚拟化。就其性质而言,容器使用的内存少于虚拟机。这是由于它们固有地共享OS内核,并且在大多数情况下它们也使用相同的库。

管理程序用于共享硬件基础架构,允许多个租户,孤立的虚拟机在同一台物理机器上运行。虚拟机模拟基于计算机体系结构的计算机系统,并提供物理计算机的功能。这可以提高底层物理机器的利用率。相比之下,裸机服务器是单租户,这意味着没有资源共享,可用的CPU和RAM专用于您的进程。

例如,使用Hyper-V的报告开销介于9-12%之间,这意味着Hyper-V下的客户机操作系统通常从可用CPU的88-91%开始。当在Hyper-V下运行的操作系统被观察到在主存储器的大约340MB时,存储器开销。当然,在客户操作系统上运行进程可能会因缺乏资源而受到影响,并且效率低于直接在主机(物理服务器)操作系统上运行相同进程的效率。考虑到这种虚拟化开销,容器的工作方式及其好处提示我们检查直接在主机上运行容器的选项。

虚拟机使用户能够使用访客映像轻松地在主机之间移动工作负载(即容器),而裸机则更难以升级或移动。一个很好的例子就是回滚。使用裸机服务器,回滚机器状态是一项艰巨的任务。云平台(如Amazon云)支持的版本控制和回滚功能可以定期获取VM的时间点快照,并在需要时轻松回滚到该快照。

另一个例子接受容器有限制,比如官方Docker安装需要Windows 10 Pro,以及其他Windows Server版本,比如2012甚至2008,都不被支持。当您需要升级和配置操作系统时,这可能会使裸机服务器很痛苦。

另一方面,单租户裸机服务器可以为受到合规措施限制的组织提供更好的选择,这可能需要严格的数据安全和隐私控制。

@Steven99 软件架构设计师:

首先没有绝对的好与坏,通常要根据企业自身的实际情况来选择最适合的方案。

选择物理机还是虚拟机,首先要考虑需求,对业务容器的资源需求通常是多少,物理机往往配置比较高,否则占用机房机柜资源也是挺大的浪费,所以虚拟化一层有虚拟化的好处,当然会有性能损失,但相比来说可能更适合。

如果物理机配置不高,而容器资源需求又不是简单的少量弹性多实例,就没必要虚拟化一层。

另外就是企业自身当前现状,不可能重头来过,所以要基于现实寻找合适方案,也可能物理机虚拟机并行,这都不是目的,目的是更好支撑业务,所以以业务需求为中心,基于企业现状来选择合适方案是比较好的。

@zhuqibs Mcd 软件开发工程师:

在我看来,这不是个问题,是根据用户自身条件来选择的。

如果是自建IDC机房,建议用实体机,原因如下:

(1)运维成本:k8s本身的网络环境比较复杂,在这个复杂的网络上再叠加上复杂的虚拟机的网络,这没有专有的运维人员难以搞定;

(2)可靠性:虚机构建的k8s,有可能共享cpu,一旦宿主机节点挂了,导致多个k8s节点崩溃,一旦发生master节点全挂,容器云就玩完;

(3)软件成本:IDC机房自建已经投入大量资金,如果再投入VMware、boss等pks的软件成本太大;

(4)需求缺乏:使用虚拟机构建k8s,其中最大的优点是可以客户化,比如我需要5个节点的集群,我可以自己构建虚拟机,自建集群,听上去很美,但现实很骨感,大部分企业没有这种需求。这需求出现在公有云上。

(5)技术不成熟:我有亲身经历,就是某企业级容器云,厂商承包了软硬件的部署,然而其中有大坑,部署后NxT网络有问题,导致容器云中的应用经常“龟速”运行,厂商排查了大半年,无法解决。

如果用户没有自建机房,那必然使用虚拟机的k8s部署方案,有朋友说性能会下降多少,还真没感觉出来,不过有很多优点:

(1) 省钱:现在大部分公有云商家, k8s集群都是不收费的,只收底层服务器的钱;

(2)还是省钱:全托管的k8s,master节点是公有的大池子,不收费;

(3)省心:对于不是互联网大公司而言,要养k8s专业运维人员是不小的支出,但公有云没有这个烦恼;

(4)autoscale:服务器是虚拟机,可以自动扩展,活动日不仅能用k8s自己的autoscale,还可以用虚拟机的autoscale,实体机是不可能有后者的;

(5)随心所欲的自建,你平时会有不少测试、实验的需求,建立一个k8s就可以了,不像实体机, 没资源,你还要去买机器。

继续阅读