Zřizování linuxových výpočetních uzlů ve fondech služby Batch

Azure Batch můžete použít ke spouštění paralelních výpočetních úloh na virtuálních počítačích s Linuxem i s Windows. Tento článek podrobně popisuje, jak ve službě Batch vytvořit fondy linuxových výpočetních uzlů pomocí klientských knihoven Batch Python i Batch .NET .

Konfigurace virtuálního počítače

Při vytváření fondu výpočetních uzlů ve službě Batch máte dvě možnosti, ze kterých můžete vybrat velikost uzlu a operační systém: Cloud Services Konfigurace a Konfigurace virtuálního počítače. Fondy konfigurace virtuálních počítačů se skládají z virtuálních počítačů Azure, které se můžou vytvářet z imagí Linuxu nebo Windows. Při vytváření fondu s konfigurací virtuálního počítače zadáte dostupnou velikost výpočetního uzlu, odkaz na image virtuálního počítače, který se má na uzlech nainstalovat, a skladovou položku agenta uzlu Batch (program, který běží na každém uzlu a poskytuje rozhraní mezi uzlem a službou Batch).

Referenční informace k imagi virtuálního počítače

Služba Batch používá škálovací sady virtuálních počítačů k poskytování výpočetních uzlů v konfiguraci virtuálního počítače. Můžete zadat image z Azure Marketplace nebo můžete k přípravě vlastní image použít Azure Compute Gallery.

Při vytváření odkazu na image virtuálního počítače je nutné zadat následující vlastnosti:

Vlastnost odkazu na obrázek Příklad
Publisher Canonical
Nabídka UbuntuServer
Skladová jednotka (SKU) 20.04-LTS
Verze nejnovější

Tip

Další informace o těchto vlastnostech a o tom, jak určit image Marketplace, najdete v tématu Vyhledání imagí virtuálních počítačů s Linuxem v Azure Marketplace pomocí Azure CLI. Upozorňujeme, že některé image z Marketplace nejsou v současné době kompatibilní se službou Batch.

Seznam imagí virtuálních počítačů

Ne všechny image z Marketplace jsou kompatibilní s aktuálně dostupnými agenty uzlů Batch. Pokud chcete zobrazit seznam všech podporovaných imagí virtuálních počítačů z Marketplace pro službu Batch a jejich odpovídající skladové položky agenta uzlů, použijte list_supported_images (Python), ListSupportedImages (Batch .NET) nebo odpovídající rozhraní API v sadě SDK jiného jazyka.

Jednotka SKU zástupce uzlu

Agent uzlu Batch je program, který běží na každém uzlu ve fondu a poskytuje rozhraní příkazů a řízení mezi uzlem a službou Batch. Existují různé implementace agenta uzlu, označované jako skladové položky, pro různé operační systémy. V podstatě platí, že při vytváření konfigurace virtuálního počítače nejprve zadáte odkaz na image virtuálního počítače a pak určíte agenta uzlu, který se má do image nainstalovat. Každá skladová položka agenta uzlu je obvykle kompatibilní s několika imagemi virtuálních počítačů. Pokud chcete zobrazit podporované skladové položky agenta uzlů a kompatibilitu image virtuálního počítače, můžete použít příkaz Azure Batch CLI:

az batch pool supported-images list

Další informace najdete v tématu Účet – Výpis podporovaných imagí – ROZHRANÍ REST API (služba Azure Batch) | Microsoft Docs.

Vytvoření fondu Linuxu: Batch Python

Následující fragment kódu ukazuje příklad použití klientské knihovny Microsoft Azure Batch pro Python k vytvoření fondu výpočetních uzlů Ubuntu Serveru. Další podrobnosti o modulu Batch Python najdete v referenční dokumentaci.

Tento fragment kódu explicitně vytvoří ImageReference a určí každou z jeho vlastností (vydavatel, nabídka, skladová položka, verze). V produkčním kódu však doporučujeme použít metodu list_supported_images k výběru z dostupných kombinací SKU image a agenta uzlu za běhu.

# 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 už bylo zmíněno dříve, doporučujeme použít metodu list_supported_images k dynamickému výběru z aktuálně podporovaných kombinací image agenta uzlu a marketplace (místo explicitního vytváření imageReference ). Následující fragment kódu Pythonu ukazuje, jak tuto metodu použít.

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

Vytvoření fondu Linuxu: Batch .NET

Následující fragment kódu ukazuje příklad použití klientské knihovny Batch .NET k vytvoření fondu výpočetních uzlů Ubuntu Serveru. Další podrobnosti o službě Batch .NET najdete v referenční dokumentaci.

Následující fragment kódu používá metodu PoolOperations.ListSupportedImages k výběru ze seznamu aktuálně podporovaných kombinací SKU image Marketplace a agenta uzlu. Tento postup se doporučuje, protože seznam podporovaných kombinací se může čas od času měnit. Nejčastěji se přidávají podporované kombinace.

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

Přestože předchozí fragment kódu používá metodu PoolOperations.istSupportedImages k dynamickému výpisu a výběru z podporovaných kombinací SKU image a agenta uzlu (doporučeno), můžete také explicitně nakonfigurovat ImageReference :

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

Připojení k uzlům s Linuxem pomocí SSH

Během vývoje nebo při řešení potíží se možná budete muset přihlásit k uzlům ve vašem fondu. Na rozdíl od výpočetních uzlů Windows nemůžete pro připojení k uzlům s Linuxem použít protokol RDP (Remote Desktop Protocol). Místo toho služba Batch umožňuje přístup SSH na každém uzlu pro vzdálené připojení.

Následující fragment kódu Pythonu vytvoří uživatele na každém uzlu ve fondu, který se vyžaduje pro vzdálené připojení. Potom vytiskne informace o připojení SSH (Secure Shell) pro každý uzel.

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

Tento kód bude mít výstup podobný následujícímu příkladu. V tomto případě obsahuje fond čtyři linuxové uzly.

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

Místo hesla můžete při vytváření uživatele na uzlu zadat veřejný klíč SSH.

V sadě Python SDK použijte parametr ssh_public_key na ComputeNodeUser.

V .NET použijte vlastnost ComputeNodeUser.SshPublicKey .

Ceny

Azure Batch je postaven na technologiích Azure Cloud Services a Azure Virtual Machines. Samotná služba Batch se nabízí zdarma, což znamená, že se vám účtují jenom výpočetní prostředky (a související náklady), které vaše řešení Batch využívají. Když zvolíte Konfigurace virtuálního počítače, budou se vám účtovat poplatky na základě cenové struktury Virtual Machines.

Pokud nasazujete aplikace do uzlů Služby Batch pomocí balíčků aplikací, účtují se vám také poplatky za prostředky Azure Storage, které vaše balíčky aplikací spotřebovávají.

Další kroky