虚拟化技术基础:从物理机到资源池的蜕变

说实话,虚拟化技术是整个云计算的基石。没有它,后面谈什么弹性伸缩、资源池化都是空谈。我最早接触虚拟化是在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是怎么在虚拟化基础上更进一步,实现更轻量、更灵活的部署。到时候你会发现,虚拟化和容器其实是互补的,不是替代关系。