虚拟化技术基础:从物理机到资源池的蜕变
说实话,虚拟化技术是整个云计算的基石。没有它,后面谈什么弹性伸缩、资源池化都是空谈。我最早接触虚拟化是在2010年,那时候还在用VMware vSphere 4.1,一台物理机跑十几个虚拟机就觉得了不起了。现在回头看,真是小巫见大巫。
这一章,咱们就聊聊虚拟化的核心——Hypervisor,以及两个主流选手VMware和KVM的对比。还会讲到资源池化、虚拟网络和虚拟存储。嗯,内容不少,但都是干货。
Hypervisor类型:Type 1 vs Type 2
Hypervisor,也叫虚拟机监视器。说白了,它就是一层薄薄的软件层,负责把物理硬件抽象出来,分给多个虚拟机用。
Hypervisor分两种类型:
- Type 1(裸机型):直接跑在物理硬件上,没有宿主操作系统。VMware ESXi、KVM(其实KVM是Linux内核模块,但通常归类为Type 1)、Microsoft Hyper-V都属于这类。
- Type 2(宿主型):跑在操作系统之上,比如VirtualBox、VMware Workstation。你装个Windows,再装个VirtualBox跑Linux,这就是Type 2。
我个人习惯在生产环境只用Type 1。为什么?性能损耗小,资源利用率高。Type 2多了一层操作系统,你想想看,这层OS本身就要吃资源,还要处理调度,性能能好到哪去?
关键区别:Type 1直接管理硬件,Type 2通过宿主OS间接管理。生产环境选Type 1,开发测试用Type 2就够了。
我在项目中遇到过一件事:有个客户非要用VirtualBox跑生产数据库,结果性能惨不忍睹。我过去一看,CPU占用率才30%,但虚拟机里的应用就是慢。后来换成KVM,同样配置,性能直接翻倍。嗯,这就是Type 1和Type 2的差距。
VMware vs KVM:两大阵营的对决
说到虚拟化,绕不开VMware和KVM。一个是商业巨头,一个是开源王者。我两个都用过,说说我的感受。
| 对比维度 | VMware vSphere/ESXi | KVM(基于Linux) |
|---|---|---|
| 架构 | Type 1,专有微内核 | Type 1,Linux内核模块 |
| 性能 | 优秀,尤其I/O密集型 | 接近原生,Linux生态优化好 |
| 管理工具 | vCenter,功能强大但贵 | libvirt、oVirt、OpenStack |
| 成本 | 高,按CPU授权 | 免费,但需要Linux运维能力 |
| 生态 | 成熟,企业级支持好 | 开源社区活跃,云原生友好 |
| 热迁移 | vMotion,成熟稳定 | KVM Live Migration,功能完善 |
怎么选?我建议这样:
- 如果团队Linux能力强,预算有限,选KVM。尤其是要对接OpenStack或Kubernetes的场景,KVM是天然选择。
- 如果团队习惯Windows管理界面,预算充足,选VMware。它的vCenter确实好用,故障恢复也成熟。
我的经验:曾经帮一家金融客户从VMware迁移到KVM。迁移本身不难,难的是运维团队习惯了vCenter的图形界面,突然面对命令行和libvirt,适应了好一阵子。所以选型时,别只看技术,还要看人。
虚拟化带来的资源池化
资源池化,说白了就是把物理资源(CPU、内存、存储、网络)打散,再重新组合成逻辑资源池。虚拟机需要多少,就从池子里拿多少。
这样做的好处很明显:
- 利用率提升:物理机CPU利用率从10%-20%提升到60%-80%很正常。
- 弹性伸缩:虚拟机资源不够了?动态加CPU、加内存,不用关机。
- 故障隔离:一台物理机挂了,上面的虚拟机可以自动在其他物理机上重启。
我记得有一次,一个电商客户做双十一促销,流量突然暴涨。传统架构得提前采购服务器,等机器到了,促销都结束了。用了虚拟化之后,直接从资源池里调出20台虚拟机,半小时就扩容完成。这就是资源池化的威力。
注意:资源池化不是无限超分。CPU超分比例建议不超过1:8,内存超分不超过1:1.5。超分太多,虚拟机之间会互相抢资源,性能反而下降。我曾经见过一个客户把CPU超分到1:20,结果所有虚拟机都慢得像蜗牛。
虚拟网络:软件定义的数据流动
虚拟网络,就是把物理网卡、交换机、路由器这些网络设备,用软件模拟出来。虚拟机之间通信,走的是虚拟交换机,而不是物理线缆。
常见的虚拟网络组件:
- 虚拟交换机(vSwitch):相当于物理交换机,负责虚拟机之间的数据转发。
- 虚拟网卡(vNIC):虚拟机里的网卡,每个虚拟机可以配多个。
- VLAN/VXLAN:网络隔离技术。VLAN用12位ID,最多4096个;VXLAN用24位ID,支持1600万个。
举个例子,在KVM里创建一个虚拟网络:
# 创建一个NAT模式的虚拟网络
virsh net-define <<EOF
<network>
<name>my-network</name>
<forward mode='nat'/>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.10' end='192.168.100.100'/>
</dhcp>
</ip>
</network>
EOF
# 启动网络
virsh net-start my-network
virsh net-autostart my-network
虚拟网络的好处是灵活。你想让两个虚拟机在同一个二层网络里?配同一个虚拟交换机就行。想隔离?用VLAN或VXLAN。想对外通信?配个NAT或桥接。
避坑指南:我曾经在配置虚拟网络时,忘了开启网卡的混杂模式,结果虚拟机之间ping不通。排查了半天才发现是这个问题。嗯,虚拟网络排障,先从物理网卡和虚拟交换机的配置查起。
虚拟存储:数据不再绑定物理磁盘
虚拟存储,就是把物理磁盘抽象成存储池,虚拟机看到的是虚拟磁盘文件,而不是真实的物理磁盘。
常见的虚拟存储方式:
- 本地存储:虚拟机磁盘文件存在物理机的本地磁盘上。简单,但无法迁移。
- 共享存储:通过NFS、iSCSI、FC等协议,多台物理机共享同一个存储。支持热迁移。
- 分布式存储:如Ceph、GlusterFS,把多台物理机的本地磁盘组成一个大存储池。云原生场景常用。
在KVM里,虚拟磁盘通常用qcow2格式:
# 创建一个20GB的qcow2磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/my-vm.qcow2 20G
# 查看磁盘信息
qemu-img info /var/lib/libvirt/images/my-vm.qcow2
# 给虚拟机添加磁盘
virsh attach-disk my-vm --source /var/lib/libvirt/images/data-disk.qcow2 --target vdb --persistent
qcow2支持写时复制(Copy-on-Write),创建快照很快,而且只占用实际使用的空间。比如你创建一个20GB的磁盘,里面只放了5GB数据,那文件大小就是5GB左右。
重要:生产环境一定要用共享存储或分布式存储。本地存储一旦物理机挂了,上面的虚拟机数据就全丢了。我见过一个团队,所有虚拟机都跑在本地磁盘上,结果一台服务器硬盘坏了,丢了十几个虚拟机的数据。那叫一个惨。
说到存储性能,IOPS和延迟是关键。SSD比HDD快10倍以上,但成本也高。我建议:
- 数据库等IO密集型应用,用SSD或NVMe。
- 日志、备份等冷数据,用HDD。
- 缓存层,可以用内存或持久内存(如Intel Optane)。
好了,虚拟化这块就聊到这儿。下一章咱们会深入容器技术,看看Docker和Kubernetes是怎么在虚拟化基础上更进一步,实现更轻量、更灵活的部署。到时候你会发现,虚拟化和容器其实是互补的,不是替代关系。