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é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-agentetcastai-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
tolerationsdans lesvaluesen 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: resumingHibernation 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.

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

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 :

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.
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.










