Utilisation de l’API REST CycleCloud

Cyclecloud fournit une API REST permettant d’ajouter une gestion automatisée et programmatique des clusters. L’intégration de planificateurs personnalisés et de mise à l’échelle automatique personnalisée nécessite un outil qui évalue une file d’attente de charge de travail et démarre des machines virtuelles égales à la demande de charge de travail. L’API REST CycleCloud est le point de terminaison approprié pour un tel outil et prend en charge les exigences de charge de travail qui peuvent inclure des arrangements de machine virtuelle à débit élevé ou étroitement couplés.

Déterminer l’état du cluster

Vous pouvez interroger CycleCloud pour déterminer l’état du cluster qui indique la disponibilité des machines virtuelles dans chacune des configurations de cluster.

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

Notes

L’API CycleCloud accepte l’authentification de base à l’aide de la combinaison de nom d’utilisateur et de mot de passe. Ces exemples d’API curl sont une chaîne codée en base64 « user:password ».

La réponse sera sous la forme suivante. La réponse contient un ensemble complet d’attributs de nœud, mais beaucoup sont omis ici pour simplicité.

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

Créer des nœuds

L’API offre une grande flexibilité dans les nœuds de démarrage. Les seuls attributs requis pour créer des nœuds sont nodearray et count. Un appel utilisant les attributs requis minimum héritera de toutes les configurations de nœud existantes et sera placé dans le premier compartiment qui peut satisfaire la requête.

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 réponse à cet appel fournit un ID d’opération.

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

L’état de l’opération peut être suivi à l’aide de l’API d’opérations. Vous pouvez définir le request_id paramètre pour filtrer la réponse des nœuds GET. Cela peut vous fournir des détails pour tous les nœuds créés avec la demande de création.

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

Ajouter des nœuds étroitement couplés

CycleCloud nodearrays peut être défini avec plusieurs types de machines valides dans une liste. Supposons que le nodearray ait à la ondemand fois Standard_F32s_v2_et Standard_Hc44rs défini. L’API d’état du cluster affiche au moins deux buckets pour ce nœudarray un pour chaque taille de machine virtuelle. Notez que le compartiment indique que le Standard_Hc44rs service infiniband est disponible. Certains logiciels quantitatifs sont écrits pour effectuer un scale-out entre les nœuds et tirer parti des connexions à faible latence entre les nœuds.

Supposons que vous exécutez une telle charge de travail et qu’un travail appelle quatre nœuds connectés par la mise en réseau Azure Infiniband. Pour vous assurer que les quatre nœuds se retrouvent dans le même groupe de placement, et ainsi sur le même réseau Infiniband, vous allez utiliser l’appel d’API de création de nœuds avec 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" }
        }
    ]
}'

Le placementGroupId groupe de placement peut ou non référencer un groupe de placement pré-existant. Il s’agit d’un groupe logique utilisé dans CycleCloud et si un groupe de placement spécifique n’existe pas lorsque la requête est effectuée, CycleCloud crée un groupe de placement. Vous pouvez ajouter des machines virtuelles supplémentaires au même groupe de placement dans des demandes de nœuds de création supplémentaires.

Supprimer des nœuds

À un moment donné, le service de gestionnaire souhaite mettre fin aux nœuds qui ont été créés.

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