Partilhar via


Provisionar nós de computação Linux em pools Batch

Pode usar o Azure Batch para executar cargas de cálculo paralelas em máquinas virtuais Linux e Windows. Este artigo detalha como criar pools de nós de computação Linux no serviço Batch usando tanto as bibliotecas cliente Batch Python como Batch .NET .

Configuração da Máquina Virtual

Quando cria um conjunto de nós de computação em Batch, tem duas opções para selecionar o tamanho do nó e o sistema operativo: Configuração de Serviços Cloud e Configuração de Máquina Virtual. Os pools de Configuração de Máquinas Virtuais são compostos por VMs Azure, que podem ser criadas a partir de imagens Linux ou Windows. Quando cria um pool com Configuração de Máquina Virtual, especifica o tamanho disponível do nó de computação, a referência da imagem da máquina virtual a ser instalada nos nós e o SKU do agente de nó Batch (um programa que corre em cada nó e fornece uma interface entre o nó e o serviço Batch).

Referência de imagem de máquina virtual

O serviço Batch utiliza conjuntos de escala de máquinas virtuais para fornecer nós de computação na Configuração da Máquina Virtual. Pode especificar uma imagem a partir do Azure Marketplace, ou usar a Azure Compute Gallery para preparar uma imagem personalizada.

Ao criar uma referência de imagem de máquina virtual, deve especificar as seguintes propriedades:

Propriedade de referência da imagem Example
Publisher canonical
Offer 0001-com-ubuntu-server-focal
SKU 20_04-lts
Version latest

Tip

Pode aprender mais sobre estas propriedades e como especificar imagens do Marketplace em Encontrar imagens de VM Linux no Azure Marketplace com o Azure CLI. Note que algumas imagens do Marketplace não são atualmente compatíveis com o Batch.

Lista de imagens de máquinas virtuais

Nem todas as imagens do Marketplace são compatíveis com os agentes de nós Batch disponíveis atualmente. Para listar todas as imagens de máquinas virtuais suportadas do Marketplace para o serviço Batch e os respetivos SKUs de agente de nó, use list_supported_images (Python), ListSupportedImages (Batch .NET) ou a API correspondente noutra linguagem SDK.

SKU do agente do nó

O programa agente de nó Batch executa-se em cada nó do pool e fornece a interface de comando e controlo entre o nó e o serviço Batch. Existem diferentes implementações do agente de nó, conhecido como SKUs, para diferentes sistemas operacionais. Basicamente, quando crias uma Configuração de Máquina Virtual, primeiro especificas a referência da imagem da máquina virtual e depois especificas o agente de nó a instalar na imagem. Normalmente, cada SKU de agente de nó é compatível com múltiplas imagens de máquinas virtuais. Para visualizar os SKUs de agente de nó suportados e as compatibilidades de imagem de máquinas virtuais, pode usar o comando Azure Batch CLI:

az batch pool supported-images list

Para mais informação, pode consultar Account - List Supported Images - REST API (Azure Batch Service) | Microsoft Docs.

Criar um "pool" Linux: Batch Python

O seguinte excerto de código mostra um exemplo de como usar a Microsoft Azure Batch Client Library para Python para criar um pool de nós de computação do Ubuntu Server. Para mais detalhes sobre o módulo Batch Python, consulte a documentação de referência.

Este excerto cria explicitamente uma ImageReference e especifica cada uma das suas propriedades (editor, oferta, SKU, versão). No código de produção, no entanto, recomendamos que utilize o método list_supported_images para selecionar entre as combinações disponíveis de SKU de imagem e de agente de nó durante a execução.

# 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)

Como mencionado anteriormente, recomendamos usar o método list_supported_images para selecionar dinamicamente entre as combinações de agente de nó/imagem do Marketplace atualmente suportadas (em vez de criar explicitamente uma ImageReference ). O seguinte excerto em Python mostra como usar este método.

# 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)

Criar um pool Linux: Batch .NET

O seguinte excerto de código mostra um exemplo de como usar a biblioteca cliente Batch .NET para criar um conjunto de nós de computação do Ubuntu Server. Para mais detalhes sobre o Batch .NET, consulte a documentação de referência.

O seguinte excerto de código utiliza o método PoolOperations.ListSupportedImages para selecionar da lista de combinações de SKU de imagem e agente de nó atualmente suportadas no Marketplace. Esta técnica é recomendada, pois a lista de combinações suportadas pode mudar de tempos a tempos. Mais frequentemente, são adicionadas combinações suportadas.

// 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();

Embora o excerto anterior utilize o método PoolOperations.istSupportedImages para listar e selecionar dinamicamente combinações de SKU de imagem e agente de nó suportadas (recomendado), também pode configurar explicitamente uma ImageReference :

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

Conecte-se a nós Linux usando SSH

Durante o desenvolvimento ou durante a resolução de problemas, pode ser necessário fazer login nos nós do seu pool. Ao contrário dos nós de computação do Windows, não pode usar o Protocolo de Ambiente de Trabalho Remoto (RDP) para se ligar a nós Linux. Em vez disso, o serviço Batch permite o acesso SSH em cada nó para ligação remota.

O seguinte excerto de código Python cria um utilizador em cada nó de um pool, o que é necessário para a ligação remota. Depois, imprime a informação de ligação secure shell (SSH) para cada nó.

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))

Este código terá uma saída semelhante ao exemplo seguinte. Neste caso, o pool contém quatro nós 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

Em vez de uma palavra-passe, pode especificar uma chave pública SSH quando cria um utilizador num nó.

No SDK do Python, use o parâmetro ssh_public_key no ComputeNodeUser.

No .NET, utilize a propriedade ComputeNodeUser.SshPublicKey.

Pricing

O Azure Batch baseia-se na tecnologia Azure Cloud Services e Azure Virtual Machines. O próprio serviço Batch é oferecido gratuitamente, o que significa que é cobrado apenas pelos recursos computacionais (e custos associados) que as suas soluções Batch consomem. Quando escolhe Configuração de Máquina Virtual, é cobrado com base na estrutura de preços das Máquinas Virtuais.

Se implantar aplicações nos seus nós do Batch usando pacotes de aplicações, também é cobrado pelos recursos do Azure Storage que os seus pacotes de aplicações consomem.

Próximos passos