Использование REST API CycleCloud

CycleCloud предоставляет REST API для добавления автоматизированного и программного управления кластерами. Для интеграции настраиваемого автомасштабирования и пользовательского планировщика требуется средство, которое оценивает очередь рабочей нагрузки и запускает виртуальные машины для соответствия требованию рабочей нагрузки. REST API CycleCloud — это подходящая конечная точка для такого инструмента и поддерживает требования рабочей нагрузки, которые могут включать высокую пропускную способность или тесно связанные конфигурации виртуальных машин.

Определение состояния кластера

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

curl --location --request GET '${CC-URL}/clusters/${CLUSTER}/status' \
--header 'Authorization: Basic ****************************'

Примечание.

API CycleCloud принимает базовую проверку подлинности с именем пользователя и паролем. В этих примерах API curl используется строка в кодировке Base64 для user:password.

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

{
  "state": "Started",
  "targetState": "Started",
  "maxCount": 100,
  "maxCoreCount": 10000,
  "nodearrays": [
    {
      "name": "ondemand",
      "maxCount": 100,
      "maxCoreCount": 500,
      "buckets": [
        {
        "bucketId": "cd56af52-abcd-1234-a4e7-e6a91ca519a2",
        "definition": {
            "machineType": "Standard_Fs32_v2"
          },
          "maxCount": 3,
          "maxCoreCount": 96,
          "activeCount": 0,
          "activeCoreCount": 0,
          "availableCount": 3,
          "availableCoreCount": 96,
          "quotaCount": 3,
          "quotaCoreCount": 100,
          "consumedCoreCount": 0,
          "maxPlacementGroupSize": 40,
          "maxPlacementGroupCoreSize": 1280,
          "valid": true,
          "placementGroups": [],
          "virtualMachine": {
            "vcpuCount": 32,
            "memory": 64.0,
            "infiniband": false
          }
          },
        {
        "bucketId": "d81e001a-abcd-1234-9754-79815cb7b225",
        "definition": {
            "machineType": "Standard_Hc44rs"
          },
          "maxCount": 11,
          "maxCoreCount": 484,
          "activeCount": 0,
          "activeCoreCount": 0,
          "availableCount": 11,
          "availableCoreCount": 484,
          "quotaCount": 200,
          "quotaCoreCount": 8800,
          "consumedCoreCount": 44,
          "maxPlacementGroupSize": 40,
          "maxPlacementGroupCoreSize": 1760,
          "valid": true,
          "placementGroups": [],
          "virtualMachine": {
            "vcpuCount": 44,
            "memory": 327.83,
            "infiniband": true
          }
        }
    ]
}

Создание узлов

API обеспечивает большую гибкость при запуске узлов. Единственными обязательными атрибутами для создания узлов являются nodearray и count. Вызов, использующий эти минимальные обязательные атрибуты, наследует все существующие конфигурации узлов. Узлы попадают в первый бакет, который может удовлетворить запрос.

curl --location --request POST '${CC-URL}/clusters/${CLUSTER}/nodes/create' \
--header 'Authorization: Basic ****************************' \
--header 'Content-Type: text/plain' \
--data-raw '{ "requestId" : "463270ca-abcd-1234-98d6-431ee3ef8ed5",
    "sets" : [
        {
            "count" : 1,
            "nodearray" : "ondemand"
        }
    ]
}'

Ответ на этот вызов предоставляет идентификатор операции.

{
  "operationId": "3b53d621-abcd-1234-8876-6ec1158897ac",
  "sets": [
    {
      "added": 1
    }
  ]
}

Состояние операции можно отслеживать с помощью API операций. request_id Задайте параметр для фильтрации ответа GET-узлов. Этот фильтр содержит сведения обо всех узлах, созданных с помощью запроса на создание.

curl --location --request GET '${CC-URL}/clusters/${CLUSTER}/nodes?request_id=463270ca-abcd-1234-98d6-431ee3ef8ed5' \

Добавление тесно связанных узлов

Вы можете определить массивы узлов CycleCloud с несколькими допустимыми типами компьютеров в списке. Предположим, что ondemand массив узлов имел и Standard_F32s_v2_ и Standard_Hc44rs определены. API состояния кластера отображает по крайней мере два buckets для этого массива узлов, по одному для каждого размера виртуальной машины. Контейнер Standard_Hc44rs указывает, что доступна служба infiniband . Некоторые количественные программы масштабируются на узлы и используют низкую задержку подключений между узлами.

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

curl --location --request POST '${CC-URL}/clusters/${CLUSTER}/nodes/create' \
--header 'Authorization: Basic ****************************' \
--header 'Content-Type: text/plain' \
--data-raw '{ "requestId" : "463270ca-abcd-1234-98d6-431ee3ef8ed5",
    "sets" : [
        {
            "count" : 4,
            "nodearray" : "ondemand",
            "placementGroupId" : "pg0",
            "definition" : { "machineType" : "Standard_Hc44rs" }
        }
    ]
}'

Возможно, placementGroupId может ссылаться на существующую группу размещения, или она может не существовать. CycleCloud использует этот идентификатор для логической группы. Если запрос указывает группу размещения, которая не существует, CycleCloud создает новую группу размещения. Вы можете добавить дополнительные виртуальные машины в ту же группу размещения в дополнительных запросах на создание узлов.

Удалите узлы

В какой-то момент служба диспетчера должна прекратить узлы, которые она создала.

curl --location --request POST '${CC-URL}/clusters/${CLUSTER}/nodes/terminate' \
--header 'Authorization: Basic ****************************' \
--header 'Content-Type: text/plain' \
--data-raw '{
 "ids" : ["62a1b116-abcd-1234-b290-b54ea23f1b68"]
}'
{
  "operationId": "15aaa844-abcd-1234-9591-8904c546028d",
  "nodes": [
    {
      "name": "ondemand-3",
      "id": "62a1b116-abcd-1234-b290-b54ea23f1b68",
      "status": "OK"
    }
  ]
}