Aprowizowanie węzłów obliczeniowych systemu Linux w pulach usługi Batch

Za pomocą Azure Batch można uruchamiać równoległe obciążenia obliczeniowe na maszynach wirtualnych z systemami Linux i Windows. W tym artykule opisano sposób tworzenia pul węzłów obliczeniowych systemu Linux w usłudze Batch przy użyciu bibliotek klienckich usługi Batch Python i Batch .NET .

Konfiguracja maszyny wirtualnej

Podczas tworzenia puli węzłów obliczeniowych w usłudze Batch dostępne są dwie opcje wyboru rozmiaru węzła i systemu operacyjnego: Cloud Services Konfiguracja i Konfiguracja maszyny wirtualnej. Pule konfiguracji maszyny wirtualnej składają się z maszyn wirtualnych platformy Azure, które mogą zostać utworzone na podstawie obrazów systemu Linux lub Windows. Podczas tworzenia puli przy użyciu konfiguracji maszyny wirtualnej należy określić dostępny rozmiar węzła obliczeniowego, odwołanie do obrazu maszyny wirtualnej do zainstalowania w węzłach oraz jednostkę SKU agenta węzła usługi Batch (program uruchamiany w każdym węźle i udostępnia interfejs między węzłem a usługą Batch).

Dokumentacja obrazu maszyny wirtualnej

Usługa Batch używa zestawów skalowania maszyn wirtualnych do udostępniania węzłów obliczeniowych w konfiguracji maszyny wirtualnej. Możesz określić obraz z Azure Marketplace lub użyć galerii obliczeń platformy Azure, aby przygotować obraz niestandardowy.

Podczas tworzenia odwołania do obrazu maszyny wirtualnej należy określić następujące właściwości:

Właściwość odwołania do obrazu Przykład
Publisher Canonical
Oferta UbuntuServer
SKU 20.04-LTS
Wersja latest

Porada

Aby dowiedzieć się więcej o tych właściwościach i sposobie określania obrazów z witryny Marketplace, zobacz Znajdowanie obrazów maszyn wirtualnych z systemem Linux w Azure Marketplace za pomocą interfejsu wiersza polecenia platformy Azure. Pamiętaj, że niektóre obrazy z witryny Marketplace nie są obecnie zgodne z usługą Batch.

Lista obrazów maszyn wirtualnych

Nie wszystkie obrazy witryny Marketplace są zgodne z obecnie dostępnymi agentami węzłów usługi Batch. Aby wyświetlić listę wszystkich obsługiwanych obrazów maszyn wirtualnych z witryny Marketplace dla usługi Batch i odpowiednich jednostek SKU agenta węzła, użyj list_supported_images (Python), ListSupportedImages (Batch .NET) lub odpowiedniego interfejsu API w innym zestawie SDK języka.

Jednostka SKU agenta węzła

Agent węzła usługi Batch to program uruchamiany w każdym węźle w puli i udostępnia interfejs poleceń i sterowania między węzłem a usługą Batch. Istnieją różne implementacje agenta węzła, znane jako jednostki SKU, dla różnych systemów operacyjnych. Zasadniczo podczas tworzenia konfiguracji maszyny wirtualnej należy najpierw określić odwołanie do obrazu maszyny wirtualnej, a następnie określić agenta węzła do zainstalowania na obrazie. Zazwyczaj każda jednostka SKU agenta węzła jest zgodna z wieloma obrazami maszyn wirtualnych. Aby wyświetlić obsługiwane jednostki SKU agenta węzła i zgodność obrazu maszyny wirtualnej, możesz użyć polecenia interfejsu wiersza polecenia Azure Batch:

az batch pool supported-images list

Aby uzyskać więcej informacji, zobacz Account - List Supported Images — REST API (Azure Batch Service) | Microsoft Docs.

Tworzenie puli systemu Linux: Usługa Batch Python

Poniższy fragment kodu przedstawia przykład użycia biblioteki klienta microsoft Azure Batch dla języka Python w celu utworzenia puli węzłów obliczeniowych systemu Ubuntu Server. Aby uzyskać więcej informacji na temat modułu usługi Batch w języku Python, zapoznaj się z dokumentacją referencyjną.

Ten fragment kodu tworzy jawnie właściwość ImageReference i określa każdą z jego właściwości (wydawca, oferta, jednostka SKU, wersja). W kodzie produkcyjnym zalecamy jednak użycie metody list_supported_images do wybrania kombinacji jednostki SKU agenta obrazu i węzła w czasie wykonywania.

# 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="UbuntuServer",
    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)

Jak wspomniano wcześniej, zalecamy użycie metody list_supported_images do dynamicznego wybierania kombinacji agenta węzła/obrazu witryny Marketplace (zamiast jawnego tworzenia funkcji ImageReference ). Poniższy fragment kodu języka Python pokazuje, jak używać tej metody.

# 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() == "ubuntuserver" 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)

Tworzenie puli systemu Linux: Usługa Batch .NET

Poniższy fragment kodu przedstawia przykład użycia biblioteki klienta platformy .NET usługi Batch do utworzenia puli węzłów obliczeniowych systemu Ubuntu Server. Aby uzyskać więcej informacji na temat platformy .NET usługi Batch, zapoznaj się z dokumentacją referencyjną.

Poniższy fragment kodu używa metody PoolOperations.ListSupportedImages do wybrania z listy aktualnie obsługiwanych kombinacji jednostek SKU agenta platformy Marketplace i węzła. Ta technika jest zalecana, ponieważ lista obsługiwanych kombinacji może ulec zmianie od czasu do czasu. Najczęściej dodawane są obsługiwane kombinacje.

// 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 == "UbuntuServer" &&
        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();

Mimo że poprzedni fragment kodu używa metody PoolOperations.istSupportedImages do dynamicznego wyświetlania listy i wybierania z obsługiwanych kombinacji jednostek SKU agenta obrazu i węzła (zalecane), można również jawnie skonfigurować funkcję ImageReference :

ImageReference imageReference = new ImageReference(
    publisher: "Canonical",
    offer: "UbuntuServer",
    sku: "20.04-LTS",
    version: "latest");

Nawiązywanie połączenia z węzłami systemu Linux przy użyciu protokołu SSH

Podczas programowania lub rozwiązywania problemów może być konieczne zalogowanie się do węzłów w puli. W przeciwieństwie do węzłów obliczeniowych systemu Windows nie można używać protokołu RDP (Remote Desktop Protocol) do nawiązywania połączenia z węzłami systemu Linux. Zamiast tego usługa Batch umożliwia dostęp SSH w każdym węźle na potrzeby połączenia zdalnego.

Poniższy fragment kodu języka Python tworzy użytkownika w każdym węźle w puli, co jest wymagane do połączenia zdalnego. Następnie wyświetla informacje o połączeniu secure shell (SSH) dla każdego węzła.

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

Ten kod będzie miał dane wyjściowe podobne do poniższego przykładu. W takim przypadku pula zawiera cztery węzły systemu 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

Zamiast hasła można określić klucz publiczny SSH podczas tworzenia użytkownika w węźle.

W zestawie SDK języka Python użyj parametru ssh_public_key w elemecie ComputeNodeUser.

Na platformie .NET użyj właściwości ComputeNodeUser.SshPublicKey .

Cennik

Azure Batch jest oparta na technologii Azure Cloud Services i Azure Virtual Machines. Sama usługa Batch jest oferowana bez kosztów, co oznacza, że opłaty są naliczane tylko za zasoby obliczeniowe (i powiązane koszty), które wiążą się z użyciem rozwiązań usługi Batch. Po wybraniu opcji Konfiguracja maszyny wirtualnej opłaty są naliczane na podstawie struktury cen Virtual Machines.

W przypadku wdrażania aplikacji w węzłach usługi Batch przy użyciu pakietów aplikacji są również naliczane opłaty za zasoby usługi Azure Storage używane przez pakiety aplikacji.

Następne kroki