samedi, mai 03, 2025

Conteneur k6, Grafana et InfluxDB2 pour des tests de montée en charge

L'emploi d'un conteneur dans le contexte de tests de charge permet de réduire l'effort et les ressources nécessaires pour leur mise en place et leur exécution.

K6, Grafana et InfluxDB offrent une base extensible d'outils et de standards libres permettant de réaliser cela sous Docker.

Conteneur K6 avec extension InfluxDB 2

Uniquement la version 1 de InfluxDB est nativement supportée dans K6, c'est pour cela que le conteneur K6 rajoute l'extension de la version 2.

Dockerfile

FROM golang:1.23 as builder

WORKDIR /app

RUN go install go.k6.io/xk6/cmd/xk6@latest
RUN /go/bin/xk6 build --with github.com/grafana/xk6-output-influxdb
RUN chmod 777 k6

FROM grafana/k6:latest
COPY --from=builder /app/k6 /app/k6
ENTRYPOINT ["/app/k6"]
CMD ["run"]

docker-compose.yml

Et grâce à docker-compose on peut construire et interconnecter tous les services:
version: '3'

services:

  influxdb:
image: influxdb:latest
container_name: influxdb
environment:
  - INFLUXDB_DB=k6                            # Créer une base de données 'k6' automatiquement
  - INFLUXDB_ADMIN_USER=admin                 # identifiant administrateur
  - INFLUXDB_ADMIN_PASSWORD=adminpassword     # mot de passe administrateur
  - INFLUXDB_HTTP_AUTH_ENABLED=true           # Activer l'authentication pour InfluxDB
  - DOCKER_INFLUXDB_INIT_MODE=setup
  - DOCKER_INFLUXDB_INIT_USERNAME=user        # identifiant utilisateur pour la connexion à l'interface utilisateur web
  - DOCKER_INFLUXDB_INIT_PASSWORD=userpassword # mot de passe utilisateur
  - DOCKER_INFLUXDB_INIT_ORG=my_organization           # nom de votre organisation.  Utilisée par Telegraf
  - DOCKER_INFLUXDB_INIT_BUCKET=my_organization_bucket # le bucket par défaut
  - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token # le jeton de sécurité utilisé par K6 pour utiliser l'API de Telegraf
ports:
  - "8086:8086" # le port du service
volumes:
  - ./influxdb-data:/var/lib/influxdb2:rw          # Pour le stockage permanent des données InfluxDB

  grafana:
image: grafana/grafana:latest
container_name: grafana
depends_on:
  - influxdb
environment:
  - GF_SECURITY_ADMIN_USER=admin          # identifiant utilisateur pour la connexion à l'interface utilisateur web
  - GF_SECURITY_ADMIN_PASSWORD=adminpassword  # mot de passe utilisateur
  - GF_AUTH_ANONYMOUS_ENABLED=true
  - GF_AUTH_BASIC_ENABLED=false
command: |
  chown grafana:root /var/lib/grafana/dashboards && \  
  chown grafana:root /etc/grafana/provisioning 
ports:
  - "3000:3000"
volumes:
  - ./dashboards:/var/lib/grafana/dashboards # le répertoire contentant le tableau de bord par défaut
  - ./provisioning:/etc/grafana/provisioning # le répertoire pour configurer grafana afin de situer où sont les fichiers du tableau de bord et les données InfluxDB
  - ./grafana.ini:/etc/grafana/grafana.ini # fichier contenant les configuration par défaut de grafana

  k6-with-influxdb2:
build:
  context: .  # Le répertoire où est situé le Dockerfile créé ci-dessus.
  dockerfile: Dockerfile  # Le fichier Dockerfile (qui compile K6 avec l'extension InfluxDB2)
image: k6-with-influxdb2  # Nom de l'image résultante.
# entrypoint: /bin/sh # enlever les deux lignes de commentaire pour permettre de débuger (permet d'avoir un shell dans le conteneur)
# user: root
depends_on:
  - influxdb # dépend de l'image influxdb pour les données.
volumes:
  - ./scripts:/scripts  # répertoire dans lequel sera stocké les scripts K6 pour les tests de charge.
command: |
  chown -R root:root /scripts
environment:
  - K6_INFLUXDB_ADDR=http://influxdb:8086 # pointer vers la base de données influxdb2
  - K6_INFLUXDB_INSECURE=true  # pas de SSL
  - K6_INFLUXDB_BUCKET=my_organization_bucket
  - K6_INFLUXDB_USERNAME=admin
  - K6_INFLUXDB_PASSWORD=adminpassword
  - K6_INFLUXDB_ORGANIZATION=my_organization
  - K6_INFLUXDB_TOKEN=my-super-secret-auth-token

volumes:
  influxdb-data:
  dashboards:
  provisioning:
  scripts:

Lancer le tests de charge K6

Une fois que l'image est construite et les conteneurs lancés avec la commande docker-compose up, les scripts de tests de charge peuvent être stockés dans le répertoire local ./scripts et lancés avec la commande:

sudo docker-compose run --rm k6-with-influxdb2 run ./scripts/mon_test_charge.js -o xk6-influxdb

Aller plus loin.

Bien entendu il faudra adapter l'exemple pour prendre en compte les paramètres et contraintes de sécurité exigés, mais on pourrait certainement étendre le concept pour l'intégrer dans un contexte d'orchestration de services conteneurisés, par exemple dans un pipleline CI/CD.

Libellés : , ,