For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/cluster-autoscaler-example.md.

Exemple d'utilisation du cluster autoscaler

Voir en Markdown

Découvrez à travers un exemple concret comment activer et tester le cluster autoscaler sur un pool de nœuds OVHcloud Managed Kubernetes.

Le service OVHcloud Managed Kubernetes vous fournit des clusters Kubernetes sans les contraintes liées à leur installation ou à leur exploitation.

Au cours de la vie quotidienne de votre cluster, vous pouvez souhaiter ajuster dynamiquement sa taille pour vous adapter à vos workloads. Le cluster autoscaler simplifie cette tâche en redimensionnant automatiquement votre cluster OVHcloud Managed Kubernetes à la hausse ou à la baisse, en fonction de la demande de vos workloads.

Avant de commencer

Ce tutoriel suppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes fonctionnel et de connaissances de base sur son fonctionnement. Pour en savoir plus sur ces sujets, consultez le guide de démarrage rapide d'OVHcloud Managed Kubernetes Service.

Il suppose également que vous avez lu le guide Utiliser le cluster autoscaler.

Activer l'autoscaling sur le pool de nœuds

Le moyen le plus simple d'activer l'autoscaler consiste à utiliser l'API Kubernetes, par exemple via kubectl.

Comme expliqué dans le guide Fonctionnement des nœuds et des pools de nœuds, dans votre cluster OVHcloud Managed Kubernetes, les nœuds sont regroupés en pools de nœuds (groupes de nœuds partageant la même configuration).

L'autoscaling se configure au niveau d'un pool de nœuds, c'est-à-dire que vous ne l'activez pas sur l'ensemble du cluster, mais sur un ou plusieurs de vos pools de nœuds.

Vous pouvez activer l'autoscaler sur plusieurs pools de nœuds, chacun pouvant avoir un type d'instance différent ainsi que des limites de nombre de nœuds minimum et maximum différentes.

Info

Afin d'éviter des dépenses inattendues, vous devez veiller à ne pas activer l'autoscaling sur des pools de nœuds facturés au mois. Vous êtes toutefois autorisé à le faire si vous savez ce que vous faites.

Une configuration courante consiste à utiliser des pools de nœuds non autoscalés et facturés au mois comme base pour votre workload statique, et des pools de nœuds autoscalés et facturés à l'heure, avec des flavors plus petites, pour votre workload dynamique.

Info

Le code source de l'exemple suivant est disponible dans le dépôt GitHub public public-cloud-examples

Lorsque vous créez votre cluster, vous pouvez y démarrer un pool de nœuds par défaut, et vous pouvez en ajouter d'autres dans la section Public Cloud de l' ou directement via l'API Kubernetes.

Déployer un workload de test

Supposons que vous avez créé un cluster MKS avec un pool de nœuds dont le minimum est fixé à 1 et le maximum à 3.

Pour tester l'autoscaler, nous vous proposons d'installer un déploiement Python heavy CPU load qui déploie plusieurs instances de pods Python CPU load. L'objectif du pod Python CPU load est de consommer tout le CPU qui lui est alloué. C'est une opération intensive en CPU, mais elle utilise une quantité minimale de mémoire.

Créez un manifeste cpu-load.yaml pour le déploiement python-cpu-load :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: python-cpu-load
spec:
  selector:
    matchLabels:
      run: python-cpu-load
  replicas: 3
  template:
    metadata:
      labels:
        run: python-cpu-load
    spec:
      containers:
      - name: python-cpu-load
        image: ovhcom/python-cpu-load:1.0.0
        resources:
          limits:
            cpu: 300m
            memory: 30Mi
          requests:
            cpu: 150m
            memory: 15Mi       

Comme vous pouvez le voir, nous allons commencer par déployer 3 réplicas du pod. Chaque réplica consomme 150m de CPU (0,150 CPU), et nous utilisons des instances D2-4, disposant de 2000m de CPU (2 cœurs CPU). Dans ce tutoriel, nous allons augmenter le nombre de réplicas à 12 puis à 24, afin d'observer comment l'autoscaler fait croître le pool de nœuds à 2 puis à 3 nœuds.

Déployez le déploiement CPU load :

kubectl create ns cluster-autoscaler
kubectl apply -f cpu-load.yml -n cluster-autoscaler

Dans notre cluster d'exemple, nous déployons le workload simple, puis nous vérifions que nous n'avons toujours qu'un seul nœud dans le cluster.

$ kubectl create ns cluster-autoscaler
namespace cluster-autoscaler created

$ kubectl apply -f cpu-load.yml -n cluster-autoscaler
deployment.apps/python-cpu-load created

$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS              RESTARTS   AGE
python-cpu-load-59bfff47f4-9lgnq   0/1     ContainerCreating   0          7s
python-cpu-load-59bfff47f4-d6trc   0/1     ContainerCreating   0          7s
python-cpu-load-59bfff47f4-vzq2g   0/1     ContainerCreating   0          7s

# And after a moment, the three pods are running.
$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS    RESTARTS   AGE
python-cpu-load-59bfff47f4-9lgnq   1/1     Running   0          10s
python-cpu-load-59bfff47f4-d6trc   1/1     Running   0          8s
python-cpu-load-59bfff47f4-vzq2g   1/1     Running   0          6s

$ kubectl get nodepools
NAME            FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX  
nodepool-d2-4   d2-4     true         false           false          1         1         1            1           0     10   

Augmenter la charge du workload

Nous pouvons maintenant définir le nombre de replicas à 12, ce qui devrait suffire à déclencher la montée en charge du pool de nœuds.

kubectl scale --replicas=12 deploy/python-cpu-load -n cluster-autoscaler
$ kubectl scale --replicas=12 deploy/python-cpu-load -n cluster-autoscaler
deployment.apps/python-cpu-load scaled

$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS    RESTARTS   AGE
python-cpu-load-59bfff47f4-9lgnq   1/1     Running   0          3m54s
python-cpu-load-59bfff47f4-c9ttt   1/1     Running   0          15s
python-cpu-load-59bfff47f4-d6trc   1/1     Running   0          3m52s
python-cpu-load-59bfff47f4-m4vcw   0/1     Pending   0          15s
python-cpu-load-59bfff47f4-md69d   0/1     Pending   0          15s
python-cpu-load-59bfff47f4-n8fgl   1/1     Running   0          15s
python-cpu-load-59bfff47f4-nbwqd   1/1     Running   0          15s
python-cpu-load-59bfff47f4-nbxcj   0/1     Pending   0          15s
python-cpu-load-59bfff47f4-rbstz   0/1     Pending   0          15s
python-cpu-load-59bfff47f4-tczf2   1/1     Running   0          15s
python-cpu-load-59bfff47f4-vzq2g   1/1     Running   0          3m50s
python-cpu-load-59bfff47f4-xqd72   1/1     Running   0          15s

Comme vous pouvez le voir avec kubectl get nodepools, l'autoscaler détecte que la capacité est atteinte et demande un nouveau nœud :

$ kubectl get nodepools

NAME            FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX  
nodepool-d2-4   d2-4     true         false           false          2         1         1            1           0     10   

Et en quelques instants, le nouveau nœud est créé et actif, et tous les pods sont en cours d'exécution :

$ kubectl get nodepools
NAME            FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX  
nodepool-d2-4   d2-4     true         false           false          2         2         2            2           0     10 

$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS    RESTARTS   AGE
python-cpu-load-59bfff47f4-74pgq   1/1     Running   0          114s
python-cpu-load-59bfff47f4-9lgnq   1/1     Running   0          12m
python-cpu-load-59bfff47f4-d6trc   1/1     Running   0          12m
python-cpu-load-59bfff47f4-m4vcw   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-md69d   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-n8fgl   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-nbwqd   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-nbxcj   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-rbstz   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-tczf2   1/1     Running   0          9m13s
python-cpu-load-59bfff47f4-vzq2g   1/1     Running   0          12m
python-cpu-load-59bfff47f4-xqd72   1/1     Running   0          9m13s

La montée en charge fonctionne comme prévu !

Si nous demandons maintenant au déploiement d'avoir 24 réplicas :

kubectl scale --replicas=24 deploy/python-cpu-load -n cluster-autoscaler

L'autoscaler détectera des nœuds en état Pending et ajoutera un troisième nœud :

$ kubectl scale --replicas=24 deploy/python-cpu-load -n cluster-autoscaler
deployment.apps/python-cpu-load scaled

$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS    RESTARTS   AGE
python-cpu-load-59bfff47f4-62ftv   0/1     Pending   0          36s
python-cpu-load-59bfff47f4-6lfp8   0/1     Pending   0          36s
python-cpu-load-59bfff47f4-6rqdf   1/1     Running   0          36s
python-cpu-load-59bfff47f4-74pgq   1/1     Running   0          3m12s
python-cpu-load-59bfff47f4-9lgnq   1/1     Running   0          14m
python-cpu-load-59bfff47f4-cb7w6   0/1     Pending   0          36s
python-cpu-load-59bfff47f4-d6trc   1/1     Running   0          14m
python-cpu-load-59bfff47f4-g6pql   1/1     Running   0          36s
python-cpu-load-59bfff47f4-hvvnx   0/1     Pending   0          36s
python-cpu-load-59bfff47f4-l65r9   1/1     Running   0          36s
python-cpu-load-59bfff47f4-lbpd2   0/1     Pending   0          36s
python-cpu-load-59bfff47f4-lsj7t   1/1     Running   0          36s
python-cpu-load-59bfff47f4-lx9xb   1/1     Running   0          36s
python-cpu-load-59bfff47f4-m4vcw   1/1     Running   0          10m
python-cpu-load-59bfff47f4-md69d   1/1     Running   0          10m
python-cpu-load-59bfff47f4-mjsvs   0/1     Pending   0          36s
python-cpu-load-59bfff47f4-n8fgl   1/1     Running   0          10m
python-cpu-load-59bfff47f4-nbwqd   1/1     Running   0          10m
python-cpu-load-59bfff47f4-nbxcj   1/1     Running   0          10m
python-cpu-load-59bfff47f4-rbstz   1/1     Running   0          10m
python-cpu-load-59bfff47f4-tczf2   1/1     Running   0          10m
python-cpu-load-59bfff47f4-vzq2g   1/1     Running   0          14m
python-cpu-load-59bfff47f4-xqd72   1/1     Running   0          10m
python-cpu-load-59bfff47f4-xt5tk   0/1     Pending   0          36s

$ kubectl get nodepools
NAME           FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX
nodepool-d24   d2-4     true         false           false          3         2         2            2           0     10 

$ kubectl get nodepools
NAME           FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX
nodepool-d24   d2-4     true         false           false          3         3         3            3           0     10 

$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS    RESTARTS   AGE
python-cpu-load-59bfff47f4-62ftv   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-6lfp8   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-6rqdf   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-74pgq   1/1     Running   0          8m57s
python-cpu-load-59bfff47f4-9lgnq   1/1     Running   0          19m
python-cpu-load-59bfff47f4-cb7w6   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-d6trc   1/1     Running   0          19m
python-cpu-load-59bfff47f4-g6pql   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-hvvnx   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-l65r9   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-lbpd2   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-lsj7t   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-lx9xb   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-m4vcw   1/1     Running   0          16m
python-cpu-load-59bfff47f4-md69d   1/1     Running   0          16m
python-cpu-load-59bfff47f4-mjsvs   1/1     Running   0          6m21s
python-cpu-load-59bfff47f4-n8fgl   1/1     Running   0          16m
python-cpu-load-59bfff47f4-nbwqd   1/1     Running   0          16m
python-cpu-load-59bfff47f4-nbxcj   1/1     Running   0          16m
python-cpu-load-59bfff47f4-rbstz   1/1     Running   0          16m
python-cpu-load-59bfff47f4-tczf2   1/1     Running   0          16m
python-cpu-load-59bfff47f4-vzq2g   1/1     Running   0          19m
python-cpu-load-59bfff47f4-xqd72   1/1     Running   0          16m
python-cpu-load-59bfff47f4-xt5tk   1/1     Running   0          6m21s

Réduire la charge

Réduisons à nouveau le déploiement pour revenir à 3 réplicas :

kubectl scale --replicas=3 deploy/python-cpu-load -n cluster-autoscaler

En quelques instants, seuls trois pods subsisteront :

$ kubectl scale --replicas=3 deploy/python-cpu-load -n cluster-autoscaler
deployment.apps/python-cpu-load scaled

$ kubectl get pods -n cluster-autoscaler
NAME                               READY   STATUS    RESTARTS   AGE
python-cpu-load-59bfff47f4-6lfp8   1/1     Running   0          8m42s
python-cpu-load-59bfff47f4-cb7w6   1/1     Running   0          8m42s
python-cpu-load-59bfff47f4-lbpd2   1/1     Running   0          8m42s

L'autoscaler détectera que les nœuds sont en dessous de la valeur du paramètre scale-down-utilization-threshold (le niveau d'utilisation du nœud, défini comme la somme des ressources demandées divisée par la capacité, en dessous duquel un nœud peut être considéré comme éligible à la réduction, 0,5 par défaut), et marquera les nœuds 2 et 3 comme inutiles.

Après quelques minutes, selon la valeur de scale-down-unneeded-time (paramètre qui définit la durée pendant laquelle un nœud doit être inutile avant d'être éligible à la réduction, 10 minutes par défaut), le nœud sera supprimé et le cluster sera réduit.

Après 10 minutes, nous revenons à 2 nœuds :

$ kubectl get nodepools
NAME           FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX
nodepool-d24   d2-4     true         false           false          2         2         2            2           1     10 

Et 10 minutes plus tard, il ne reste qu'un seul nœud :

$ kubectl get nodepools
NAME           FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX
nodepool-d24   d2-4     true         false           false          1         1         1            1           1     10 

Suppression (nettoyage)

Pour nettoyer votre cluster, supprimez simplement votre déploiement python-cpu-load :

 kubectl delete -f cpu-load.yml -n cluster-autoscaler 
$ kubectl delete -f cpu-load.yml -n cluster-autoscaler
deployment.apps "python-cpu-load" deleted

Conclusion

Dans ce tutoriel, nous avons vu comment activer l'autoscaler sur un pool de nœuds de votre cluster OVHcloud Managed Kubernetes, et comment utiliser un workload d'exemple pour tester son fonctionnement.

Aller plus loin

Pour obtenir une vue d'ensemble du service OVHcloud Managed Kubernetes, consultez la page OVHcloud Managed Kubernetes.

Sinon, pour passer directement à l'utilisation pratique de votre cluster Kubernetes, nous vous invitons à consulter nos tutoriels.

  • Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.

  • Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?