AWS最近宣布,在运行KVM或Hyper-V的虚拟化EC2实例中,支持嵌套虚拟机功能。这一备受社区期待的新特性使得在C8i、M8i和R8i等支持的实例上,能够实现应用程序仿真、硬件模拟等功能。
开发者可以利用这一特性来运行移动应用仿真器,模拟汽车内部的硬件设备,或者在Windows工作站上使用Windows Subsystem for Linux(WSL)。根据相关文档,Nitro系统能够让实例利用Intel VT-x等处理器功能,从而在其中运行虚拟机。
嵌套虚拟化的架构分为三层:首先是物理的AWS基础设施与Nitro管理程序(第0层);其次是运行自身管理程序的EC2实例(第1层);最后是在该实例内部运行的虚拟机(第2层)。这一新特性目前支持C8i、M8i和R8i实例上的KVM和Hyper-V技术。AWS工程总监Ioannis Aslanidis这样写道:
“这一功能使开发人员和企业能够利用各种标准的EC2实例类型,构建灵活的嵌套虚拟环境。”
事实上,社区长期以来一直期待这一特性的出现。早在2018年,就有开发者在Reddit上问道:“在Azure平台上,我可以在虚拟机中运行KVM技术,这就是所谓的嵌套虚拟化。那么Amazon在EC2平台上是否也取得了进展,使得HyperV/VMware/KVM能够得到支持呢?”
大多数人对这一新特性的反应都表达了同样的期待。Meta公司的生产工程师Rolf Neugebauer写道:“你们为什么花了这么长时间才推出这个功能?”Igor Sfiligoi则补充说:“直到现在,这真的还是不可能实现的事情吗?”在Hacker News上有一个热门讨论帖中,谷歌的软件工程师Michael Boulos这样写道:
“我觉得自己的努力没有白费。多年前,我们就和许多客户一起努力,确保嵌套虚拟化技术在GCE平台上能够顺利运行。很高兴看到AWS现在也终于推出了这一功能。有时候,为了实现操作的统一性和可控性,人们确实愿意牺牲一些性能。”
Render公司的创始人兼CEO Anurag Goel也表示:“这一功能的意义重大,因为现在你可以在AWS的虚拟机上运行Firecracker或其他微型虚拟机,而无需使用昂贵的AWS裸机实例了。”AWS的高级解决方案架构师Guillermo Ruiz测试了在实例内部运行Firecracker微虚拟机的技术,这一技术为未来的性能测试提供了可能。Ruiz写道:
对于那些关注隔离性、Lambda风格的运行环境,或者希望从性能和密度角度对比微虚拟机与容器的人来说,这是一个非常有意义的测试方向。
过去,在EC2上实现嵌套虚拟化功能的唯一方法是使用裸机实例,即不配备管理程序的物理服务器。许多开发人员因此选择了EC2中的Mac实例——这类裸机选项体积最小、价格也最便宜,从而暂时解决了这一问题。如今,启用嵌套虚拟化功能已经成为了通过API即可实现的选项。例如:
aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type r8i.4xlarge \
--cpu-options "NestedVirtualization=enabled" \
--key-name my-key-pair \
--placement "Tenancy=host"
不过,AWS仍然建议那些需要依赖硬件虚拟化技术来运行工作负载、对性能要求较高或希望降低延迟的客户,继续使用裸机实例而非嵌套虚拟化功能。
目前,在所有地区,C8i、M8i和R8i类型的实例都支持嵌套虚拟化功能;而Graviton实例则暂不支持这一技术。此外,KVM和Hyper-V是目前唯一被官方支持的L1级管理程序。