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 personalizada do agendador exigem uma ferramenta que avalia uma fila de carga de trabalho e inicia máquinas virtuais (VM) igual à demanda de carga de trabalho. A API REST do CycleCloud é o ponto de extremidade apropriado para essa ferramenta e dá suporte a requisitos de carga de trabalho que podem incluir arranjos de VM de alta taxa de transferência ou bem acoplados.

Determinar o status do cluster

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

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

Observação

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

A resposta estará no formulário 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 nos nós iniciais. Os únicos atributos necessários para criar nós são nodearray e count. Uma chamada usando os atributos mínimos necessários herdará todas as configurações de nó existentes e será colocada no primeiro bucket que pode atender à solicitação.

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 essa chamada fornecerá uma ID de operação.

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

O status da operação pode ser rastreado usando a API de operações. Você pode definir o request_id parâmetro para filtrar a resposta de nós GET. Isso pode fornecer detalhes para todos os nós criados com a solicitação de criação.

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

Adicionar nós bem acoplados

As nodearrays do CycleCloud podem ser definidas com vários tipos de computador válidos em uma lista. Suponha que a ondemand nodearray tenha ambos Standard_F32s_v2_e Standard_Hc44rs definido. A API de status do cluster mostrará pelo menos dois buckets para este nodearray um para cada tamanho de VM. Observe que o bucket indica que o Standard_Hc44rs serviço infiniband está disponível. Alguns softwares quantitativos são gravados para escalar verticalmente entre nós e aproveitar as conexões de baixa latência entre nós.

Suponha que você esteja executando essa carga de trabalho e uma chamada de trabalho para quatro nós conectados pela rede infiniband do Azure. Para garantir que os quatro nós acabem no mesmo grupo de posicionamento e, portanto, na mesma rede Infiniband, você usará a chamada de API criar nós 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 grupo de posicionamento pode ou não fazer referência a um grupo de posicionamento pré-existente. Esse é um grupo lógico usado no CycleCloud e, se um grupo de posicionamento específico não existir quando a solicitação for feita, o CycleCloud criará um novo grupo de posicionamento. Você pode adicionar VMs adicionais ao mesmo grupo de posicionamento em solicitações de nós de criação adicionais.

Excluir nós

Em algum momento, o serviço gerenciador desejará encerrar nós que foram criados.

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