Home

Awesome

Continuous K6 Performance Tests on K8s

Continuous K6 performance and load tests on Kubernetes. We will spin up an InfluxDB to store our load test data and Grafana to display. The K6 load test will continuously be executed using a CronJob.

Usage with plain YAML

# first we deploy the demo application deployment
$ kubectl apply -f continuous-nginx.yaml

# next you can deploy the K6 stack with InfluxDB and Grafana
$ kubectl create namespace k6
$ kubectl apply -f continuous-k6k8s.yaml -n k6

# open Grafana and import on of these K6 load test dashboards
# - see https://grafana.com/dashboards/2587
# - see https://grafana.com/grafana/dashboards/4411
$ open http://localhost:3000

Usage with Pulumi

Just for fun, I also created Pulumi infrastructure as code to create the Continuous K6 load test stack.

# to create the Pulumi code from scratch type this
$ pulumi new kubernetes-typescript --force
$ kube2pulumi typescript -f continuous-k6k8s.yaml

# and fire up the K6 stack
$ pulumi up

# open Grafana and import on of these K6 load test dashboards
# - see https://grafana.com/dashboards/2587
# - see https://grafana.com/grafana/dashboards/4411
$ open http://localhost:3000

Create retention policy for InfluxDB

If you run the load tests continuously, you may want to create a retention policy to cleanup the test data from time to time.

# connect to the influx pod
$ kubectl exec -it pod/influxdb -- /bin/sh

$ influx
$ create retention policy "k6_1d" on "k6" duration 1d replication 1 default
$ exit

Adhoc K6 load test with custom Docker image

# build and push the K6 load test image
$ docker build -t k6-nginx-test .
$ docker tag k6-nginx-test lreimer/k6-nginx-test
$ docker push lreimer/k6-nginx-test

# run the image as a pod
# be sure to pass the --restart flag, otherwise the containers gets restarted
$ kubectl run k6-nginx-test --image lreimer/k6-nginx-test --restart=Never --attach
$ kubectl delete pod/k6-nginx-test

Maintainer

M.-Leander Reimer (@lreimer), mario-leander.reimer@qaware.de

License

This software is provided under the MIT open source license, read the LICENSE file for details.