Cosa è Azure Compute Fleet
Storia di Luca: CI/CD che sfida i limiti del provisioning
Luca è lead DevOps in una scale‑up fintech italiana. Il suo team .NET rilascia aggiornamenti ogni ora, e i test automatici sui server Azure CI/CD impiegano troppo tempo: ogni build avvia decine di VM, che spesso restano inattive o vengono rilasciate manualmente. Il costo sale e la complessità aumenta.
All’ultimo hackathon interno, Luca scopre Azure Compute Fleet: la possibilità di avviare fino a 10.000 VM, mixando Spot e Standard, localmente o cross‑region, bilanciando costo, capacità, disponibilità. Decide di sperimentarlo per il suo pipeline CI/CD: un singolo comando, build parallele isolate, e gestione automatica delle VM spot evicted.
1. Introduzione ad Azure & Azure Compute Fleet
1.1 Cos’è Azure?
Azure è la piattaforma cloud Microsoft che offre infrastruttura (IaaS), servizi gestiti, container, distribuzione serverless, database e gestione applicazioni. Fornisce linee di comando (CLI), PowerShell, REST API, e SDK in vari linguaggi (.NET, Python, Go).
1.2 Azure Compute Fleet – Overview
Azure Compute Fleet è un servizio per provisioning massivo di VM: fino a 10.000 macchine con un’unica chiamata, mixando Standard e Spot VMs, zone di disponibilità, e strategie di allocazione intelligenti .
Benefici principali:
- Prezzo‑performance ottimizzato (Spot + Pay‑go)
- Automatismi su capacity, price, SKU
- Distribuzione su zone/regioni e attribute‑based
- Integrazione via ARM, CLI, PowerShell, REST, SDK
2. Prerequisiti tecnici – Azure Compute Fleet
Per utilizzare Compute Fleet servono competenze in:
- Azure CLI, PowerShell, o SDK (.NET e Python)
- Gestione VM/Spot/zone/regione, budget cloud
- Accesso ARM o Azurite per infrastruttura Azure
- (Opzionale) Tool CI/CD per orchestrare provisioning
- Quota Spot/Standard sufficienti per il numero di VM
3. Scenario CI/CD: Parallelizzare il pipeline
Nel pipeline CI/CD, ogni commit:
- Builda il progetto .NET
- Avvia decine di container VM per test paralleli
- Distribuisce o elimina le VM in base ai test
3.1 Vantaggi di Azure Compute Fleet
- Provisioning in un singolo step
- Evita gestione manuale di scale set e Spot
- Auto‑ricostituisce VM Spot evicted (se abilitato)
- Strategie: risparmio (costo), capacità, mix
- Gestione automatica delle zone e regioni
4. Allocation strategies & Spot VM config per Azure Compute Fleet
4.1 Standard VM
- Lowest price (default): avvia VM pay‑go più economiche disponibili
- Prioritized: usa VM in ordine di priorità definita (non compatibile con attribute-based)
4.2 Spot VM
- Price capacity optimized (raccomandata): considera prezzo + capacità per minimizzare costi e massimizzare disponibilità
- Capacity optimized: seleziona VM con maggiore capacità, sacrificando il prezzo
- Lowest price (default): take cheapest first
4.3 Config Spot VM
- Maintain capacity: se attivo, il Fleet rimpiazzerà VM Spot evicted finché raggiunge capacità target (richiede almeno 3 SKU)
- Max hourly price: limite per evitare costi spot imprevedibili
- Eviction policy: default “Delete” (elimina VM + dischi), oppure “Deallocate” (ferma VM conservando disco), utile se vuoi riprendere stato
5. Dall’idea al provisioning
5.1 CLI quickstart base
az login
az group create -n myFleetRG -l WestEurope
az compute fleet create \
-g myFleetRG -n myFleetCI \
--location WestEurope \
--target-capacity-standard 5 \
--target-capacity-spot 20 \
--vm-sizes Standard_D2s_v3 Standard_D4s_v3 Standard_D8s_v3 \
--spot-max-price -1 \
--allocation-strategy-standard LowestPrice \
--allocation-strategy-spot PriceCapacityOptimized \
--capacity-preference spotMaintain
5.2 PowerShell
Connect-AzAccount
$fleet = New-AzComputeFleet `
-ResourceGroupName myFleetRG -Name myFleetCI `
-Location "WestEurope" `
-StandardTargetCapacity 5 `
-SpotTargetCapacity 20 `
-VmSizes @("Standard_D2s_v3","Standard_D4s_v3","Standard_D8s_v3") `
-SpotMaxPrice -1 `
-StandardAllocationStrategy "LowestPrice" `
-SpotAllocationStrategy "PriceCapacityOptimized" `
-SpotCapacityPreference "Maintain"
5.3 C# con SDK
var client = new ComputeManagementClient(creds) { SubscriptionId = subId };
var fleet = new Fleet("WestEurope") {
TargetDedicated = 5,
TargetSpot = 20,
VmSizes = new[] { "Standard_D2s_v3", "Standard_D4s_v3", "Standard_D8s_v3" },
SpotMaxPrice = -1,
StandardAllocationStrategy = "LowestPrice",
SpotAllocationStrategy = "PriceCapacityOptimized",
SpotCapacityPreference = "Maintain"
};
await client.Fleets.CreateOrUpdateAsync("myFleetRG","myFleetCI", fleet);
5.4 Python con Azure SDK
from azure.mgmt.compute import ComputeManagementClient
client = ComputeManagementClient(credentials, subscription_id)
fleet = client.fleets.create_or_update(
"myFleetRG", "myFleetCI",
{
"location":"westeurope",
"targetDedicated":5,
"targetSpot":20,
"vmSizes":["Standard_D2s_v3","Standard_D4s_v3","Standard_D8s_v3"],
"spotMaxPrice":-1,
"standardAllocationStrategy":"LowestPrice",
"spotAllocationStrategy":"PriceCapacityOptimized",
"spotCapacityPreference":"Maintain"
}
)
6. Integrazione con CI/CD (esempio)
Nel pipeline Azure DevOps:
- Task CLI per
az compute fleet create - Attendi Fleet readiness
- Custom script per discover VM IPs via az vm list
- Avvia test paralleli (es. chiamate via REST)
az compute fleet deleteper cleanup
7. Pro e Contro
| Aspetto | Pro | Contro / Considerazioni |
|---|---|---|
| Scalabilità | Fino a 10.000 VM, multi-regione | Quota limitata per sottoscrizione/VM type |
| Costo | Risparmi con Spot + allocation strategies | Spot eviction, delivery limitato da prezzo e capacità |
| Resilienza | Auto replace Spot, distribuzione cross-zone | Eviction policy “Delete” può eliminare dischi |
| Automazione | Un unico comando/profilo per tutto | Configurazione iniziale complessa; attributi SKU non supportati con Prioritized |
| Flessibilità | SDK in .NET, Python, REST, CLI, PowerShell | Meno granularità rispetto a VMSS su lifecycle & stateful services |
8. Conclusione & Best Practice
- Adatto per pipeline CI/CD, batch, rendering, big data, elaborazioni massive.
- Allocation consigliata: Standard → LowestPrice; Spot → PriceCapacityOptimized + maintain capacity + eviction=Deallocate.
- Suggerimento: include sempre almeno 3 SKU/zone per resilienza.
- Costi: imposta
spotMaxPrice, monitora billing. - Pulisci risorse: delete fleet post pipeline.
Luca implementa il Fleet, i test paralleli salgono da 4 a 50 VM, i build da 30 a 8 minuti, e il costo scende – risparmi del 40 % grazie agli Spot mantenuti.
Azure Compute Fleet diventa l’asse portante del suo CI/CD.
1. Scenario: Luca porta il CI/CD oltre i confini con Azure Compute Fleet
Riprendiamo la storia di Luca, che dopo il primo successo con Compute Fleet vuole spingere più in là:
- Multi‑Regione: se una regione ha limiti Spot improvvisi, Luca può distribuire il carico tra West Europe, North Europe e persino East US.
- Attribute‑based VM selection (in preview): invece di definire VM specifiche (es.
Standard_D2s_v3), Luca può richiedere risorse per attributi (4 vCPU, 8 GB RAM, SSD), e Azure sceglierà automaticamente le VM migliori disponibili — anche nuove — ottimizzando scalabilità e resilienza
2. Multi‑Regione: resilienza e latenza
Con la preview Multi-Region Compute Fleet, Luca può definire un’unica risorsa che copre più regioni. Se una zona raggiunge la saturazione, Azure sposta il provisioning altrove.
"additionalLocationsProfile": {
"locationProfiles": [
{ "location": "northeurope" },
{ "location": "eastus" }
]
}
Vantaggi:
- Maggiore disponibilità geografica
- Failover resiliente
- Prezzi Spot potenzialmente minori in regioni alternative
Contro:
- Leggero incremento della latenza interna
- Costi di rete interregionale
- Richiesta quota in ogni regione
3. Attribute‑Based VM Selection: un salto di astrazione
Luca ora sostituisce la lista di VM esplicite con una richiesta basata su attributi:
"spotPriorityProfile": {
"capacityPreference": "PriceCapacityOptimized",
"attributeBasedVmSelection": {
"minVCPUs": 4,
"minMemoryInGB": 8,
"localStorageDiskTypes": ["SSD"]
}
}
Cosa accade:
- Azure calcola le VM candidabili con ≥4 vCPU, ≥8 GB RAM e disco SSD
- Applica la strategia Spot (Price + Capacity optimized)
- Automatizza l’adozione di nuove VM generazioni
Pro:
- Maggiore flessibilità e futuro‑proofing
- Eliminazione del maintenance su SKU specifici
Contro:
- Preview: richiede iscrizione e supporto
- Minor granularità sui tipi specifici
4. ARM: infrastruttura come codice
Ecco un esempio ARM per un Fleet multi-regione con attribute‑based:
{
"$schema": "https://schema.management.azure.com/schemas/2024-11-01/Microsoft.AzureFleet/fleets.json#",
"resources": [{
"type": "Microsoft.AzureFleet/fleets",
"apiVersion": "2024-11-01",
"name": "myFleetCI",
"location": "westeurope",
"properties": {
"targetDedicated": 5,
"targetSpot": 20,
"standardAllocationStrategy": "LowestPrice",
"spotAllocationStrategy": "PriceCapacityOptimized",
"spotCapacityPreference": "Maintain",
"spotMaxPrice": -1,
"computeProfile": {
"spotPriorityProfile": {
"attributeBasedVmSelection": {
"minVCPUs": 4,
"minMemoryInGB": 8,
"localStorageDiskTypes": ["SSD"]
}
}
},
"additionalLocationsProfile": {
"locationProfiles": [
{ "location": "northeurope" },
{ "location": "eastus" }
]
}
}
}]
}
- Gestibile da CLI, PowerShell, CI/CD pipelines
5. REST API: provisioning e controllo
La stessa configurazione si applica via REST:
PUT https://management.azure.com/subscriptions/{subId}/resourceGroups/myFleetRG/providers/Microsoft.AzureFleet/fleets/myFleetCI?api-version=2024-05-01-preview
Content-Type: application/json
{ ...body identico all'ARM sopra... }
Poi, per verificare lo stato:
GET https://management.azure.com/.../fleets/myFleetCI?api-version=2024-05-01-preview
Questo consente a tool personalizzati (Go, JS, Terraform) di integrare il provisioning in CI/CD.
6. Integrazione completa: CI/CD moderna con Azure Compute Fleet
Nel pipeline Azure DevOps o GitHub Actions:
- Provision Fleet via
az deployment group create --template-file fleet.json - Attendi
provisioningState == Succeededvia REST GET - Ottieni IP delle VM, avvia test paralleli
- Rimuovi Fleet con
az group delete
Grazie a Multi‑Region e attribute‑based, Luca ottiene:
- Provisioning rapido e affidabile
- Risparmio rilevante, resilienza geografica
- Zero manutenzione su SKUs VM
7. Conclusioni & suggerimenti Azure Compute Fleet
- Multi‑Region e Attribute‑based selection migliorano disponibilità e flessibilità, ideali per carichi burst e CI/CD.
- Prevedi:
- Enroll in preview features
- Quota sufficiente in tutte le regioni
- Impostazioni Spot robuste (
Maintain,MaxPrice, eviction=Deallocate)
- Mantieni IaC con ARM/Bicep per riproducibilità e governance
1. Terraform: provisioning IaC con azapi
Azure Compute Fleet non ha al momento un provider diretto in azurerm, ma lo si può creare usando azapi_resource:
resource "azapi_resource" "fleet_ci" {
type = "Microsoft.AzureFleet/fleets@2024-11-01"
name = "myFleetCI"
location = "westeurope"
parent_id = azurerm_resource_group.rg.id
body = jsonencode({
properties = {
targetDedicated = 5
targetSpot = 20
standardAllocationStrategy = "LowestPrice"
spotAllocationStrategy = "PriceCapacityOptimized"
spotCapacityPreference = "Maintain"
spotMaxPrice = -1
additionalLocationsProfile = {
locationProfiles = [
{ location = "northeurope" },
{ location = "eastus" }
]
}
computeProfile = {
spotPriorityProfile = {
attributeBasedVmSelection = {
minVCPUs = 4
minMemoryInGB = 8
localStorageDiskTypes = ["SSD"]
}
}
}
}
})
}
Vantaggi:
- Infrastruttura ripetibile e gestibile in CI/CD
- Supporta multiflasht sourcing (Terraform + IaC nei tool DevOps)
- Può essere testato tramite
terraform planeterraform apply
2. Bicep: codice dichiarativo conciso
Ecco lo snippet completo per Bicep, basato sulle guide Azure:
resource fleet 'Microsoft.AzureFleet/fleets@2024-11-01' = {
name: 'myFleetCI'
location: 'westeurope'
properties: {
targetDedicated: 5
targetSpot: 20
standardAllocationStrategy: 'LowestPrice'
spotAllocationStrategy: 'PriceCapacityOptimized'
spotCapacityPreference: 'Maintain'
spotMaxPrice: -1
additionalLocationsProfile: {
locationProfiles: [
{ location: 'northeurope' }
{ location: 'eastus' }
]
}
computeProfile: {
spotPriorityProfile: {
attributeBasedVmSelection: {
minVCPUs: 4
minMemoryInGB: 8
localStorageDiskTypes: ['SSD']
}
}
}
}
}
Perché scegliere Bicep:
- Sintassi più pulita di ARM JSON
- Tipizzato, modulare e supportato da VS Code
- Permette versioning semantico e riutilizzo nei moduli
3. SDK Java: gestione fleet da applicazioni
Con l’Azure SDK per Java:
import com.azure.resourcemanager.computefleet.ComputeFleetManager;
import com.azure.resourcemanager.computefleet.models.*;
ComputeFleetManager fleetClient = ComputeFleetManager
.authenticate(credential, subscriptionId);
FleetInner fleet = new FleetInner()
.withLocation("westeurope")
.withTargetDedicated(5)
.withTargetSpot(20)
.withStandardAllocationStrategy("LowestPrice")
.withSpotAllocationStrategy("PriceCapacityOptimized")
.withSpotCapacityPreference("Maintain")
.withSpotMaxPrice(-1)
.withAdditionalLocationsProfile(new AdditionalLocationsProfile()
.withLocationProfiles(Arrays.asList(
new LocationProfile().withLocation("northeurope"),
new LocationProfile().withLocation("eastus")
)))
.withComputeProfile(new ComputeProfile()
.withSpotPriorityProfile(new SpotPriorityProfile()
.withAttributeBasedVmSelection(new AttributeBasedVmSelection()
.withMinVCPUs(4)
.withMinMemoryInGB(8)
.withLocalStorageDiskTypes(Arrays.asList("SSD"))
))));
fleetClient.fleets().createOrUpdate("myFleetRG", "myFleetCI", fleet);
Punti di forza:
- Ideale per tool in Java
- Estende IaC generata dinamicamente, perfetta per orchestratori microservizi
4. SDK Go: gestione fleet da servizi cloud-native
Esempio con Go e Azure SDK governato dallo stile ARM:
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computefleet/armcomputefleet"
)
cred, _ := azidentity.NewDefaultAzureCredential(nil)
client, _ := armcomputefleet.NewFleetsClient(subscriptionID, cred, nil)
params := armcomputefleet.Fleet{
Location: to.Ptr("westeurope"),
Properties: &armcomputefleet.FleetProperties{
TargetDedicated: to.Ptr,
TargetSpot: to.Ptr,
StandardAllocationStrategy: to.Ptr(armcomputefleet.StandardAllocationStrategyLowestPrice),
SpotAllocationStrategy: to.Ptr(armcomputefleet.SpotAllocationStrategyPriceCapacityOptimized),
SpotCapacityPreference: to.Ptr(armcomputefleet.SpotCapacityPreferenceMaintain),
SpotMaxPrice: to.Ptr[float64](-1),
AdditionalLocationsProfile: &armcomputefleet.AdditionalLocationsProfile{
LocationProfiles: []*armcomputefleet.LocationProfile{
{Location: to.Ptr("northeurope")},
{Location: to.Ptr("eastus")},
},
},
ComputeProfile: &armcomputefleet.ComputeProfile{
SpotPriorityProfile: &armcomputefleet.SpotPriorityProfile{
AttributeBasedVmSelection: &armcomputefleet.AttributeBasedVmSelection{
MinVCPUs: to.Ptr,
MinMemoryInGB: to.Ptr,
LocalStorageDiskTypes: []*string{to.Ptr("SSD")},
},
},
},
},
}
client.BeginCreateOrUpdate(context.Background(), "myFleetRG", "myFleetCI", params, nil)
Perché Go:
- Perfetto per infrastrutture cloud nativa in Kubernetes, microservices, pipelines
- Genera fleets dinamicamente chiamando API ARM via Go
5. Confronto tra gli approcci per Azure Compute Fleet
| Approccio | Ideale per | Pro | Contro |
|---|---|---|---|
| Terraform | Infrastruttura gestita separatamente da CI | Declarativo CI friendly | Dipende da azapi anziché provider nativo |
| Bicep | Replicabilità, sviluppo DevOps | Leggero e modulare | Richiede toolchain e controllo versione |
| Java SDK | Tooling enterprise, orchestratori, GUI | Completo e tipizzato | Boilerplate Java |
| Go SDK | Cloud-native, operator Kubernetes, microservizi | Integrato con container | Gestione del contesto e autenticazioni |
| REST/CLI/PowerShell | Scripting rapido, interattivo, pipeline leggeri | Flessibile e scriptabile | Meno integrazione strutturata |
6. Raccomandazioni finali Azure Compute Fleet
- Usa Bicep o Terraform per definizione stabile della infrastruttura in CI/CD
- Integra Java o Go SDK per tool custom o app aziendali che gestiscono il ciclo vita Fleet dinamicamente
- Mantieni la configurazione Spot con
Maintain,PriceCapacityOptimized,MaxPricee attribute-based per massima efficienza e resilienza - Controlla sempre quote per ogni regione utilizzata (“West-Europe”, “North-Europe”, “East-US”)
Innovaformazione, scuola informatica specialistica segue costantemente i trend di mercato ed affianca le aziende nella formazione del personale IT. Trovate l’offerta formativa a catalogo sul nostro sito QUI.
Se l’azienda cliente aderisce a Fondimpresa o ad altro fondo, possiamo seguire anche il progetto di formazione finanziata ottenendo il rimborso completo dei costi per la formazione.
INFO: info@innovaformazione.net – Tel. 3471012275 (Dario Carrassi)
Articoli correlati
Claude Code per i droni
Claude Code e Migrazioni SAP
Claude Code controllo remoto
Opportunità Carriera Contabilità SAP
Guida SIA AI
