Back in 2019 Microsoft introduced the ephemeral OS disk option for Azure VMs and VMSS.
-> https://azure.microsoft.com/en-us/updates/azure-ephemeral-os-disk-now-generally-available/
Instead of storing and persisting the OS disk to the Azure remote storage the ephemeral OS disk is stored onto the VM’s cache. Hence, ephemeral OS disks are perfect for stateless workloads like Azure Kubernetes Service node pools.
For instance, the ephemeral OS disks are the default for new AKS node pools. And here is the general issue. When you specify an OS disk size which is larger than the VM’s cache size AKS falls back to the managed OS disk option. This happens especially with smaller Azure VM sizes compared to the larger ones.
I have written a PowerShell-based Azure Function and a PowerShell script tackling this problem and getting the max capacity of ephemeral OS disks for Azure VMs in an Azure region.
You call the Azure Function API endpoint under the following URL.
-> https://ephemeraldisk.danielstechblog.de/api/ephemeraldisk
As input parameters you provide the Azure region ?location=northeurope
and you can provide the VM family &family=Dsv3
as a filter for the result set.
-> https://ephemeraldisk.danielstechblog.de/api/ephemeraldisk?location=northeurope
-> https://ephemeraldisk.danielstechblog.de/api/ephemeraldisk?location=northeurope&family=Dsv3
The difference between the function and the PowerShell script is minimal. Using the script, you only get the results for Azure VM sizes which are unlocked for the subscription. Where the function returns all VM sizes for an Azure region.
> ./Get-EphemeralOsDiskVmSizes.ps1 northeurope Dsv3 [ { "Name": "Standard_D16s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 400, "EphemeralOsDiskSupported": true }, { "Name": "Standard_D2s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 50, "EphemeralOsDiskSupported": true }, { "Name": "Standard_D32s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 800, "EphemeralOsDiskSupported": true }, { "Name": "Standard_D48s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 1200, "EphemeralOsDiskSupported": true }, { "Name": "Standard_D4s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 100, "EphemeralOsDiskSupported": true }, { "Name": "Standard_D64s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 1600, "EphemeralOsDiskSupported": true }, { "Name": "Standard_D8s_v3", "Family": "DSv3", "MaxEphemeralOsDiskSizeGb": 200, "EphemeralOsDiskSupported": true } ]
Both solutions are available on my GitHub repository.