Uso dell'API REST CycleCloud

Cyclecloud offre un'API REST per l'aggiunta di gestione automatica e programmatica dei cluster. La scalabilità automatica personalizzata e l'integrazione dell'utilità di pianificazione personalizzata richiedono uno strumento che valuta una coda del carico di lavoro e avvia macchine virtuali (VM) uguali alla richiesta del carico di lavoro. L'API REST CycleCloud è l'endpoint appropriato per uno strumento di questo tipo e supporta i requisiti del carico di lavoro che possono includere la velocità effettiva elevata o le disposizioni di vm strettamente associate.

Determinare lo stato del cluster

È possibile eseguire una query su CycleCloud per determinare lo stato del cluster che indica la disponibilità delle macchine virtuali in ognuna delle configurazioni del cluster.

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

Nota

L'API CycleCloud accetta l'autenticazione di base usando la combinazione di nome utente e password. Questi esempi di API curl sono una stringa con codifica Base64 "user:password".

La risposta sarà nel formato seguente. La risposta contiene un set completo di attributi del nodo, ma molti vengono omessi qui per semplicità.

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

Creare nodi

L'API offre una grande flessibilità nell'avvio dei nodi. Gli unici attributi necessari per creare nodi sono nodearray e count. Una chiamata che usa gli attributi minimi necessari erediterà tutte le configurazioni dei nodi esistenti e verrà inserita nel primo bucket che può soddisfare la richiesta.

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

La risposta a questa chiamata fornirà un ID operazione.

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

È possibile tenere traccia dello stato dell'operazione usando l'API operazioni. È possibile impostare il request_id parametro per filtrare la risposta dei nodi GET. In questo modo è possibile specificare i dettagli per tutti i nodi creati con la richiesta di creazione.

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

Aggiungere nodi strettamente associati

I nodearray CycleCloud possono essere definiti con più tipi di computer validi in un elenco. Si supponga che nodearray ondemand abbia e Standard_F32s_v2_Standard_Hc44rs definito. L'API di stato del cluster mostrerà almeno due buckets per questo nodearray uno per ogni dimensione della macchina virtuale. Si noti che il Standard_Hc44rs bucket indica che il servizio infiniband è disponibile. Alcuni software quantitativi vengono scritti per aumentare il numero di istanze tra i nodi e sfruttare le connessioni a bassa latenza tra i nodi.

Si supponga di eseguire un carico di lavoro di questo tipo e di chiamare un processo per quattro nodi connessi dalla rete Infiniband di Azure. Per assicurarsi che i quattro nodi si trovino nello stesso gruppo di posizionamento e quindi nella stessa rete Infiniband, si userà la chiamata API di creazione nodi con un .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" }
        }
    ]
}'

Può placementGroupId fare riferimento o meno a un gruppo di posizionamento preesistente. Si tratta di un gruppo logico usato in CycleCloud e se non esiste un gruppo di posizionamento specifico quando viene effettuata la richiesta, CycleCloud creerà un nuovo gruppo di posizionamento. È possibile aggiungere altre macchine virtuali allo stesso gruppo di posizionamento in richieste di creazione di nodi aggiuntive.

Eliminare nodi

A un certo punto, il servizio di gestione vuole terminare i nodi creati.

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