Partilhar via


Usando a API REST do CycleCloud

O CycleCloud fornece uma API REST para adicionar gerenciamento de cluster automatizado e programático. O dimensionamento automático personalizado e a integração do agendador personalizado exigem uma ferramenta que avalie uma fila de carga de trabalho e inicie máquinas virtuais (VMs) para corresponder à demanda de carga de trabalho. A API REST do CycleCloud é o ponto de extremidade apropriado para essa ferramenta e suporta requisitos de carga de trabalho que podem incluir arranjos de VM de alta taxa de transferência ou fortemente acoplados.

Determinar o status do cluster

Você pode consultar o CycleCloud para determinar o status do cluster. O status mostra a disponibilidade da VM em cada uma das configurações de cluster.

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

Observação

A API do CycleCloud aceita autenticação básica com um nome de usuário e senha. Esses exemplos de API curl usam uma cadeia de caracteres codificada em base64 para 'user:password'.

A resposta se parece com o exemplo a seguir. A resposta contém um conjunto completo de atributos de nó, mas muitos são omitidos aqui para simplificar.

{
  "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
          }
        }
    ]
}

Criar nós

A API oferece grande flexibilidade quando inicias nodos. Os únicos atributos necessários para criar nós são nodearray e count. Uma chamada que utiliza esses atributos mínimos necessários herda todas as configurações do nó existentes. Os nós vão para o primeiro bucket que consegue atender ao pedido.

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"
        }
    ]
}'

A resposta a esta chamada fornece um ID de operação.

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

Você pode acompanhar o status da operação com a API de operações. Defina o request_id parâmetro para filtrar a resposta dos nós GET. Esse filtro fornece detalhes sobre todos os nós criados com o pedido de criação.

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

Adicionar nós fortemente acoplados

Você pode definir matrizes de nó do CycleCloud com vários tipos de máquina válidos em uma lista. Suponha que a matriz de nó ondemand tenha ambos Standard_F32s_v2_ e Standard_Hc44rs definidos. A API de status do cluster mostra pelo menos dois buckets para esse array de nós, um para cada tamanho de máquina virtual. O Standard_Hc44rs bucket indica que o serviço infiniband está disponível. Alguns programas quantitativos escalam através de nós e tiram partido das conexões de baixa latência entre os nós.

Suponha que você esteja executando essa carga de trabalho e um trabalho exija quatro nós conectados pela rede Azure Infiniband. Para garantir que os quatro nós acabem no mesmo grupo de colocação e, portanto, na mesma rede Infiniband, use a chamada da API create nodes com um 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" }
        }
    ]
}'

O placementGroupId pode fazer referência a um grupo de colocação preexistente ou não. O CycleCloud usa esse ID para um grupo lógico. Se a solicitação especificar um grupo de posicionamento que não existe, o CycleCloud criará um novo grupo de posicionamento. Você pode adicionar mais VMs ao mesmo grupo de posicionamento em solicitações de criação de nós extras.

Excluir nós

Em algum momento, o serviço de gerenciamento precisa encerrar os nós que criou.

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"
    }
  ]
}