Поделиться через


Подготовка вычислительных узлов Linux в пулах Batch.

Пакетная служба Azure позволяет выполнять параллельные вычислительные рабочие нагрузки на виртуальных машинах Linux и Windows. В этой статье описано, как создать пулы вычислительных узлов Linux в пакетной службе с помощью клиентских библиотек Python и Пакетной службы .NET .

Конфигурация виртуальной машины

При создании пула вычислительных узлов в пакетной службе вы можете выбрать размер узла и операционную систему: конфигурацию облачных служб и конфигурацию виртуальной машины. Пулы конфигурации виртуальных машин состоят из виртуальных машин Azure, которые могут быть созданы из образов Linux или Windows. При создании пула с конфигурацией виртуальной машины укажите доступный размер вычислительного узла, ссылку на образ виртуальной машины, который будет установлен на узлах, и номер SKU агента пакетного узла (программа, которая выполняется на каждом узле и предоставляет интерфейс между узлом и пакетной службой).

Справочник по образу виртуальной машины

Пакетная служба использует масштабируемые наборы виртуальных машин для предоставления вычислительных узлов в конфигурации виртуальной машины. Вы можете указать изображение из Azure Marketplace или использовать коллекцию вычислений Azure для подготовки пользовательского образа.

При создании ссылки на образ виртуальной машины необходимо указать следующие свойства:

Свойство ссылок на изображение Example
Publisher canonical
Offer 0001-com-ubuntu-server-focal
SKU 20_04-lts
Version latest

Tip

Дополнительные сведения об этих свойствах и о том, как найти образы виртуальных машин Linux в Azure Marketplace с помощью Azure CLI, можно узнать в разделе поиск образов в Marketplace. Обратите внимание, что некоторые образы Marketplace в настоящее время несовместимы с Batch.

Список образов виртуальных машин

Не все образы Marketplace совместимы с доступными в настоящее время агентами пакетного узла. Чтобы перечислить все поддерживаемые образы виртуальных машин Marketplace для службы Batch и соответствующих SKU агента узла, используйте list_supported_images (Python), ListSupportedImages (Batch .NET) или соответствующий API в другом языковом пакете SDK.

Номер SKU агента узла

Агент узла пакетной службы — это программа, которая выполняется на каждом узле в пуле и предоставляет интерфейс управления между узлом и пакетной службой. Существуют различные реализации агента узла, известного как номера SKU для разных операционных систем. По сути, при создании конфигурации виртуальной машины сначала укажите ссылку на образ виртуальной машины, а затем укажите агент узла для установки на образ. Как правило, каждый номер SKU агента узла совместим с несколькими образами виртуальных машин. Чтобы просмотреть поддерживаемые номера SKU агента узлов и совместимость образов виртуальных машин, можно использовать команду Azure Batch CLI:

az batch pool supported-images list

Дополнительные сведения см. в статье "Учетная запись " Список поддерживаемых образов - REST API (пакетная служба Azure) | Документация Майкрософт.

Создание пула Linux: Пакетный Python

В следующем фрагменте кода показан пример использования клиентской библиотеки пакетной службы Microsoft Azure для Python для создания пула вычислительных узлов Ubuntu Server. Дополнительные сведения о модуле Пакетной службы Python см. в справочной документации.

Этот фрагмент кода создает ImageReference явным образом и задает каждое из его свойств (издатель, предложение, номер SKU, версия). Однако в рабочем коде мы рекомендуем использовать метод list_supported_images для выбора среди доступных SKU сочетаний образа и агента узла во время выполнения.

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

Как упоминалось ранее, мы рекомендуем использовать метод list_supported_images для динамического выбора из поддерживаемых сочетаний образов агента узла или Marketplace (а не создания ImageReference явным образом). В следующем фрагменте кода Python показано, как использовать этот метод.

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

Создание пула Linux: Batch .NET

В следующем фрагменте кода показан пример использования клиентской библиотеки Пакетной службы .NET для создания пула вычислительных узлов Ubuntu Server. Дополнительные сведения о пакетной службе .NET см. в справочной документации.

В следующем фрагменте кода используется метод PoolOperations.ListSupportedImages для выбора из списка поддерживаемых в настоящее время сочетаний SKU образа и агента узла Marketplace. Этот метод рекомендуется, так как список поддерживаемых сочетаний может меняться от времени. Чаще всего добавляются поддерживаемые сочетания.

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

Хотя предыдущий фрагмент кода использует метод PoolOperations.listSupportedImages для динамического перечисления и выбора из поддерживаемых сочетаний образа и SKU агента узла (рекомендуется), вы также можете явно настроить ImageReference:

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

Подключение к узлам Linux с помощью SSH

Во время разработки или устранения неполадок может потребоваться войти в узлы вашего пула. В отличие от вычислительных узлов Windows, для подключения к узлам Linux нельзя использовать протокол удаленного рабочего стола (RDP). Вместо этого пакетная служба обеспечивает доступ SSH на каждом узле для удаленного подключения.

Следующий фрагмент кода Python создает пользователя на каждом узле в пуле, который необходим для удаленного подключения. Затем он печатает сведения о подключении безопасной оболочки (SSH) для каждого узла.

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

Этот код будет иметь выходные данные, аналогичные следующему примеру. В этом случае пул содержит четыре узла 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

Вместо пароля можно указать открытый ключ SSH при создании пользователя на узле.

В пакете SDK для Python используйте параметр ssh_public_key в ComputeNodeUser.

В .NET используйте свойство ComputeNodeUser.SshPublicKey .

Pricing

Пакетная служба Azure основана на облачных службах Azure и технологиях виртуальных машин Azure. Сама пакетная служба предоставляется без затрат, что означает, что плата взимается только за вычислительные ресурсы (и связанные затраты), которые влечет за собой использование решений пакетной службы. При выборе конфигурации виртуальной машины взимается плата на основе структуры цен на виртуальные машины .

При развертывании приложений на узлах пакетной службы с помощью пакетов приложений также взимается плата за ресурсы службы хранилища Azure, которые используют пакеты приложений.

Дальнейшие шаги