Passer au contenu principal

Workloads (Kubernetes)

Autoscaling (HPA, VPA, KEDA)

Kubernetes fournit plusieurs mécanismes d'autoscaling complémentaires. HPA scale horizontalement (nombre de replicas) selon des métriques. VPA ajuste les ressources allouées verticalement. KEDA étend HPA avec des sources de métriques externes (queues, crons, événements).

Horizontal Pod Autoscaler (HPA)

HPA surveille des métriques et ajuste le nombre de replicas d'un Deployment, ReplicaSet ou StatefulSet. Depuis v1.23, HPA v2 est stable et supporte nativement les métriques CPU, mémoire, et des métriques custom via le Metrics API.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70    # Scale si CPU moyen > 70%
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 512Mi
  behavior:                       # Contrôle la vitesse de scale
    scaleDown:
      stabilizationWindowSeconds: 300   # Attendre 5min avant de scale down
      policies:
      - type: Percent
        value: 25
        periodSeconds: 60         # Max 25% de réduction par minute
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 30         # Doubler rapidement si besoin
# Prérequis : metrics-server installé
kubectl top pods
kubectl get hpa
kubectl describe hpa web-hpa

Vertical Pod Autoscaler (VPA)

VPA analyse la consommation historique et recommande (ou applique) des requests/limits ajustées. Il nécessite une installation séparée (non inclus dans Kubernetes). Attention : en mode Auto, VPA recrée les pods pour appliquer les changements (interruption potentielle).

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: web-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web
  updatePolicy:
    updateMode: "Off"    # Off (recommandations seules) | Auto | Recreate
  resourcePolicy:
    containerPolicies:
    - containerName: nginx
      minAllowed:
        cpu: 50m
        memory: 64Mi
      maxAllowed:
        cpu: 2
        memory: 2Gi
kubectl get vpa
kubectl describe vpa web-vpa   # Voir les recommandations dans Status

VPA et HPA ne sont pas compatibles sur les mêmes métriques CPU/mémoire. Si HPA scale sur CPU, VPA doit exclure CPU de ses recommandations.

KEDA — Kubernetes Event-Driven Autoscaling

KEDA étend HPA pour scaler sur n'importe quelle métrique externe : longueur d'une queue SQS, topics Kafka, messages RabbitMQ, métriques Prometheus, cron schedules, etc. Il peut même scaler à zéro replicas (scale-to-zero), impossible avec HPA standard.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: worker-scaledobject
spec:
  scaleTargetRef:
    name: worker
  minReplicaCount: 0          # Scale to zero possible
  maxReplicaCount: 50
  triggers:
  - type: rabbitmq
    metadata:
      host: amqp://rabbitmq.default:5672
      queueName: tasks
      queueLength: "10"       # 1 replica par 10 messages en queue
# Installer KEDA
helm install keda kedacore/keda --namespace keda --create-namespace
kubectl get scaledobjects

Cluster Autoscaler

À distinguer des autoscalers de pods : le Cluster Autoscaler ajoute ou retire des noeuds du cluster selon les besoins. Il s'intègre aux APIs des cloud providers (ASG sur AWS, MIG sur GCP). Si des pods restent en Pending faute de ressources, le CA provisionne un nouveau noeud. Si des noeuds sont sous-utilisés, le CA les drains et les supprime.

Sources