DevOps
Test de charge

Faire des tests de charge avec k6

k6 est un outil open source moderne pour réaliser des tests de charge et de performance sur des APIs ou des sites web. Il permet de simuler de nombreux utilisateurs virtuels, de mesurer la latence, le taux d’erreur et d’identifier les points de contention.

Installation

Sous Linux :

sudo apt update
sudo apt install -y gnupg2 ca-certificates
curl -s https://dl.k6.io/key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/k6-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt update
sudo apt install k6

Exemple de script de test

Créez un fichier script.js :

import http from 'k6/http';
import { check, sleep } from 'k6';

export let options = {
  vus: 10, // nombre d'utilisateurs virtuels
  duration: '30s', // durée du test
};

export default function () {
  let res = http.get('https://test-api.example.com/health');
  check(res, {
    'status is 200': (r) => r.status === 200,
  });
  sleep(1);
}

Lancer un test de charge

k6 run script.js

Vous obtiendrez un rapport en temps réel avec les métriques principales : requêtes/s, latence, taux d’erreur, etc.

Scénarios avancés

  • Augmenter progressivement la charge :
    export let options = {
      stages: [
        { duration: '1m', target: 20 }, // montée en charge
        { duration: '3m', target: 20 }, // palier
        { duration: '1m', target: 0 },  // descente
      ],
    };
  • Tests sur endpoints protégés : ajoutez des headers d’authentification (Bearer, Basic, etc).
  • Tests de POST :
    http.post('https://test-api.example.com/login', JSON.stringify({user: 'foo', pass: 'bar'}), { headers: { 'Content-Type': 'application/json' } });

Analyse des résultats

  • Analysez les métriques : latence moyenne, 95e percentile, taux d’erreur.
  • Exportez les résultats en JSON :
    k6 run --out json=résultats.json script.js
  • Intégrez k6 dans vos pipelines CI/CD pour tester la robustesse à chaque déploiement.

Bonnes pratiques

  • Commencez par des tests simples, puis complexifiez les scénarios.
  • Testez en environnement de préproduction pour éviter d’impacter la prod.
  • Surveillez les ressources du serveur cible pendant les tests (CPU, RAM, logs).
  • Documentez vos scripts et résultats pour faciliter le suivi.

Ressources utiles

Automatiser le lancement des tests de charge

Pour automatiser l’exécution des tests de charge k6, vous pouvez intégrer le lancement dans vos scripts shell, Makefile ou pipelines CI/CD (GitLab CI, GitHub Actions, etc).

Exemple avec un Makefile

test-charge:
    k6 run script.js

Lancez simplement :

make test-charge

Exemple avec GitLab CI

Ajoutez un job dans .gitlab-ci.yml :

test_performance:
  image: grafana/k6:latest
  script:
    - k6 run script.js
  only:
    - main

Exemple avec GitHub Actions

name: Test de charge k6
on: [push]
jobs:
  k6:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Installer k6
        run: |
          sudo apt-get update && sudo apt-get install -y gnupg2 ca-certificates
          curl -s https://dl.k6.io/key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/k6-archive-keyring.gpg
          echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
          sudo apt-get update && sudo apt-get install -y k6
      - name: Lancer le test de charge
        run: k6 run script.js

Automatiser les tests permet de garantir la performance à chaque modification ou déploiement.

Lancer des tests k6 avec helm test et récupérer les résultats

Helm permet d’automatiser l’exécution de tests de charge k6 lors du déploiement d’un chart. Il suffit d’ajouter un pod de test dans le dossier templates/tests/ de votre chart Helm :

apiVersion: v1
kind: Pod
metadata:
  name: "k6-load-test"
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: k6
      image: grafana/k6:latest
      command: ["k6", "run", "/scripts/script.js"]
      volumeMounts:
        - name: k6-scripts
          mountPath: /scripts
  restartPolicy: Never
  volumes:
    - name: k6-scripts
      configMap:
        name: k6-scripts
  • Placez votre script k6 dans un ConfigMap nommé k6-scripts.
  • Lancez les tests après le déploiement :
    helm test mon-app
  • Récupérez les logs du pod de test pour voir les résultats :
    kubectl logs pod/k6-load-test

Cette méthode permet d’intégrer les tests de charge dans vos workflows Helm et d’automatiser leur exécution à chaque déploiement.