Condividi tramite


Eseguire il provisioning di nodi di calcolo Linux nei pool di Batch

È possibile usare Azure Batch per eseguire carichi di lavoro di calcolo paralleli in macchine virtuali Linux e Windows. Questo articolo illustra in dettaglio come creare pool di nodi di calcolo Linux nel servizio Batch usando le librerie client Batch Python e Batch .NET.

Configurazione macchina virtuale

Quando si crea un pool di nodi di calcolo in Batch, sono disponibili due opzioni per la selezione delle dimensioni e del sistema operativo del nodo, ovvero la configurazione di servizi cloud e la configurazione della macchina virtuale. I pool di configurazione delle macchine virtuali sono costituiti da macchine virtuali di Azure, che possono essere create da immagini Linux o Windows. Quando si crea un pool con Configurazione macchina virtuale, si specificano le dimensioni del nodo di calcolo disponibili, il riferimento all'immagine della macchina virtuale da installare nei nodi e lo SKU dell'agente del nodo Batch (un programma eseguito in ogni nodo e fornisce un'interfaccia tra il nodo e il servizio Batch).

Riferimento all'immagine della macchina virtuale

Il servizio Batch usa set di scalabilità di macchine virtuali per fornire nodi di calcolo nella configurazione macchina virtuale. È possibile specificare un'immagine da Azure Marketplace o usare la raccolta di calcolo di Azure per preparare un'immagine personalizzata.

Quando si crea un riferimento all'immagine di macchina virtuale, è necessario specificare le proprietà seguenti:

Proprietà di riferimento per le immagini Esempio
Publisher canonical
Offerta 0001-com-ubuntu-server-focal
SKU 20_04-lts
Versione più recente

Suggerimento

Per altre informazioni su queste proprietà e su come specificare immagini del Marketplace, vedere Trovare immagini di macchine virtuali Linux in Azure Marketplace con l'interfaccia della riga di comando di Azure. Si noti che alcune immagini del Marketplace non sono attualmente compatibili con Batch.

Elenco di immagini di macchine virtuali

Non tutte le immagini del Marketplace sono compatibili con gli agenti del nodo Batch attualmente disponibili. Per elencare tutte le immagini di macchine virtuali del Marketplace supportate per il servizio Batch e gli SKU dell'agente del nodo corrispondenti, usare list_supported_images (Python), ListSupportedImages (Batch .NET) o l'API corrispondente in un altro SDK del linguaggio.

SKU dell'agente del nodo

L'agente del nodo Batch è un programma in esecuzione in ogni nodo del pool e fornisce l'interfaccia di comando e controllo tra il nodo e il servizio Batch. Sono disponibili diverse implementazioni dell'agente del nodo, definite SKU, per sistemi operativi diversi. Quando si crea una configurazione della macchina virtuale, è essenzialmente necessario specificare prima di tutto il riferimento all'immagine della macchina virtuale e quindi l'agente del nodo da installare nell'immagine. Ogni SKU dell'agente del nodo è in genere compatibile con più immagini di macchina virtuale. Per visualizzare gli SKU dell'agente del nodo supportati e le compatibilità delle immagini delle macchine virtuali, è possibile usare il comando dell'interfaccia della riga di comando di Azure Batch:

az batch pool supported-images list

Per altre informazioni, è possibile fare riferimento a Account - Elencare immagini supportate - API REST (servizio Azure Batch) | Microsoft Docs.

Creare un pool Linux: Batch Python

Il frammento di codice seguente illustra un esempio su come usare la libreria client di Microsoft Azure Batch per Python per creare un pool di nodi di calcolo Ubuntu Server. Per altri dettagli sul modulo Batch Python, vedere la documentazione di riferimento.

Questo frammento di codice crea in modo esplicito una classe ImageReference e ne specifica tutte le proprietà (editore, offerta, SKU, versione). Nel codice di produzione, tuttavia, è consigliabile usare il metodo list_supported_images per selezionare le combinazioni di SKU dell'agente dell'immagine e del nodo disponibili in fase di esecuzione.

# Import the required modules from the
# Azure Batch Client Library for Python
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels

# Specify Batch account credentials
account = "<batch-account-name>"
key = "<batch-account-key>"
batch_url = "<batch-account-url>"

# Pool settings
pool_id = "LinuxNodesSamplePoolPython"
vm_size = "STANDARD_D2_V3"
node_count = 1

# Initialize the Batch client
creds = batchauth.SharedKeyCredentials(account, key)
config = batch.BatchServiceClientConfiguration(creds, batch_url)
client = batch.BatchServiceClient(creds, batch_url)

# Create the unbound pool
new_pool = batchmodels.PoolAddParameter(id=pool_id, vm_size=vm_size)
new_pool.target_dedicated = node_count

# Configure the start task for the pool
start_task = batchmodels.StartTask()
start_task.run_elevated = True
start_task.command_line = "printenv AZ_BATCH_NODE_STARTUP_DIR"
new_pool.start_task = start_task

# Create an ImageReference which specifies the Marketplace
# virtual machine image to install on the nodes
ir = batchmodels.ImageReference(
    publisher="canonical",
    offer="0001-com-ubuntu-server-focal",
    sku="20_04-lts",
    version="latest")

# Create the VirtualMachineConfiguration, specifying
# the VM image reference and the Batch node agent
# to install on the node
vmc = batchmodels.VirtualMachineConfiguration(
    image_reference=ir,
    node_agent_sku_id="batch.node.ubuntu 20.04")

# Assign the virtual machine configuration to the pool
new_pool.virtual_machine_configuration = vmc

# Create pool in the Batch service
client.pool.add(new_pool)

Come accennato in precedenza, è consigliabile usare il metodo list_supported_images per selezionare dinamicamente le combinazioni di immagini dell'agente del nodo o del Marketplace attualmente supportate anziché creare un oggetto ImageReference in modo esplicito. Il frammento di codice Python seguente illustra come usare questo metodo.

# Get the list of supported images from the Batch service
images = client.account.list_supported_images()

# Obtain the desired image reference
image = None
for img in images:
  if (img.image_reference.publisher.lower() == "canonical" and
        img.image_reference.offer.lower() == "0001-com-ubuntu-server-focal" and
        img.image_reference.sku.lower() == "20_04-lts"):
    image = img
    break

if image is None:
  raise RuntimeError('invalid image reference for desired configuration')

# Create the VirtualMachineConfiguration, specifying the VM image
# reference and the Batch node agent to be installed on the node
vmc = batchmodels.VirtualMachineConfiguration(
    image_reference=image.image_reference,
    node_agent_sku_id=image.node_agent_sku_id)

Creare un pool Linux: Batch .NET

Il frammento di codice seguente illustra un esempio di come usare la libreria client Batch .NET per creare un pool di nodi di calcolo Ubuntu Server. Per altri dettagli su Batch .NET, vedere la documentazione di riferimento.

Il frammento di codice seguente usa il metodo PoolOperations.ListSupportedImages per selezionare dall'elenco delle combinazioni di SKU dell'agente nodo e dell'immagine del Marketplace attualmente supportate. Questa tecnica è consigliata, perché l'elenco di combinazioni supportate può cambiare di tanto in tanto. in genere a causa dell'aggiunta di altre combinazioni supportate.

// Pool settings
const string poolId = "LinuxNodesSamplePoolDotNet";
const string vmSize = "STANDARD_D2_V3";
const int nodeCount = 1;

// Obtain a collection of all available node agent SKUs.
// This allows us to select from a list of supported
// VM image/node agent combinations.
List<ImageInformation> images =
    batchClient.PoolOperations.ListSupportedImages().ToList();

// Find the appropriate image information
ImageInformation image = null;
foreach (var img in images)
{
    if (img.ImageReference.Publisher == "canonical" &&
        img.ImageReference.Offer == "0001-com-ubuntu-server-focal" &&
        img.ImageReference.Sku == "20_04-lts")
    {
        image = img;
        break;
    }
}

// Create the VirtualMachineConfiguration for use when actually
// creating the pool
VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(image.ImageReference, image.NodeAgentSkuId);

// Create the unbound pool object using the VirtualMachineConfiguration
// created above
CloudPool pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    virtualMachineSize: vmSize,
    virtualMachineConfiguration: virtualMachineConfiguration,
    targetDedicatedComputeNodes: nodeCount);

// Commit the pool to the Batch service
await pool.CommitAsync();

Anche se il frammento precedente usa il metodo PoolOperations.istSupportedImages per elencare dinamicamente e selezionare le combinazioni di SKU dell'agente di nodi e di immagine supportate (scelta consigliata), è anche possibile configurare un oggetto ImageReference in modo esplicito:

ImageReference imageReference = new ImageReference(
    publisher: "canonical",
    offer: "0001-com-ubuntu-server-focal",
    sku: "20_04-lts",
    version: "latest");

Connettersi a nodi Linux tramite SSH

Durante lo sviluppo o la risoluzione dei problemi potrebbe essere necessario accedere ai nodi del pool. A differenza dei nodi di calcolo Windows, non è possibile usare Remote Desktop Protocol (RDP) per connettersi ai nodi Linux. Il servizio Batch consente invece l'accesso SSH in ogni nodo per la connessione remota.

Il frammento di codice Python seguente crea un utente in ogni nodo in un pool, necessario per la connessione remota, quindi stampa le informazioni di connessione Secure Shell (SSH) per ogni nodo.

import datetime
import getpass
import azure.batch.batch_service_client as batch
import azure.batch.batch_auth as batchauth
import azure.batch.models as batchmodels

# Specify your own account credentials
batch_account_name = ''
batch_account_key = ''
batch_account_url = ''

# Specify the ID of an existing pool containing Linux nodes
# currently in the 'idle' state
pool_id = ''

# Specify the username and prompt for a password
username = 'linuxuser'
password = getpass.getpass()

# Create a BatchClient
credentials = batchauth.SharedKeyCredentials(
    batch_account_name,
    batch_account_key
)
batch_client = batch.BatchServiceClient(
    credentials,
    base_url=batch_account_url
)

# Create the user that will be added to each node in the pool
user = batchmodels.ComputeNodeUser(username)
user.password = password
user.is_admin = True
user.expiry_time = \
    (datetime.datetime.today() + datetime.timedelta(days=30)).isoformat()

# Get the list of nodes in the pool
nodes = batch_client.compute_node.list(pool_id)

# Add the user to each node in the pool and print
# the connection information for the node
for node in nodes:
    # Add the user to the node
    batch_client.compute_node.add_user(pool_id, node.id, user)

    # Obtain SSH login information for the node
    login = batch_client.compute_node.get_remote_login_settings(pool_id,
                                                                node.id)

    # Print the connection info for the node
    print("{0} | {1} | {2} | {3}".format(node.id,
                                         node.state,
                                         login.remote_login_ip_address,
                                         login.remote_login_port))

Questo codice avrà un output simile all'esempio seguente. In questo caso, il pool contiene quattro nodi Linux.

Password:
tvm-1219235766_1-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50000
tvm-1219235766_2-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50003
tvm-1219235766_3-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50002
tvm-1219235766_4-20160414t192511z | ComputeNodeState.idle | 13.91.7.57 | 50001

Invece di una password, è possibile specificare una chiave pubblica SSH durante la creazione di un utente in un nodo.

In Python SDK usare il parametro ssh_public_key in ComputeNodeUser.

Prezzi

Azure Batch è basato sulla tecnologia di Servizi cloud di Azure e di Macchine virtuali di Azure. Il servizio Batch è gratuito, vengono quindi addebitate solo le risorse di calcolo usate dalle soluzioni Batch e i costi associati che comportano. Scegliendo la configurazione della macchina virtuale, i costi verranno addebitati in base alla struttura dei prezzi di Macchine virtuali.

Se si distribuiscono applicazioni ai nodi Batch tramite pacchetti dell'applicazione, vengono inoltre addebitati i costi per le risorse di Archiviazione di Azure utilizzate dai pacchetti dell'applicazione.

Passaggi successivi

  • Esplorare gli esempi di codice Python nel repository GitHub azure-batch-samples per informazioni su come eseguire operazioni batch comuni, ad esempio pool, processi e creazione di attività. Il file README associato agli esempi di Python include dettagli sull'installazione dei pacchetti necessari.
  • Informazioni sull'uso di macchine virtuali spot di Azure con Batch.