Cosa è Azure Compute Fleet

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:

  1. Builda il progetto .NET
  2. Avvia decine di container VM per test paralleli
  3. 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:

  1. Task CLI per az compute fleet create
  2. Attendi Fleet readiness
  3. Custom script per discover VM IPs via az vm list
  4. Avvia test paralleli (es. chiamate via REST)
  5. az compute fleet delete per cleanup

7. Pro e Contro

AspettoProContro / Considerazioni
ScalabilitàFino a 10.000 VM, multi-regione Quota limitata per sottoscrizione/VM type
CostoRisparmi con Spot + allocation strategiesSpot eviction, delivery limitato da prezzo e capacità
ResilienzaAuto replace Spot, distribuzione cross-zoneEviction policy “Delete” può eliminare dischi
AutomazioneUn unico comando/profilo per tuttoConfigurazione iniziale complessa; attributi SKU non supportati con Prioritized
FlessibilitàSDK in .NET, Python, REST, CLI, PowerShellMeno 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:

  1. Provision Fleet via az deployment group create --template-file fleet.json
  2. Attendi provisioningState == Succeeded via REST GET
  3. Ottieni IP delle VM, avvia test paralleli
  4. 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 plan e terraform 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

ApproccioIdeale perProContro
TerraformInfrastruttura gestita separatamente da CIDeclarativo CI friendlyDipende da azapi anziché provider nativo
BicepReplicabilità, sviluppo DevOpsLeggero e modulareRichiede toolchain e controllo versione
Java SDKTooling enterprise, orchestratori, GUICompleto e tipizzatoBoilerplate Java
Go SDKCloud-native, operator Kubernetes, microserviziIntegrato con containerGestione del contesto e autenticazioni
REST/CLI/PowerShellScripting rapido, interattivo, pipeline leggeriFlessibile e scriptabileMeno 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, MaxPrice e attribute-based per massima efficienza e resilienza
  • Controlla sempre quote per ogni regione utilizzata (“West-Europe”, “North-Europe”, “East-US”)

(fonte) (fonte) (fonte)

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)

Ti potrebbe interessare

Articoli correlati