Passer au contenu principal

CAST.AI

CAST.AI : Hibernate

L'une des fonctionnalités de CAST.AI est de mettre en hibernation un cluster Kubernetes à des périodes où le cluster n'est pas utilisé.

Cette fonctionnalité est généralement utilisée pour des clusters de développements, non critiques, ou tout simplement s'il n'a pas besoin de fonctionner constamment.

Le principe est simple :

  • CAST.AI va supprimer l'intégralité des noeuds présents sur le pool de machine mais conserver le cluster.
  • Résultat : Le cluster et le control plane sont conservés, mais on ne paie plus de compute lié au worker node.

Pré-requis

  • Générer une clé d'API depuis votre compte CAST.AI, la clé doit avoir les permissions Full Access
réc
  • Récupérer votre clusterid, disponible sur la liste des clusters
  • Récupérer votre organizationid, visible dans l'URL de la page
  • Ajouter une tolérance comme indiqué dans la doc aux composants castai-agent et castai-cluster-controller
    • Si vous avez déployé CAST.AI depuis le script fourni par la console, il vous faudra modifier le déploiement directement pour y ajouter le bloc suivant.
spec:
  ...
  template:
  ...
    spec:
    ...
      tolerations:
        - effect: NoSchedule
          key: provisioning.cast.ai/temporary
          operator: Equal
          value: resuming
    • Vous pouvez aussi simplement patcher les déploiements avec ces deux commandes
kubectl patch -n castai-agent deployments/castai-agent --patch '{"spec":{"template":{"spec":{"tolerations":[{"effect":"NoSchedule","key":"provisioning.cast.ai/temporary","operator":"Equal","value":"resuming"}]}}}}'
kubectl patch -n castai-agent deployments/castai-cluster-controller --patch '{"spec":{"template":{"spec":{"tolerations":[{"effect":"NoSchedule","key":"provisioning.cast.ai/temporary","operator":"Equal","value":"resuming"}]}}}}'
  • Si vous avez déployer les composants au travers d'un Helm Chart, il vous faudra ajouter les tolerations dans les values en utilisant tout simplement la clé du même nom.
  • Un exemple pour castai-cluster-controller (ce sera la même chose pour castai-agent)
castai:
  apiKey: ******
  clusterID: ******
tolerations:
  - effect: NoSchedule
    key: provisioning.cast.ai/temporary
    operator: Equal
    value: resuming

Hibernation manuelle

Le call est (relativement) simple :

curl --request POST \
     --url https://api.cast.ai/v1/kubernetes/external-clusters/<clusterid>/hibernate \
     --header 'X-API-Key: <apitoken>' \
     --header 'accept: application/json' \
     --data '{}'

Remplacer <clusterid> et <apitoken> et exécuter la commande.

  • Le cluster ID est disponible dans la console, dans la liste des clusters, première colonne.
  • Le token est celui créé dans la première phase.

Une fois exécuté, le cluster passera à l'état Hibernated et supprimera la totalité des noeuds.

#
💡
De manière générale vous préférerez sans doute planifier les arrêts et redémarrage. Cette manipulation vous permet toutefois de l'intégrer à un script ou à un ordonnanceur maison.

Vous pouvez également exécuter le call API directement depuis ce lien :

Hiberantes cluster.
Cast AI documentation will help you get started and get the most out of the platform.

Redémarrage

La requête est similaire à celle utilisée pour l'arrêt, avec quelques différences.

curl --request POST \
     --url https://api.cast.ai/v1/kubernetes/external-clusters/<clusterid>/resume \
     --header 'X-API-Key: <apitoken>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "instanceType": "e2-standard-4"
}
'

CAST a besoin d'une instance pour relancer ses services, on lui passe donc en paramètre instanceType avec le type d'instance à utiliser.

Cette instance sera supprimée automatiquement une fois le cluster relancé, mais vous pouvez tout de même modifier le call pour utiliser une instance spot.

Le call peut être exécuté directement sur cette page :

Resumes cluster.
Cast AI documentation will help you get started and get the most out of the platform.

Schedule

Create a hibernation schedule.
Create hibernation schedule

Les détails sont disponibles ici

Le payload est un mélange des deux calls précédents couplé à un cron.

L'exemple ci-dessous arrête le cluster à 18h et le relance à 9h du matin.

Attention, l'API ne peut pas deviner votre fuseau horaire. Il faudra donc donner l'heure universel (UTC).
curl --request POST \
     --url https://api.cast.ai/cluster-autoscaler/v1beta/organizations/<organizationid>/hibernation-schedules \
     --header 'X-API-Key: <apitoken>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '
{
  "enabled": true,
  "pauseConfig": {
    "enabled": true,
    "schedule": {
      "cronExpression": "0 18 * * *"
    }
  },
  "resumeConfig": {
    "enabled": true,
    "schedule": {
      "cronExpression": "0 9 * * *"
    },
    "jobConfig": {
      "nodeConfig": {
        "spotConfig": {
          "spot": true
        },
        "instanceType": "e2-standard-4"
      }
    }
  },
  "clusterAssignments": {
    "items": [
      {
        "clusterId": "<clusterid>"
      }
    ]
  },
  "name": "test"
}
'

Remplacer organizationid, clusterid et apitoken par les bonnes valeurs.

Et voilà ! Il existe d'autres calls pour lister, mettre à jour ou supprimer un schedule, les paramètres sont assez similaires.

List hibernation schedules.
Gets the list of organization hibernation schedules Max page limit is 500.
Get a hibernation schedule.
Get hibernation schedule
Delete a hibernation schedule.
Delete hibernation schedule
Update a hibernation schedule.
Update hibernation schedule