Condividi tramite


Come proteggere un ambiente di inferenza di Azure Machine Learning con reti virtuali (v1).

SI APPLICA A: Python SDK azureml v1

SI APPLICA A: Estensione ML dell’interfaccia della riga di comando di Azure v1

Il presente articolo illustra come proteggere gli ambienti di inferenza con una rete virtuale in Azure Machine Learning. Questo articolo riguarda in modo specifico il flusso di lavoro di distribuzione di un modello come servizio web attraverso SDK/CLI v1.

Suggerimento

Questo articolo fa parte di una serie di articoli sulla protezione di un flusso di lavoro di Azure Machine Learning. Vedi gli altri articoli di questa serie:

Per un'esercitazione sulla creazione di un'area di lavoro sicura, vedere Esercitazione: Creare un'area di lavoro sicura, Modello Bicep o Terraform template (Modello Terraform).

Il presente articolo illustra come proteggere le seguenti risorse di inferenza in una rete virtuale:

  • Cluster predefinito del servizio Azure Kubernetes
  • Cluster del servizio Azure Kubernetes privato
  • Cluster del servizio Azure Kubernetes con collegamento privato

Prerequisiti

  • Per comprendere gli scenari di rete virtuale comuni e l'architettura complessiva della rete virtuale leggere l'articolo Panoramica della sicurezza di rete.

  • Una rete virtuale e una subnet esistenti da usare con le risorse di calcolo.

  • Per distribuire le risorse in una rete virtuale o in una subnet, il tuo account utente deve disporre delle autorizzazioni per eseguire le seguenti azioni nel controllo degli accessi in base al ruolo di Azure:

    • "Microsoft.Network/*/read" nella risorsa della rete virtuale. Questa autorizzazione non è necessaria per le distribuzioni di modelli di Azure Resource Manager (ARM).
    • "Microsoft.Network/virtualNetworks/join/action" nella risorsa della rete virtuale.
    • "Microsoft.Network/virtualNetworks/subnets/join/action" nella risorsa della subnet.

    Per altre informazioni sul controllo degli accessi in base al ruolo di Azure con la rete, vedere Ruoli predefiniti di rete.

Importante

Alcuni comandi dell'interfaccia della riga di comando (CLI) di Azure in questo articolo usano l'estensione azure-cli-ml, o v1, per Azure Machine Learning. L'assistenza per l'estensione v1 terminerà il 30 settembre 2025. Sarà possibile installare e usare l'estensione v1 fino a tale data.

Consigliamo di passare all'estensione ml, o v2, prima del 30 settembre 2025. Per altre informazioni sull'estensione v2, vedi Estensione dell'interfaccia della riga di comando di Azure ML e Python SDK v2.

Limiti

Istanze di Azure Container

Quando l'area di lavoro di Azure Machine Learning è configurata con un endpoint privato, la distribuzione in Istanze di Azure Container in una rete virtuale non è supportata. Provare invece a usare un endpoint online gestito con isolamento di rete.

Servizio Azure Kubernetes

  • Se il cluster del servizio Azure Kubernetes si trova dietro una rete virtuale, l'area di lavoro e le relative risorse associate (archiviazione, insieme di credenziali delle chiavi, Registro Azure Container) devono avere degli endpoint privati o degli endpoint di servizio nella stessa rete virtuale o rete virtuale come rete virtuale del cluster del servizio Azure Kubernetes. Leggi l'esercitazione Creare un'area di lavoro protetta per aggiungere tali endpoint privati o endpoint servizio alla rete virtuale.
  • Se l'area di lavoro ha un endpoint privato, il cluster del servizio Azure Kubernetes deve trovarsi nella stessa area di Azure dell'area di lavoro.
  • L'utilizzo di un nome di dominio completo (FQDN) pubblico con un cluster del servizio Azure Kubernetes privatonon è supportato con Azure Machine Learning.

Servizio Azure Kubernetes

Importante

Per usare un cluster del servizio Azure Kubernetes in una rete virtuale, prima segui i prerequisiti descritti in Configurare la rete avanzata nel servizio Azure Kubernetes (AKS).

Per usare il servizio Azure Kubernetes all'area di lavoro, segui questa procedura:

  1. Accedere ad Azure Machine Learning Studio, quindi selezionare la sottoscrizione e l'area di lavoro.

  2. SelezionaCalcolo a sinistra, Cluster di inferenza al centro e successivamente seleziona + Nuovo. Infine, seleziona AksCompute.

    Screenshot della finestra di dialogo Crea cluster di inferenza.

  3. Nella finestra di dialogo Crea aksCompute seleziona Crea nuovo, Percorso e dimensioni della macchina virtuale da usare per il cluster. Infine, seleziona Avanti.

    Screenshot delle impostazioni della macchina virtuale.

  4. Nella sezione Configura impostazioni immetti un Nome del calcolo, seleziona lo Scopo del cluster, il Numero di nodie quindi seleziona Avanzato per visualizzare le impostazioni di rete. Nell'area Configura rete virtuale imposta i seguenti i valori:

    • Imposta la Rete virtuale da usare.

      Suggerimento

      Se l'area di lavoro usa un endpoint privato per connettersi alla rete virtuale, il campo per la selezione della Rete virtuale è disattivato.

    • Imposta la subnet in cui creare il cluster.

    • Nel campo Intervallo di indirizzi del servizio Kubernetes immetti l'intervallo di indirizzi del servizio Kubernetes. Questo intervallo di indirizzi usa un indirizzo IP in notazione CIDR (Classless Inter-Domain Routing) per definire gli indirizzi IP disponibili per il cluster. Non deve sovrapporsi a nessun intervallo IP della subnet, ad esempio 10.0.0.0/16.

    • Nel campo Indirizzo IP del servizio DNS di Kubernetes immetti l'indirizzo IP del servizio DNS di Kubernetes. Questo indirizzo IP viene assegnato al servizio DNS di Kubernetes. Deve essere compreso nell'intervallo di indirizzi del servizio Kubernetes, ad esempio 10.0.0.10.

    • Nel campo Indirizzo del bridge Docker immetti l'indirizzo del bridge Docker. Questo indirizzo IP viene assegnato al bridge Docker. Non deve essere compreso in nessun intervallo IP della subnet o l'intervallo di indirizzi del servizio Kubernetes, ad esempio 172.18.0.1/16.

    Screenshot della configurazione le impostazioni di rete.

  5. Quando si distribuisce un modello come servizio Web nel servizio Azure Kubernetes, viene creato un endpoint di assegnazione dei punteggi per gestire le richieste di inferenza. Assicurati che il gruppo di sicurezza di rete (NSG) che controlla la rete virtuale disponga di una regola di sicurezza in ingresso abilitata per l'indirizzo IP dell'endpoint di assegnazione dei punteggi se vuoi chiamarlo dall'esterno della rete virtuale.

    Per trovare l'indirizzo IP dell'endpoint di assegnazione dei punteggi, esamina l'URI di assegnazione dei punteggi per il servizio distribuito. Per informazioni sulla visualizzazione dell'URI di assegnazione dei punteggi, vedi Utilizzare un modello distribuito come servizio Web.

    Importante

    Mantenere le regole in uscita predefinite per il gruppo di sicurezza di rete. Per altre informazioni, vedere le regole di sicurezza predefinite in Gruppi di sicurezza.

    Screenshot che mostra una regola di sicurezza in ingresso.

    Importante

    L'indirizzo IP mostrato nell'immagine per l'endpoint di assegnazione dei punteggi sarà diverso per le distribuzioni. Mentre lo stesso IP è condiviso da tutte le distribuzioni in un cluster del servizio Azure Kubernetes, ciascun cluster di questo servizio avrà un indirizzo IP diverso.

È anche possibile usare Azure Machine Learning SDK per aggiungere il servizio Azure Kubernetes in una rete virtuale. Se è già presente un cluster del servizio Azure Kubernetes in una rete virtuale, collegarlo all'area di lavoro come descritto nell'articolo relativo alla distribuzione nel servizio Azure Kubernetes. Il codice seguente crea una nuova istanza del servizio Azure Kubernetes nella subnet default di una rete virtuale denominata mynetwork:

Si applica a: Python SDK azureml v1

from azureml.core.compute import ComputeTarget, AksCompute

# Create the compute configuration and set virtual network information
config = AksCompute.provisioning_configuration(location="eastus2")
config.vnet_resourcegroup_name = "mygroup"
config.vnet_name = "mynetwork"
config.subnet_name = "default"
config.service_cidr = "10.0.0.0/16"
config.dns_service_ip = "10.0.0.10"
config.docker_bridge_cidr = "172.17.0.1/16"

# Create the compute target
aks_target = ComputeTarget.create(workspace=ws,
                                  name="myaks",
                                  provisioning_configuration=config)

Al termine del processo di creazione, è possibile eseguire l'inferenza o il calcolo del modello in un cluster del servizio Azure Kubernetes in una rete virtuale. Per altre informazioni, vedere Come eseguire la distribuzione nel servizio Azure Kubernetes.

Per altre informazioni sull'uso del Controllo degli accessi in base al ruolo con Kubernetes, vedi Usare il Controllo degli accessi in base al ruolo di Azure per l'autorizzazione di Kubernetes

Ruolo di collaboratore di rete

Importante

Se si crea o si collega un cluster del servizio Azure Kubernetes fornendo una rete virtuale creata in precedenza, è necessario concedere all'entità servizio (SP) o all'identità gestita per il cluster del servizio Azure Kubernetes il ruolo di collaboratore di rete al gruppo di risorse che contiene la rete virtuale.

Per aggiungere l'identità come collaboratore di rete, segui questa procedura:

  1. Per trovare l’ID dell'entità servizio o dell’identità gestita per il servizio Azure Kubernetes, usa i seguenti comandi dell'interfaccia della riga di comando di Azure. Sostituire <aks-cluster-name> con il nome del cluster. Sostituisci <resource-group-name> con il nome del gruppo di risorse che contiene il cluster del servizio Azure Kubernetes:

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query servicePrincipalProfile.clientId
    

    Se questo comando restituisce un valore di msi, usa il comando seguente per identificare l'ID principale dell'identità gestita:

    az aks show -n <aks-cluster-name> --resource-group <resource-group-name> --query identity.principalId
    
  2. Per trovare l'ID del gruppo di risorse che contiene la rete virtuale, usa il comando seguente. Sostituisci <resource-group-name> con il nome del gruppo di risorse che contiene la rete virtuale:

    az group show -n <resource-group-name> --query id
    
  3. Per aggiungere l'entità servizio o l'identità gestita come collaboratore di rete, usa il comando seguente. Sostituisci <SP-or-managed-identity> con l'ID restituito per l'entità servizio o l'identità gestita. Sostituisci <resource-group-id> con l'ID restituito per il gruppo di risorse che contiene la rete virtuale:

    az role assignment create --assignee <SP-or-managed-identity> --role 'Network Contributor' --scope <resource-group-id>
    

Per altre informazioni sull'uso del bilanciamento del carico interno con il servizio Azure Kubernetes, vedere l'articolo sull'uso del bilanciamento del carico interno con il servizio Azure Kubernetes.

Protezione del traffico della rete virtuale

Esistono due modi per isolare il traffico da e verso il cluster del servizio Azure Kubernetes e la rete virtuale.

  • Cluster del servizio Azure Kubernetes privato: questo approccio usa il collegamento privato di Azure per proteggere le comunicazioni con il cluster per le operazioni di distribuzione/gestione.
  • Servizio di bilanciamento del carico interno del servizio Azure Kubernetes: questo approccio configura l'endpoint per le distribuzioni nel servizio Azure Kubernetes per l'uso di un indirizzo IP privato all'interno della rete virtuale.

Cluster del servizio Azure Kubernetes privato

Per impostazione predefinita, i cluster del servizio Azure Kubernetes hanno un piano di controllo o un server API con indirizzi IP pubblici. È possibile configurare il servizio Azure Kubernetes per l'uso di un piano di controllo privato creando un cluster del servizio Azure Kubernetes privato. Per altre informazioni, vedere Creare un cluster privato del servizio Azure Kubernetes.

Dopo aver creato il cluster del servizio Azure Kubernetes privato, collega il cluster alla rete virtuale da usare con Azure Machine Learning.

Servizio di bilanciamento del carico del servizio Azure Kubernetes interno

Per impostazione predefinita, le distribuzioni del servizio Azure Kubernetes usano un servizio di bilanciamento del carico pubblico. In questa sezione viene illustrato come configurare il servizio Azure Kubernetes per l'uso di un servizio di bilanciamento del carico interno. Un servizio di bilanciamento del carico interno (o privato) viene usato solo quando gli indirizzi IP privati sono ammessi come front-end. I servizi di bilanciamento del carico interni vengono usati per bilanciare il carico all'interno di una rete virtuale.

Un bilanciamento del carico privato viene abilitato configurando il servizio Azure Kubernetes per l'uso di un bilanciamento del carico interno.

Abilitazione del bilanciamento del carico privato

Importante

Non è possibile abilitare l'indirizzo IP privato durante la creazione del cluster del servizio Azure Kubernetes nello studio di Azure Machine Learning. È possibile crearne uno con un servizio di bilanciamento del carico interno quando si usa Python SDK o l'estensione dell'interfaccia della riga di comando di Azure per Machine Learning.

Gli esempi seguenti dimostrano come creare un nuovo cluster del servizio Azure Kubernetes con un servizio di bilanciamento del carico interno/IP privato usando l'SDK e l'interfaccia della riga di comando:

SI APPLICA A: Python SDK azureml v1

import azureml.core
from azureml.core.compute import AksCompute, ComputeTarget

# Verify that cluster does not exist already
try:
    aks_target = AksCompute(workspace=ws, name=aks_cluster_name)
    print("Found existing aks cluster")

except:
    print("Creating new aks cluster")

    # Subnet to use for AKS
    subnet_name = "default"
    # Create AKS configuration
    prov_config=AksCompute.provisioning_configuration(load_balancer_type="InternalLoadBalancer")
    # Set info for existing virtual network to create the cluster in
    prov_config.vnet_resourcegroup_name = "myvnetresourcegroup"
    prov_config.vnet_name = "myvnetname"
    prov_config.service_cidr = "10.0.0.0/16"
    prov_config.dns_service_ip = "10.0.0.10"
    prov_config.subnet_name = subnet_name
    prov_config.load_balancer_subnet = subnet_name
    prov_config.docker_bridge_cidr = "172.17.0.1/16"

    # Create compute target
    aks_target = ComputeTarget.create(workspace = ws, name = "myaks", provisioning_configuration = prov_config)
    # Wait for the operation to complete
    aks_target.wait_for_completion(show_output = True)

Quando colleghi un cluster esistente all'area di lavoro, usa i parametriload_balancer_type e load_balancer_subnet di AksCompute.attach_configuration() per configurare il servizio di bilanciamento del carico.

Per informazioni sul collegamento di un cluster, vedere Collegare un cluster del servizio Azure Kubernetes esistente.

Limitare la connettività in uscita dalla rete virtuale

Se vuoi usare le regole in uscita predefinite e vuoi limitare l'accesso in uscita della rete virtuale, è necessario consentire l'accesso al Registro Azure Container. Ad esempio, assicurati che i gruppi di sicurezza di rete (NSG) contengano una regola che consenta l'accesso al tag del servizioAzureContainerRegistry.RegionName dove '{RegionName} è il nome di un'area di Azure.

Passaggi successivi

Il presente articolo fa parte di una serie di articoli sulla protezione del flusso di lavoro di Azure Machine Learning. Vedi gli altri articoli di questa serie: