物理机 VS 虚拟机
由于历史原因,很多公司在大量使用虚拟机,不管是云上还是自己的私有云,不过这样去跑容器如鲠在喉。
如果想要把性能和稳定性飙到顶,物理机是完美的选择。
以前之所以有虚拟机是因为资源利用率,调度灵活,故障自愈等这些需求的存在,而容器的出现恰好可以解决这些问题,所以现在还在虚拟机上跑容器除了浪费性能,降低稳定性,提示维护成本,几乎没看到其它好处。
在物理机上有如下好处:
网络性能
目前大部分虚拟机已经有虚拟化网络,而且通常是 vxlan 之类的特别重的 overlay 方式,这就意味着封包拆包的开销,会消耗更多的 CPU,软件成本,维护成本都会增加,即便你用公有云,这些成本最终会羊毛出在羊身上。 即便把这个过程卸载到网卡上,还是一样,硬件也变得更贵了,换汤不换药,真的没必要。
这不是最可怕的,关键是在虚拟机的虚拟化网络之上还需要再做一层容器化虚拟网络,关键是有些云厂商的虚拟机还不支持容器的路由网络,那容器的虚拟化网络只能再来一次封装,再封包拆包一次,相当于一个数据包要封装两次再拆两次,中间还要走一系列复杂的流表,真的是非常丑陋的方案。
当你把容器直接跑虚拟机上时,你会全身轻松,可以直接走容器的路由网络,延迟比 overlay 低很多,而且网线插好即可,几乎不用走任何虚拟化。
虚拟机的网络相当于是把路由器交换机这些全用软件写了一遍,这样确实功能强大和灵活,但是成本也是真的高,你得想想你是不是真的需要,其实从容器的角度来说,网络能通能堵就行了,不放在 VPC 里面影响我跑个 java 应用吗?
所以容器很多网络的实现选择了一种非常聪明的做法:抛弃 80% 功能,把实现变得极其简单,什么网桥软路由器,统统不要。 如 calico 的路由网络实现,把每台机器网段规划好,直接给主机划分路由即可。 负载均衡和路由几乎都内核提供,写少量管控即可,简单高性能又稳定,出了问题也不用看复杂的流表。
存储性能
虚拟机用的基本都是走的网络存储,网络存储和本地盘是没法比的,所以最终结果也是非常的贵,有兴趣的可以对各家公有云的虚拟机磁盘价格和硬件成本做个对比,你会惊掉下巴。。。出了对象存储真的把成本降下来了,其它计算资源是真的贵。
现在一种新的玩法:容器+物理机物理盘+lvm, 获得本地磁盘性能。当然这里的做法确实有一些能够容忍的小缺陷,就是高可用怎么办?
这里最佳实践的建议是:业务系统的数据都放到数据库或者对象存储中,尽量忘记本地目录,不要往本地存储存东西。
有这个前提就好办了,让数据库和有状态应用自己去负责数据高可用和安全。
比如 sealos 上的 kubeblocks(简称 KB ),首先 KB 启动的 MySQL/Redis/pgsql/mongo 本身都可以是多副本的,副本直接在数据库层面做数据同步,再配合上往对象存储中的备份恢复,可以保证数据绝对不丢。
所以有数据库和对象存储基本可以解决 95% 的数据存储问题,尽量依赖这些软件本身的高可用能力。
而 KB 本身每个容器直接用的本地磁盘,这样性能最高,要解决的问题是多用户之间怎么做好隔离,这里 sealos 选择的方案是 openebs 的 lvm 模式,为每个用户单独划卷,还可以通过条带花增加性能。
强隔离容器
物理机对 firecracker 这类轻量虚拟化方案也支持更好,这样相当于同时具备了容器的灵活性和虚拟机的强隔离性,是个完美的方案。而如果在虚拟机上用这套方案的话,首先很多云都不支持嵌套,另外即便支持俄罗斯大娃套小娃也显得很智商不太好。
以上,在物理机上直接跑容器是企业构建私有云的非常好的方式,可以把成本降到最低,把性能和稳定性拉满。
总结一下就是:
- 极高的性能
- 更少的浪费资源
- 极大提升稳定性
- 提升安全性