虚拟机搭建云平台
用一台虚拟机搭云平台,虚拟最直接的机搭建理由就是省钱。我手头这台2018款ThinkPad,平台16G内存,虚拟跑着Ubuntu 22.04。机搭建上面用KVM开了三台虚拟机,平台每台分配4核CPU、虚拟8G内存,机搭建它们组成了一个最小的平台IaaS集群。这套东西能干什么?虚拟能跑Kubernetes,能部署GitLab,机搭建能开Minecraft服务器。平台总成本就是虚拟电费,硬件是机搭建现成的。 为什么是平台虚拟机而不是直接物理机?因为物理机装完系统就定型了。你没法在同一台机器上同时跑CentOS 7和Ubuntu 20.04,更没法在系统崩溃后三秒内恢复。虚拟机把硬件抽象成文件,一个qcow2镜像复制三份,改改主机名和IP,三节点集群就出来了。去年我想测试Ceph分布式存储,用虚拟机开了五个OSD节点,折腾了三天把配置搞崩了。删除所有镜像,重新从模板克隆,十分钟回到初始状态。物理机做不到这种程度的挥霍。 选型上没什么好纠结的。KVM是Linux内核自带,不需要额外买授权。VirtualBox适合桌面环境,但跑长期服务会碰到内核模块冲突。VMware ESXi功能强,可它本身就是个独立操作系统,装完你原来的Linux就没了。我试过Proxmox VE,基于Debian,Web管理界面开箱即用,对KVM和LXC的支持都很完整。如果你不想在命令行里敲virsh,Proxmox是省事的选择。但要注意,它默认的ISO存储路径在/var/lib/vz/template/iso,小容量SSD很容易被镜像文件撑爆。 网络配置是第一个坑。KVM默认的NAT网络能让虚拟机上网,但外部访问不进去。你需要创建桥接网卡。编辑/etc/netplan/01-netcfg.yaml,把物理网卡ens33加入br0桥接。重启网络后,宿主机可能短暂断连,如果你是SSH远程操作,最好提前准备个本地终端。桥接完成后,虚拟机就能从路由器获取独立IP,和宿主机平起平坐。我的三台虚拟机分别拿到192.168.1.101到103,互相ping通,延迟在0.3毫秒以内。 存储方面,qcow2格式支持快照和动态扩容,但性能比raw格式差一截。我在虚拟机里跑MySQL,用fio测试随机写入,qcow2的IOPS大约是raw的70%。解决办法是把虚拟磁盘放在LVM逻辑卷上,用raw格式,牺牲快照换性能。或者加一块NVMe SSD专门给数据库虚拟机用,宿主机做PCIe直通。后者需要IOMMU支持,在BIOS里打开VT-d,内核启动参数加intel_iommu=on。配置成功后,虚拟机里的MySQL读写延迟从1.2毫秒降到0.4毫秒。 资源超分配要谨慎。宿主机16G内存,三台虚拟机各8G,总和24G明显超了。KVM的KSM(内核同页合并)能回收部分重复内存页,但别指望太多。我的实际经验是,三台虚拟机各分配4G内存,加起来12G,留4G给宿主机。CPU可以超,因为大部分时间虚拟机都在空闲。内存超了会触发OOM Killer,它可能杀掉你的SSH进程,让你连不上宿主机。把虚拟机的内存锁定( 这套方案撑不起生产环境。单点故障、没有冗余电源、网络靠一条千兆网线。但它能让你在一小时内理解云平台的核心组件:计算虚拟化、虚拟网络、分布式存储。我在上面部署了Nextcloud,给家里五台设备做文件同步,跑了两年没出过大问题。唯一一次故障是宿主机电源烧了,换了个二手电源,虚拟机从备份镜像恢复,数据丢了不到两小时。这种程度的可用性,对个人用户足够了。