Configuration de l’Horizontal Pod Autoscaling (HPA)

Cette page détaille la configuration du système d’autoscaling pour les pods. L’autoscaling permet d’ajuster dynamiquement le nombre de pods en fonction de la charge (CPU et RAM).

Prérequis techniques

Pour que l’HPA puisse fonctionner, les conditions suivantes doivent être réunies :

  1. Metrics-server : Doit être installé sur le cluster (pour exposer les métriques cpu et memory).

  2. Resource Requests : Vos pods doivent avoir des requests et limits CPU/RAM définies. Le calcul du pourcentage se base sur ces valeurs. Des valeurs par défaut sont définies pour les pods de Cyberwatch, mais elles peuvent être ajustées dans le fichier values.yml.

Exemple d’implémentation

Copiez cette configuration dans votre fichier values.yml pour activer l’autoscaling :

autoscaling:
  # Active ou désactive l'autoscaling des ressources pour le cluster
  enabled: true
  
  targets:
    - name: sidekiq-node
      minReplicas: 1      # Nombre de pods maintenus en vie même sans activité
      maxReplicas: 5      # Limite du nombre de pods que l'autoscaling peut créer
      targetCPUUsage: 70  # Déclenche un nouveau pod si la moyenne d'utilisation CPU dépasse 70%
      targetRAMUsage: 80  # Déclenche un nouveau pod si la moyenne d'utilisation RAM dépasse 80%

    - name: container-scanner
      minReplicas: 1
      maxReplicas: 10
      targetCPUUsage: 70
      targetRAMUsage: 80

Volume de travail du pod container-scanner

Le pod container-scanner télécharge les images à analyser dans un volume de travail, dont la taille est définie par le champ containerScanner.cacheStorageSize (40Gi par défaut).

Avec la version 0.6.10 du chart Helm, chaque pod container-scanner dispose de son propre volume, créé et supprimé avec le pod, lorsque les deux conditions suivantes sont réunies :

  • container-scanner fait partie des cibles de l’autoscaling, ou containerScanner.replicaCount est supérieur à 1 ;
  • le champ global.storageClass est défini.

L’espace de stockage nécessaire est multiplié par le nombre de pods. Si la reclaimPolicy du StorageClass vaut Retain, les volumes des pods supprimés sont conservés et doivent être supprimés manuellement.

Utiliser un volume partagé

Il est aussi possible de partager un même volume entre tous les pods container-scanner, en indiquant un PersistentVolumeClaim existant dans le fichier values.yml :

containerScanner:
  existingClaim: nom-du-pvc

Pour que les pods puissent s’exécuter sur plusieurs nœuds, ce volume doit être en ReadWriteMany.

L’analyse des images repose sur Buildah en mode rootless, dont le support des systèmes de fichiers réseau (NFS, CephFS, SMB) est limité. La plupart des volumes ReadWriteMany reposent sur ces systèmes de fichiers. Selon le stockage utilisé, les pods peuvent démarrer alors que les analyses d’images échouent. Vérifier qu’une analyse d’image aboutit avant de généraliser cette configuration.