在使用k8s集群时,部署在虚拟机还是在物理机上,往往有不一样的意见。
外部意见
有人建议部署在虚拟机上,因为:
虚拟机支持热迁移,所在物理机宕机可以自动迁移到另外一台物理机上,这一过程对用户和应用透明,几乎不会造成服务中断。
这样的意见一般来自IaaS厂商。
也有人建立部署在物理机上,因为:
资源利用率高,无虚拟化层性能损耗,性能更好。
这样的意见一般来自PaaS厂商。

实践情况
我司第一个容器化应用是一个性能敏感的交易型系统,为了保证性能,综合考虑下,选择了将k8s工作节点部署在物理机上,管理节点部署在虚拟机上。
后续多个k8s集群均使用了这种部署方式,除了DMZ区的集群。因DMZ区只有少量的ng需要部署,资源需求较少,投入物理机资源过于浪费,因此使用了全虚拟化。
可以说,我司的部署策略是基本按照PaaS厂商的建议方式来做的,而且对于平台节点的授权,合作的厂商并不区分虚拟机还是物理机。
在这种情况下,其实使用物理机有助于我司减少节点授权费用。
具体在使用过程中,物理机和虚拟机其实各有优缺点,不止是前面提到的那些。
物理机部署优缺点分析
优点
性能优势是毫无疑问的,但具体差距多少,我在网上查到了有人做了对比测试,我这里放下测试结果:
CPU速度和利用率提高2倍 内存延迟降低3倍 存储性能提高2倍+ 网络延迟降低5倍+
测试结果出处:https://reurl.cc/V0zya5
(原始链接太长,我转成了短链,会有一次跳转)
比我想象的高不少。
前些天和浙江一家公司交流,他们也介绍说在云计算平台上容器网络延迟比物理机容器网络延迟高60%。
缺点1
在一个由多台物理机组成的集群中,肯定不会只运行一套业务系统。
系统多了,不同系统之间如果需要网络安全隔离怎么做?
能做配置的只有k8s的Networkpolicy,配置的所有策略都会由k8s写到主机的iptables上。
一个系统的数据流非常多时,配置的工作就会比较繁琐,有遗漏的风险。
缺点2
在传统网络架构下,防火墙的策略是单个IP到单个IP放行的。
但在K8S集群中,你得将整个工作集群的IP段放行。
为什么?
当集群扩容,增加了一台新的机器:
如果之前是按精确的IP地址开通策略,当新增机器加入集群后,Pod会自动调度到这个新节点上,然后就会出现因为网络不通影响业务的情况。
只有整个工作集群IP段都事先放行,才不会影响集群的扩容和自动调度。
但这也导致了传统的网络管理的颗粒度没那么精细了。
传统的流量管理和监控方式只能到达集群层面,没法直达业务系统,需要使用一些新的技术手段。
缺点同时也是优点
如果Networkpolicy配置管理做得比较好,对于上一层的物理网络安全管理其实是减轻了负担,所有的策略在主机上,主机下线,则主机上的网络策略规则也自动下线了。
怎么理解?
传统按IP到IP放行的网络策略,如果某台机器不用了,下线了,但网络策略还配置在防火墙上。时间长了,网络管理员也不清楚哪条策略是有用的哪条是没用的。
按段放行后,防火墙上的网络策略只需要配置这个集群的IP段,策略相对来说比较整体,集群内部上下线服务器对防火墙上的策略是无感的。
虚拟机部署优缺点分析
虚拟机的优缺点就是和物理机完全反着来了。
性能的差距上文已经说过了,这里不再说明。
优点
使用虚拟机部署,可以在一个集群里规划一部分虚拟机只运行A应用,另外一部分虚拟机只运行B应用。
通过虚拟化软件的安全组隔离这两部分虚拟机,无需为每个应用单独配置Networkpolicy。
流量管理和监控可以根据虚拟机IP定位到是哪个应用。
缺点1
资源利用率比较低。我司的业务系统都是按照压测峰值来申请计算资源的,如配置足够资源的虚拟机,会导致日常运行中存在较多资源闲置。
缺点2
同一个集群使用不同虚拟机承载不同应用的方式,需要手动为每个应用配置亲和性规则,这增加了平台规划的复杂度。
至于本文最开始提到的“虚拟机支持热迁移,所在物理机宕机可以自动迁移到另外一台物理机上,这一过程对用户和应用透明,几乎不会造成服务中断。”,在做好健康检查和优雅退出时,即使只使用物理机,也不会导致服务中断。
选择哪种方式?欢迎留下您的宝贵意见。




