Montare un file system virtuale su un pool Batch

Azure Batch supporta il montaggio dell'archiviazione cloud o di un file system esterno nei nodi di calcolo Windows o Linux nei pool di Batch. Quando un nodo di calcolo viene aggiunto al pool, il file system virtuale monta e funge da unità locale in tale nodo. Questo articolo illustra come montare un file system virtuale in un pool di nodi di calcolo usando la libreria di gestione batch per .NET.

Il montaggio del file system nel pool semplifica l'accesso ai dati ed è più efficiente rispetto alla richiesta di attività per ottenere i propri dati da un set di dati condiviso di grandi dimensioni. Si consideri uno scenario in cui più attività devono accedere a un set comune di dati, ad esempio il rendering di un filmato. Ogni attività esegue il rendering di uno o più fotogrammi contemporaneamente dai file della scena. Montando un'unità che contiene i file della scena, è più semplice per ogni nodo di calcolo accedere ai dati condivisi.

È anche possibile scegliere il file system sottostante per soddisfare le prestazioni, in tutte le operazioni di input/output al secondo (IOPS). È possibile ridimensionare in modo indipendente il file system in base al numero di nodi di calcolo che accedono simultaneamente ai dati.

Ad esempio, è possibile usare una cache in memoria distribuita di Avere vFXT per supportare rendering su larga scala di film con migliaia di nodi di rendering simultanei che accedono ai dati di origine locali. In alternativa, per i dati già presenti nell'archivio BLOB basato sul cloud, è possibile usare BlobFuse per montare i dati come file system locale. File di Azure fornisce un flusso di lavoro simile a quello di BlobFuse ed è disponibile sia in Windows che in Linux.

Configurazioni supportate

È possibile montare i tipi di file system seguenti:

  • File di Azure
  • Archivio BLOB di Azure
  • Network File System (NFS), inclusa una cache Avere vFXT
  • Common Internet File System (CIFS)

Batch supporta i tipi di file system virtuali seguenti per gli agenti nodo prodotti per il rispettivo editore e offerta.

OS Type (Tipo di sistema operativo) Condivisione di File di Azure Contenitore BLOB di Azure Montaggio NFS Montaggio CIFS
Linux ✔️ ✔️ ✔️ ✔️
Windows ✔️

Nota

Il montaggio di un file system virtuale non è supportato nei pool di Batch creati prima dell'8 agosto 2019.

Requisiti di rete

Quando si usano i montaggi di file virtuali con i pool di Batch in una rete virtuale, tenere presenti i requisiti seguenti e assicurarsi che non venga bloccato alcun traffico necessario. Per altre informazioni, vedere Pool di Batch in una rete virtuale.

  • File di Azure condivisioni richiedono che la porta TCP 445 sia aperta per il traffico da e verso il tag del storage servizio. Per altre informazioni, vedere Usare una condivisione file di Azure con Windows.

  • I contenitori BLOB di Azure richiedono che la porta TCP 443 sia aperta per il traffico da e verso il tag del storage servizio. Le macchine virtuali devono avere accesso a https://packages.microsoft.com per scaricare i blobfuse pacchetti e gpg . A seconda della configurazione, potrebbe essere necessario accedere ad altri URL.

  • Per impostazione predefinita, Network File System (NFS) richiede l'accesso alla porta 2049. La configurazione potrebbe avere altri requisiti. Le macchine virtuali devono avere accesso alla gestione pacchetti appropriata per scaricare i nfs-common pacchetti (per Debian o Ubuntu). L'URL può variare in base alla versione del sistema operativo. A seconda della configurazione, potrebbe essere necessario anche accedere ad altri URL.

    Il montaggio di BLOB di Azure o File di Azure tramite NFS potrebbe avere più requisiti di rete. Ad esempio, i nodi di calcolo potrebbero dover usare la stessa subnet di rete virtuale dell'account di archiviazione.

  • Common Internet File System (CIFS) richiede l'accesso alla porta TCP 445. Per scaricare il cifs-utils pacchetto, le macchine virtuali devono avere accesso alla gestione pacchetti appropriata. L'URL può variare in base alla versione del sistema operativo.

Configurazione e implementazione del montaggio

Il montaggio di un file system virtuale in un pool rende disponibile il file system per ogni nodo di calcolo del pool. La configurazione per il file system si verifica quando un nodo di calcolo aggiunge un pool, riavvia o viene ricreata l'immagine.

Per montare un file system in un pool, creare un oggetto MountConfiguration che corrisponda al file system virtuale: AzureBlobFileSystemConfiguration, AzureFileShareConfiguration, NfsMountConfigurationo CifsMountConfiguration.

Per tutti gli oggetti di configurazione di montaggio sono necessari i parametri di base seguenti. Alcune configurazioni di montaggio hanno parametri specifici per il file system specifico, che gli esempi di codice presenti in modo più dettagliato.

  • Nome dell'account o origine dell'account di archiviazione.

  • Percorso di montaggio relativo o origine, percorso del file system da montare sul nodo di calcolo, rispetto alla directory standard \fsmounts accessibile tramite AZ_BATCH_NODE_MOUNTS_DIR.

    Il percorso esatto della directory \fsmounts varia a seconda del sistema operativo del nodo. Ad esempio, il percorso in un nodo Ubuntu viene mappato a mnt\batch\tasks\fsmounts.

  • Opzioni di montaggio o opzioni BlobFuse che descrivono parametri specifici per il montaggio di un file system.

Quando si crea il pool e l'oggetto MountConfiguration , si assegna l'oggetto alla MountConfigurationList proprietà . Il montaggio per il file system si verifica quando un nodo viene aggiunto al pool, riavvia o viene ricreata l'immagine.

L'agente Batch implementa il montaggio in modo diverso in Windows e Linux.

  • In Linux Batch installa il pacchetto cifs-utils. Batch rilascia quindi il comando di montaggio.

  • In Windows Batch usa cmdkey per aggiungere le credenziali dell'account Batch. Batch invia quindi il comando di montaggio tramite net use. Ad esempio:

    net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
    

Il montaggio del file system crea una variabile AZ_BATCH_NODE_MOUNTS_DIRdi ambiente , che punta al percorso del file system montato e dei file di log. È possibile usare i file di log per la risoluzione dei problemi e il debug.

Montare una condivisione File di Azure con PowerShell

È possibile usare Azure PowerShell per montare una condivisione File di Azure in un pool di Batch Windows o Linux. La procedura seguente illustra come configurare e montare un file system di condivisione file di Azure in un pool di Batch.

Importante

Il numero massimo di file system montati in un pool è 10. Per informazioni dettagliate e altri limiti, vedere Quote e limiti del servizio Batch.

Prerequisiti

  • Un account Azure con una sottoscrizione attiva.
  • Azure PowerShell installato o usare Azure Cloud Shell e selezionare PowerShell per l'interfaccia.
  • Un account Batch esistente con un account Archiviazione di Azure collegato con una condivisione file.
  1. Accedere alla sottoscrizione di Azure, sostituendo il segnaposto con l'ID sottoscrizione.

    Connect-AzAccount -Subscription "<subscription-ID>"
    
  2. Ottenere il contesto per l'account Batch. Sostituire il segnaposto con il <batch-account-name> nome dell'account Batch.

    $context = Get-AzBatchAccount -AccountName <batch-account-name>
    
  3. Creare un pool di Batch con le impostazioni seguenti. Sostituire i <storage-account-name> segnaposto , <storage-account-key>e <file-share-name> con i valori dell'account di archiviazione collegato all'account Batch. Sostituire il <pool-name> segnaposto con il nome desiderato per il pool.

    Lo script seguente crea un pool con un nodo Windows Server 2016 Datacenter, Standard_D2_V2 dimensione e quindi monta la condivisione file di Azure nell'unità S del nodo.

    $fileShareConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSAzureFileShareConfiguration" -ArgumentList @("<storage-account-name>", "https://<storage-account-name>.file.core.windows.net/batchfileshare1", "S", "<storage-account-key>")
    
    $mountConfig = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSMountConfiguration" -ArgumentList @($fileShareConfig)
    
    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1 -MountConfiguration @($mountConfig) -BatchContext $context
    
  4. Connettersi al nodo e verificare che il file di output sia corretto.

Accedere ai file montati

Le attività di Azure Batch possono accedere ai file montati usando il percorso diretto dell'unità, ad esempio:

cmd /c "more S:\folder1\out.txt & timeout /t 90 > NULL"

L'agente di Azure Batch concede l'accesso solo per le attività di Azure Batch. Se si usa Remote Desktop Protocol (RDP) per connettersi al nodo, l'account utente non ha accesso automatico all'unità di montaggio. Quando ci si connette al nodo tramite RDP, è necessario aggiungere le credenziali per l'account di archiviazione per accedere direttamente all'unità S .

Usare cmdkey per aggiungere le credenziali. Sostituire i <storage-account-name> segnaposto e <storage-account-key> con le proprie informazioni.

cmdkey /add:"<storage-account-name>.file.core.windows.net" /user:"Azure\<storage-account-name>" /pass:"<storage-account-key>"

Risolvere i problemi di montaggio

Se una configurazione di montaggio non riesce, il nodo di calcolo ha esito negativo e lo stato del nodo è impostato su Unusable. Per diagnosticare un errore di configurazione del montaggio, esaminare la proprietà ComputeNodeError per informazioni dettagliate sull'errore.

Per ottenere i file di log per il debug, è possibile usare l'API OutputFiles per caricare i file *.log . I file *.log contengono informazioni sul montaggio del file system nel AZ_BATCH_NODE_MOUNTS_DIR percorso. I file di log di montaggio hanno il formato: <type-mountDirOrDrive><>.log per ogni montaggio. Ad esempio, un montaggio CIFS in una directory di montaggio denominata test ha un file di log di montaggio denominato: cifs-test.log.

Analizzare gli errori di montaggio

È possibile usare RDP o SSH per il nodo per controllare i file di log relativi ai montaggi del file system. Il messaggio di errore di esempio seguente è possibile quando si tenta di montare una condivisione file di Azure in un nodo Batch:

Mount Configuration Error | An error was encountered while configuring specified mount(s)
Message: System error (out of memory, cannot fork, no more loop devices)
MountConfigurationPath: S

Se viene visualizzato questo errore, RDP o SSH al nodo per controllare i file di log correlati. L'agente Batch implementa il montaggio in modo diverso in Windows e Linux per le condivisioni file di Azure. In Linux Batch installa il pacchetto cifs-utils. Batch rilascia quindi il comando di montaggio. In Windows Batch usa cmdkey per aggiungere le credenziali dell'account Batch. Batch invia quindi il comando di montaggio tramite net use. Ad esempio:

net use S: \\<storage-account-name>.file.core.windows.net\<fileshare> /u:AZURE\<storage-account-name> <storage-account-key>
  1. Connettersi al nodo tramite RDP.

  2. Aprire il file di log fshare-S.log, in D:\batch\tasks\fsmounts.

  3. Esaminare i messaggi di errore, ad esempio:

    CMDKEY: Credential added successfully.
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  4. Risolvere il problema usando lo strumento di risoluzione dei problemi delle condivisioni file di Azure.

Se non è possibile usare RDP o SSH per controllare i file di log nel nodo, è possibile caricare i log nell'account di archiviazione di Azure. È possibile usare questo metodo per i log di Windows e Linux.

  1. Nella portale di Azure cercare e selezionare l'account Batch con il pool.

  2. Nella pagina Account Batch selezionare Pool nel riquadro di spostamento a sinistra.

  3. Nella pagina Pool selezionare il nome del pool.

  4. Nella pagina del pool selezionare Nodi nel riquadro di spostamento a sinistra.

  5. Nella pagina Nodi selezionare il nome del nodo.

  6. Nella pagina del nodo selezionare Carica log batch.

  7. Nel riquadro Carica log batch selezionare Seleziona contenitore di archiviazione.

  8. Nella pagina Account di archiviazione selezionare un account di archiviazione.

  9. Nella pagina Contenitori selezionare o creare un contenitore in cui caricare i file e selezionare Seleziona.

  10. Selezionare Avvia caricamento.

  11. Al termine del caricamento, scaricare i file e aprire agent-debug.log.

  12. Esaminare i messaggi di errore, ad esempio:

    ..20210322T113107.448Z.00000000-0000-0000-0000-000000000000.ERROR.agent.mount.filesystems.basefilesystem.basefilesystem.py.run_cmd_persist_output_async.59.2912.MainThread.3580.Mount command failed with exit code: 2, output:
    
    CMDKEY: Credential added successfully.
    
    System error 86 has occurred.
    
    The specified network password is not correct.
    
  13. Risolvere il problema usando lo strumento di risoluzione dei problemi delle condivisioni file di Azure.

Montare manualmente una condivisione file con PowerShell

Se non è possibile diagnosticare o correggere gli errori di montaggio, è possibile usare PowerShell per montare manualmente la condivisione file.

  1. Creare un pool senza una configurazione di montaggio. Ad esempio:

    $imageReference = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSImageReference" -ArgumentList @("WindowsServer", "MicrosoftWindowsServer", "2016-Datacenter", "latest")
    
    $configuration = New-Object -TypeName "Microsoft.Azure.Commands.Batch.Models.PSVirtualMachineConfiguration" -ArgumentList @($imageReference, "batch.node.windows amd64")
    
    New-AzBatchPool -Id "<pool-name>" -VirtualMachineSize "STANDARD_D2_V2" -VirtualMachineConfiguration $configuration -TargetDedicatedComputeNodes 1  -BatchContext $Context
    
  2. Attendere che il nodo sia nello stato inattiva .

  3. Nella portale di Azure cercare e selezionare l'account di archiviazione con la condivisione file.

  4. Nel menu della pagina dell'account di archiviazione selezionare Condivisioni file nel riquadro di spostamento a sinistra.

  5. Nella pagina Condivisioni file selezionare la condivisione file da montare.

  6. Nella pagina della condivisione file selezionare Connetti.

  7. Nel riquadro Connetti selezionare la scheda Windows.

  8. Per Lettera di unità immettere l'unità che si vuole usare. Il valore predefinito è Z.

  9. Per Metodo di autenticazione selezionare la modalità di connessione alla condivisione file.

  10. Selezionare Mostra script e copiare lo script di PowerShell per il montaggio della condivisione file.

  11. Connettersi al nodo tramite RDP.

  12. Eseguire il comando copiato per montare la condivisione file.

  13. Prendere nota di eventuali messaggi di errore nell'output. Usare queste informazioni per risolvere eventuali problemi correlati alla rete.

Configurazioni di montaggio di esempio

Le configurazioni di esempio di codice seguenti illustrano il montaggio di vari file share system in un pool di nodi di calcolo.

Condivisione di File di Azure

File di Azure è l'offerta standard di file system cloud di Azure. La configurazione seguente monta una condivisione File di Azure denominata <file-share-name> nell'unità S. Per informazioni sui parametri nell'esempio, vedere Montare una condivisione file di Azure SMB in Windows o Creare una condivisione file di Azure NFS e montarla in una macchina virtuale Linux usando il portale di Azure.

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureFileShareConfiguration = new AzureFileShareConfiguration
            {
                AccountName = "<storage-account-name>",
                AzureFileUrl = "https://<storage-account-name>.file.core.windows.net/<file-share-name>",
                AccountKey = "<storage-account-key>",
                RelativeMountPath = "S",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,sec=ntlmssp"
            },
        }
    }
}

Contenitore BLOB di Azure

Un'altra opzione consiste nell'usare l'archiviazione BLOB di Azure tramite BlobFuse. Il montaggio di un file system BLOB richiede una chiave dell'account, una chiave di firma di accesso condiviso o un'identità gestita con accesso all'account di archiviazione.

Per informazioni su come ottenere queste chiavi o identità, vedere gli articoli seguenti:

La configurazione seguente monta un file system BLOB con le opzioni BlobFuse. A scopo illustrativo, l'esempio mostra AccountKey, SasKey e IdentityReference, ma in realtà è possibile specificare solo uno di questi metodi.

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            AzureBlobFileSystemConfiguration = new AzureBlobFileSystemConfiguration
            {
                AccountName = "<storage-account-name>",
                ContainerName = "<container-name>",
                // Use only one of the following three lines:
                AccountKey = "<storage-account-key>",
                SasKey = "<sas-key>",
                IdentityReference = new ComputeNodeIdentityReference("/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>"),
                RelativeMountPath = "<relative-mount-path>",
                BlobfuseOptions = "-o attr_timeout=240 -o entry_timeout=240 -o negative_timeout=120 "
            },
        }
    }
}

Per ottenere l'accesso predefinito alla directory montata BlobFuse, eseguire l'attività come amministratore. BlobFuse monta la directory nello spazio utente e alla creazione del pool la directory viene montata come radice. In Linux tutte le attività di amministratore sono radice. La pagina di riferimento FUSE descrive tutte le opzioni per il modulo FUSE.

Per altre informazioni e suggerimenti sull'uso di BlobFuse, vedere i riferimenti seguenti:

NFS

È possibile montare condivisioni NFS nei nodi del pool per consentire a Batch di accedere ai file system tradizionali. La configurazione può essere un singolo server NFS distribuito nel cloud o un server NFS locale a cui si accede tramite una rete virtuale. I montaggi NFS supportano Avere vFXT, una cache distribuita in memoria per attività HPC (High Performance Computing) a elevato utilizzo di dati. I montaggi NFS supportano anche altre interfacce conformi a NFS standard, ad esempio NFS per BLOB di Azure e NFS per File di Azure.

L'esempio seguente illustra una configurazione per un montaggio del file system NFS:

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            NfsMountConfiguration = new NFSMountConfiguration
            {
                Source = "<source>",
                RelativeMountPath = "<relative-mount-path>",
                MountOptions = "options ver=3.0"
            },
        }
    }
}

CIFS

Il montaggio di CIFS nei nodi del pool è un altro modo per fornire l'accesso ai file system tradizionali. CIFS è un protocollo di condivisione file che offre un meccanismo aperto e multipiattaforma per la richiesta di file e servizi del server di rete. CIFS si basa sulla versione avanzata del protocollo SMB per la condivisione di file Internet e Intranet.

Nell'esempio seguente viene illustrata una configurazione per un montaggio di file CIFS.

new PoolAddParameter
{
    Id = poolId,
    MountConfiguration = new[]
    {
        new MountConfiguration
        {
            CifsMountConfiguration = new CIFSMountConfiguration
            {
                Username = "<storage-account-name>",
                RelativeMountPath = "<relative-mount-path>",
                Source = "<source>",
                Password = "<storage-account-key>",
                MountOptions = "-o vers=3.0,dir_mode=0777,file_mode=0777,serverino,domain=<domain-name>"
            },
        }
    }
}

Nota

Per un esempio, usare PowerShell anziché C#? È possibile trovare un altro ottimo esempio qui: Montare file di Azure nel pool di Azure Batch.

Passaggi successivi