How-To

How To Create Nested Virtual Machines in Microsoft Azure

They can do a lot more than just test and dev.

Last month we looked at how to set up nested VMs in Hyper-V on Windows Server 2016. Azure, of course, runs on Hyper-V and some regions already have some of their hosts upgraded to Windows Server 2016.

Microsoft announced support for nested VMs at its Build conference, and expanded on this in a blog post in July 2017. Supported machine sizes are Dv3 and Ev3; both support newer Intel processor architectures, and the Ev3 series supports more memory-to-vCPU ratio. The largest Dv3 machine has 64 vCPUs and 256GB RAM, whereas the biggest Ev3 has 64 vCPUs and 432GB RAM.

In this article, I'm going to use a virtual machine (VM) in Azure with nested virtualization for a Microsoft Official Curriculum (MOC) course. I teach part-time at a Microsoft Imagine Academy, and I'm exploring the possibility of using Azure instead of local hardware to deliver courses. As we covered last month, there are many uses for nested virtualization (apart from training labs), such as dev and test, demos, containers and user isolation.

Creating the VM
Sign in to portal.azure.com (or if you're really adventurous, try preview.portal.azure.com). Click New, Compute, Windows Server 2016 Datacenter and follow the normal process to create a VM (Figure 1). Make sure you pick one of the regions that has the new VMs sizes and support for nesting (US West 2 and East, Europe West and APAC Southeast; there may be additional regions by the time you read this).

[Click on image for larger view.] Figure 1. Creating a virtual machine in Azure.

Fill in the basic information about the VM, then pick a size. I opted for the E4s v3, which comes with 4 vCPUs and 32GB RAM, to match the requirements at Hardware level 8 for MOC courses (multi core CPU, SSD storage and 32 GB RAM). I also created a separate data disk on SSD storage (Figure 2) to host the VMs, opting for the P30/1 TB size because of the associated performance (5000 IOPS and max throughput of 200 MB/second).

Another option would have been to create smaller premium managed disks and pool them together in the OS using Storage Spaces. I could also have opted for HDD-based storage disks, but the performance would not be great for the nested VMs inside the host.   Once the VM was up and running, I initialized and formatted the data disk.

[Click on image for larger view.] Figure 2. Preparing the SSD-based data disk in the host virtual machine.

I then downloaded the course VMs and material, and enabled the Hyper-V role. Note that unlike on-premises Hyper-V, there's nothing you need to do to prepare the VM for being a virtualization host; it's already been done by Azure.

After restarting the VM I unpacked the VMs that make up the sample course (20-740B Installation, Storage and Compute with Windows Server 2016). (As a side note, the download times of the 43GB files for the course took only a few minutes, whereas it would have taken hours on my own (Australian) Internet connection.)

Nested VMs
If you don't have ready-made VMs to run on your new Hyper-V host, you can use the script by Cheng  Ding; simply edit the script to provide a name for the VM, and it'll create it for you. You can also enable further levels of virtualization and create a nested VM inside a nested VM, and so on (Figure 3).

[Click on image for larger view.] Figure 3. All 740B lab machines running on the host virtual machine.

Note that MAC address spoofing isn't supported in Azure, so if your nested VMs need Internet connectivity, you'll need to use NAT or fixed IP addressing. Microsoft provides a VM for this in the MOC course (MT17B-WS2016-NAT), but it'll need Internet access configured according to the instructions by Ding before the other VMs can connect through it.

A fellow trainer reading this article might point out that the VM in Azure won't let students complete all the labs in the 20-740B course, as you can't set up a VM in Azure to boot from an alternate VHDX file easily, and the VM doesn't have a TPM 2.0 chip. This was more a proof-of-concept than an actual implementation, but I think the concept demonstrated here shows that the future of IT training will include some options for using nested VMs in Azure.

There are a few things for Microsoft Learning to tackle to make this a reality, like an easy way to capture the VM once it's been prepared with all the relevant courses so that it can be deployed multiple times for a classroom full of students.

Fortunately, Azure already has some technologies to help with this such as managed images, DevTest Labs and of course ARM templates and DSC with Azure Automation. DevTest Labs comes with quotas and policies, along with automated shutdown (which is now also available for vanilla VMs).

[Click on image for larger view.] Figure 4. Disk performance when starting all lab virtual machines simultaneously was 73 MB/sec.
The Need for Speed
Overall, I found this approach really easy; the lab VMs start and run incredibly fast in Azure (Figure 4). It'll be interesting to see if Microsoft Learning (and third-party training environment providers) jump on board with nested VMs in Azure.

About the Author

Paul Schnackenburg has been working in IT for nearly 30 years and has been teaching for over 20 years. He runs Expert IT Solutions, an IT consultancy in Australia. Paul focuses on cloud technologies such as Azure and Microsoft 365 and how to secure IT, whether in the cloud or on-premises. He's a frequent speaker at conferences and writes for several sites, including virtualizationreview.com. Find him at @paulschnack on Twitter or on his blog at TellITasITis.com.au.

Featured

Subscribe on YouTube