K6 loadgen
K6 loadgen fault simulates load generation on the target hosts for a specific chaos duration. This fault:
- Slows down or makes the target host unavailable due to heavy load.
- Checks the performance of the application or process running on the instance.
- Supports various types of load testing (ex. spike, smoke, stress)
Use cases
- Simulate high traffic to test the performance and reliability of RESTful APIs.
- Automate performance testing in CI/CD pipelines to catch regressions early.
- Evaluate the behavior of web applications under heavy user loads.
- Continuously monitor cloud infrastructure performance by generating synthetic traffic.
Prerequisites
- Kubernetes > 1.17 is required to execute this fault.
- The target host should be accessible.
- Ensure to create a Kubernetes secret that contains the javascript (JS) file within the Chaos Infrastructure's namespace. The easiest way to create a secret object is as follows::
An example of the JS file is as follows:
import http from "k6/http";
import { check, sleep } from "k6";
export default function () {
let res = http.get("https://google.com");
check(res, { "status is 200": (r) => r.status === 200 });
sleep(0.3);
}
kubectl create secret generic k6-script \
--from-file=<<script-path>> -n <<chaos_infrastructure_namespace>>
Mandatory tunables
Tunable | Description | Notes |
---|---|---|
SCRIPT_SECRET_NAME | Provide the k8s secret name of the JS script to run k6. | Default to k6-script. For more information, go to k6 secret |
SCRIPT_SECRET_KEY | Provide the key of the k8s secret named SCRIPT_SECRET_NAME | Default to script.js. For more information, go to k6 secret |
Optional tunables
Tunable | Description | Notes |
---|---|---|
TOTAL_CHAOS_DURATION | The time duration for chaos injection (in seconds). | Default: 60s. For more information, go to duration of the chaos. |
LOAD_IMAGE | Image used in helper pod that contains the chaos injection logic. | Default: ghcr.io/grafana/k6-operator:latest-runner . For more information, go to custom load image. |
RAMP_TIME | Wait period before and after injecting chaos (in seconds). | For example, 30s. For more information, go to ramp time. |
Permissions required
Below is a sample Kubernetes role that defines the permissions required to execute the fault.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: hce
name: k6-loadgen
spec:
definition:
scope: Namespaced # Supports "Cluster" mode too
permissions:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "get", "list", "patch", "deletecollection", "update"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "get", "list", "patch", "update"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["deployments"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["chaosEngines", "chaosExperiments", "chaosResults"]
verbs: ["create", "delete", "get", "list", "patch", "update"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "delete", "get", "list", "deletecollection"]
- apiGroups: [""]
resources: ["configmaps", "secrets"]
verbs: ["get", "list", "watch"]
K6 Secret
It defines the secret and key names for the k6 load generation script. You can adjust them using the SCRIPT_SECRET_NAME
and SCRIPT_SECRET_KEY
environment variables, respectively..
The following YAML snippet illustrates the use of this environment variable:
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: load-nginx
spec:
engineState: "active"
chaosServiceAccount: litmus-admin
experiments:
- name: k6-load-generator
spec:
components:
env:
- name: SCRIPT_SECRET_NAME
value: "k6-script"
- name: SCRIPT_SECRET_KEY
value: "script.js"
Custom load image
Image of the k6 load generator. Tune it by using the LOAD_IMAGE
environment variable.
The following YAML snippet illustrates the use of this environment variable:
# provid a custom image for load generation
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: load-nginx
spec:
engineState: "active"
chaosServiceAccount: litmus-admin
experiments:
- name: k6-load-generator
spec:
components:
env:
- name: LOAD_IMAGE
value: ghcr.io/grafana/k6-operator:latest-runner