The options
| Option | Protects against | VM SLA (2+ VMs) | Notes |
|---|---|---|---|
| Single VM (Premium SSD) | Nothing beyond host healing | 99.9% | See the standalone post |
| Availability set | Rack/host failure, planned maintenance (fault and update domains) | 99.95% | One datacenter; legacy but still valid in regions without zones |
| Availability zones | Datacenter (zone) failure | 99.99% | Needs zone-redundant/zonal dependencies too |
| Flexible VM scale set across zones | Zone failure + autoscale + fleet management | 99.99% | Recommended for new stateless tiers |
Choose zones whenever the region supports them. Availability sets and zones can't be combined for the same VM.
Design: zone-redundant web tier
Standard Load Balancer (zone-redundant frontend)
┌─────────────┼─────────────┐
vm-web-1 (zone 1) vm-web-2 (zone 2) vm-web-3 (zone 3)
az vmss create -g rg-web -n vmss-web --orchestration-mode Flexible \
--image Ubuntu2204 --vm-sku Standard_D2ds_v5 --instance-count 3 \
--zones 1 2 3 --platform-fault-domain-count 1 \
--vnet-name spoke-web --subnet snet-web \
--lb lb-web --upgrade-policy-mode Rolling
Health probe on the application path, not just TCP:
az network lb probe create -g rg-web --lb-name lb-web -n http-health --protocol Http --port 80 --path /healthz
Everything in the path must be zonal or zone-redundant
- Load balancer Standard SKU, public IP Standard with zone-redundant frontend.
- Disks: zonal (follow the VM) or ZRS disks for shared/failover scenarios.
- NAT gateway is zonal: use one per zone, or let the firewall in the hub handle egress.
- Database tier: zone-redundant Azure SQL, or SQL Server AG with replicas in different zones.
- App state: no local sessions. Use Redis (zone-redundant tier) or a database.
Capacity planning
With 3 zones and N+1 thinking: if one zone fails, the remaining 2/3 of instances must carry the load. Either run at ≤ 66% utilisation or let autoscale add instances quickly (and confirm quota and SKU capacity in the remaining zones).
Test it
- Stop all instances in one zone during a test window and watch the load balancer and app metrics.
- Use Azure Chaos Studio experiments (VM shutdown, zone-down via NSG faults) for repeatable tests.
az vm list -g rg-web --query "[].{name:name, zone:zones[0], power:powerState}" -d -o table
Tip
Document which components are zonal, zone-redundant or regional only. Single points of failure usually hide in the "regional only" column: an old Basic SKU IP, a single NVA, a VM-based DNS server.