From e9d9b484d9cf6b2a6894251eaa17c650e13a6c15 Mon Sep 17 00:00:00 2001 From: Pablo Chacin Date: Wed, 28 Aug 2024 14:47:11 +0200 Subject: [PATCH] document kubernetes example Signed-off-by: Pablo Chacin --- Dockerfile | 26 + README.md | 16 + examples/kubernetes/README.md | 127 ++ examples/kubernetes/deployment/catalog.json | 6 + examples/kubernetes/deployment/k6build.yaml | 71 + examples/kubernetes/deployment/k6exec.yaml | 20 + .../kubernetes/images/architecture.excalidraw | 1235 +++++++++++++++++ examples/kubernetes/images/architecture.png | Bin 0 -> 60768 bytes examples/kubernetes/tests/sqlite.js | 24 + 9 files changed, 1525 insertions(+) create mode 100644 Dockerfile create mode 100644 examples/kubernetes/README.md create mode 100644 examples/kubernetes/deployment/catalog.json create mode 100644 examples/kubernetes/deployment/k6build.yaml create mode 100644 examples/kubernetes/deployment/k6exec.yaml create mode 100644 examples/kubernetes/images/architecture.excalidraw create mode 100644 examples/kubernetes/images/architecture.png create mode 100644 examples/kubernetes/tests/sqlite.js diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7c47f24 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +ARG GO_VERSION=1.22.4 +ARG VARIANT=bookworm +FROM golang:${GO_VERSION}-${VARIANT} as builder + +WORKDIR /build + +COPY . . + +ARG GOFLAGS="-ldflags=-w -ldflags=-s" +RUN CGO_ENABLED=0 go build -o k6build -trimpath ./cmd/k6build/main.go + +# k6build server requires golang toolchain +FROM golang:${GO_VERSION}-${VARIANT} + +RUN addgroup --gid 1000 k6build && \ + adduser --uid 1000 --ingroup k6build \ + --home /home/k6build --shell /bin/sh \ + --disabled-password --gecos "" k6build + +COPY --from=builder /build/k6build /usr/local/bin/ + +WORKDIR /home/k6build + +USER k6build + +ENTRYPOINT ["/usr/local/bin/k6build"] \ No newline at end of file diff --git a/README.md b/README.md index 4f98c84..3ec4743 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ +# k6build + +k6build builds custom k6 binaries with extensions + +## Examples + +The following sections describe different usage scenarios. + +### kubernetes + +[examples/kubernetes](examples/kubernetes/) describes how to run `k6build` in a kubernetes cluster and execute `k6` tests in a pod using [k6exec](https://github.com/grafana/k6exec). + +### k6-operator + +TODO: use [k6-operator](https://github.com/grafana/k6-operator) for running the tests using a custom image. + # k6build diff --git a/examples/kubernetes/README.md b/examples/kubernetes/README.md new file mode 100644 index 0000000..2d6ad48 --- /dev/null +++ b/examples/kubernetes/README.md @@ -0,0 +1,127 @@ +# Running k6build in Kubernetes + +This example shows how to deploy k6build as a service in Kubernetes and use [k6exec](https://github.com/grafana/k6exec) for running tests using extensions. + +![Fig. Architecture](images/architecture.png) + + +## Requirements + +This example requires access to a Kubernetes cluster and rights to deploy a service and create secrets. + +For testing, you can use [minikube](https://minikube.sigs.k8s.io/docs/) or [k3d](https://k3d.io/). + +### Build the image + +Build the [k6build image](/Dockerfile) from this project's root directory: + +``` +docker build -t grafana/k6build . +``` + +Make the image available to your Kubernetes cluster by loading it into a repository. + +This process depends on your cluster's setup. Following sections explain the process for common test cluster environments. + +#### Minikube + +If you are using minikube, you can use the following command: + +``` +minikube image load grafana/k6build +``` + +#### k3d + +If you are using k3d, you can use the following command: + +``` +k3d image import grafana/k6build +``` + +### Create the dependencies catalog + +k6build uses a [catalog](https://github.com/grafana/k6catalog) that specifies the versions supported for `k6` and the supported extensions. + +The `k6build` service expects this catalog to be in the `k6build-catalog` [configmap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/). + +The [deployment/catalog.json](deployment/catalog.json) file contains a sample catalog. + +Edit it to your needs (e.g. supported k6 versions) and create a configmap: + +``` +kubectl create configmap k6build-catalog --from-file deployment/catalog.json +configmap/k6build-catalog created +``` + +### Deploy service + +The [deployment/k6build.yaml](deployment/k6build.yaml) file contains the manifests for deploying as a service. It also creates a cache server to support the downloading of custom `k6` binaries. + +Deploy these components with the following command: + +``` +kubectl apply -f deployment/k6build.yaml +pod/cachesrv created +service/cachesrv created +pod/k6build created +service/k6build created +``` + +### Upload the test + +The test must be available as a config map. + +``` +kubectl create configmap k6test --from-file tests/sqlite.js +configmap/k6test created + +``` + +### Run test using k6exec + +The [deployment/k6exec.yaml](deployment/k6exec.yaml) file contains the manifest for running a job that executes the test from the `k6test` configmap. + +``` +kubectl create -f deployment/k6exec.yaml +pod/k6exec-2tr2j created + +``` + +> Notice that each type a pod is created using the `deployment/k6exec.yaml` manifest, it is given a different name. + +Get test results with the following command: + +``` +kubectl logs k6exec-2tr2j -f + + /\ |‾‾| /‾‾/ /‾‾/ + /\ / \ | |/ / / / + / \/ \ | ( / ‾‾\ + / \ | |\ \ | (‾) | + / __________ \ |__| \__\ \_____/ .io + + execution: local + script: test/sqlite.js + output: - + + scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop): + * default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s) + +time="2024-08-28T12:09:23Z" level=info msg="key: plugin-name, value: k6-plugin-sql" source=console + + █ setup + + █ teardown + + data_received........: 0 B 0 B/s + data_sent............: 0 B 0 B/s + iteration_duration...: avg=7.16ms min=27.68µs med=10.56ms max=10.91ms p(90)=10.84ms p(95)=10.87ms + iterations...........: 1 44.591994/s + + +running (00m00.0s), 0/1 VUs, 1 complete and 0 interrupted iterations +default ✓ [ 100% ] 1 VUs 00m00.0s/10m0s 1/1 iters, 1 per VU +``` + +> The first time you run the test this command may take time to show any result while the binary is compiled. Subsequent executions should run almost immediately. \ No newline at end of file diff --git a/examples/kubernetes/deployment/catalog.json b/examples/kubernetes/deployment/catalog.json new file mode 100644 index 0000000..1dcb3a4 --- /dev/null +++ b/examples/kubernetes/deployment/catalog.json @@ -0,0 +1,6 @@ +{ + "k6": {"module": "go.k6.io/k6", "versions": ["v0.50.0", "v0.51.0"]}, + "k6/x/kubernetes": {"module": "github.com/grafana/xk6-kubernetes", "versions": ["v0.8.0","v0.9.0"]}, + "k6/x/sql": {"module": "github.com/grafana/xk6-sql", "versions": ["v0.4.0"]}, + "k6/x/output-kafka": {"module": "github.com/grafana/xk6-output-kafka", "versions": ["v0.7.0"]} +} diff --git a/examples/kubernetes/deployment/k6build.yaml b/examples/kubernetes/deployment/k6build.yaml new file mode 100644 index 0000000..d0182bb --- /dev/null +++ b/examples/kubernetes/deployment/k6build.yaml @@ -0,0 +1,71 @@ +kind: Pod +apiVersion: v1 +metadata: + name: cachesrv + labels: + app: cachesrv +spec: + containers: + - name: cachesrv + image: grafana/k6build + imagePullPolicy: Never + command: ["k6build", "cache", "--log-level", "DEBUG", "--download-url", "http://cachesrv:9000/cache"] + +--- +kind: Service +apiVersion: v1 +metadata: + name: cachesrv +spec: + selector: + app: cachesrv + type: LoadBalancer + ports: + - port: 9000 + +--- +kind: Pod +apiVersion: v1 +metadata: + name: k6build + labels: + app: k6build +spec: + containers: + - name: buildsrv + image: grafana/k6build + imagePullPolicy: Never + command: + - "k6build" + - "server" + - "--verbose" + - "--log-level" + - "DEBUG" + - "--cache-url" + - "http://cachesrv:9000/cache" + - "-e" + - "CGO_ENABLED=1" + volumeMounts: + - mountPath: "/home/k6build" + name: catalog + readOnly: true + - mountPath: "/home/k6build/.cache" + name: gocache + volumes: + - name: catalog + configMap: + name: k6build-catalog + - name: gocache + emptyDir: {} + +--- +kind: Service +apiVersion: v1 +metadata: + name: k6build +spec: + selector: + app: k6build + type: LoadBalancer + ports: + - port: 8000 diff --git a/examples/kubernetes/deployment/k6exec.yaml b/examples/kubernetes/deployment/k6exec.yaml new file mode 100644 index 0000000..398964c --- /dev/null +++ b/examples/kubernetes/deployment/k6exec.yaml @@ -0,0 +1,20 @@ +kind: Pod +apiVersion: v1 +metadata: + generateName: k6exec- + labels: + app: k6exec +spec: + restartPolicy: Never + containers: + - name: k6exec + image: ghcr.io/grafana/k6exec:latest + imagePullPolicy: IfNotPresent + command: ["k6exec", "--build-service-url", "http://k6build:8000", "run", "test/sqlite.js"] + volumeMounts: + - mountPath: "/home/k6exec/test" + name: test + volumes: + - name: test + configMap: + name: k6test diff --git a/examples/kubernetes/images/architecture.excalidraw b/examples/kubernetes/images/architecture.excalidraw new file mode 100644 index 0000000..c1d3753 --- /dev/null +++ b/examples/kubernetes/images/architecture.excalidraw @@ -0,0 +1,1235 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "Rt4GphvHU5795MJMiO9Xp", + "type": "rectangle", + "x": 325.73062884807587, + "y": -134.74151398738218, + "width": 138, + "height": 120, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": { + "type": 3 + }, + "seed": 967843734, + "version": 89, + "versionNonce": 2144908374, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "8mmsatPcZx4qLLtYYlbs1" + } + ], + "updated": 1724848321765, + "link": null, + "locked": false + }, + { + "id": "8mmsatPcZx4qLLtYYlbs1", + "type": "text", + "x": 366.29312884807587, + "y": -84.34151398738217, + "width": 56.875, + "height": 19.2, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 247552918, + "version": 32, + "versionNonce": 313244054, + "isDeleted": false, + "boundElements": null, + "updated": 1724848321765, + "link": null, + "locked": false, + "text": "script", + "fontSize": 16, + "fontFamily": 3, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Rt4GphvHU5795MJMiO9Xp", + "originalText": "script", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "id": "0D9YgqACS6le7AjyInh_G", + "type": "rectangle", + "x": 309.73062884807587, + "y": -163.74151398738218, + "width": 171.99999999999997, + "height": 167, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": null, + "seed": 1171025814, + "version": 259, + "versionNonce": 2003572438, + "isDeleted": false, + "boundElements": [ + { + "id": "iJbyBwrA-kdllHKJYkOHX", + "type": "arrow" + } + ], + "updated": 1724848321765, + "link": null, + "locked": false + }, + { + "id": "XwMQCeOKuRw1mKbVcAgVj", + "type": "text", + "x": 318.73062884807587, + "y": -159.74151398738218, + "width": 85, + "height": 19.2, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1564717962, + "version": 82, + "versionNonce": 2120800598, + "isDeleted": false, + "boundElements": null, + "updated": 1724848321765, + "link": null, + "locked": false, + "text": "configmap", + "fontSize": 16, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "configmap", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "id": "AxzBh-hgEypUvoUO8OaT8", + "type": "rectangle", + "x": 571.7306288480759, + "y": -168.74151398738218, + "width": 174, + "height": 176, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": null, + "seed": 944721110, + "version": 144, + "versionNonce": 1303491798, + "isDeleted": false, + "boundElements": null, + "updated": 1724848051543, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 108, + "versionNonce": 1331765962, + "index": "a5", + "isDeleted": false, + "id": "MrrTcDt1tHhlgya7fYE5Y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 590.7306288480759, + "y": -136.74151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 138, + "height": 120, + "seed": 354035286, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "8GkzOzp-CTy104tQxHNaY" + }, + { + "id": "SeJXS2JTLx_kG3Z7UB3l4", + "type": "arrow" + }, + { + "id": "dy0GU6SqJfke2ziAxXzbd", + "type": "arrow" + }, + { + "id": "iJbyBwrA-kdllHKJYkOHX", + "type": "arrow" + }, + { + "id": "vNjC-PnYoiSspAIGw3VzR", + "type": "arrow" + } + ], + "updated": 1724848381083, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 53, + "versionNonce": 1266895510, + "index": "a6", + "isDeleted": false, + "id": "8GkzOzp-CTy104tQxHNaY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 631.2931288480759, + "y": -86.34151398738217, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 56.875, + "height": 19.2, + "seed": 586083222, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848009384, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "k6exec", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "MrrTcDt1tHhlgya7fYE5Y", + "originalText": "k6exec", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "text", + "version": 118, + "versionNonce": 1260843734, + "index": "a7", + "isDeleted": false, + "id": "62HHH2UnAEuFHSM9yMQEN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 582.2306288480759, + "y": -164.3415139873822, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 28.75, + "height": 19.2, + "seed": 1212083722, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848024641, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "Pod", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Pod", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 211, + "versionNonce": 978207126, + "index": "aA", + "isDeleted": false, + "id": "i0gHncyuhEp5QgcgP36UW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 947.7306288480759, + "y": -143.74151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 138, + "height": 120, + "seed": 154260234, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "HueqLYsJaJ0vgi8THsgqd" + }, + { + "id": "SeJXS2JTLx_kG3Z7UB3l4", + "type": "arrow" + }, + { + "id": "za6EUjImrkawN35sH-CRV", + "type": "arrow" + }, + { + "id": "vNjC-PnYoiSspAIGw3VzR", + "type": "arrow" + } + ], + "updated": 1724848375223, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 171, + "versionNonce": 551676950, + "index": "aB", + "isDeleted": false, + "id": "HueqLYsJaJ0vgi8THsgqd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 979.2306288480759, + "y": -102.94151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 75, + "height": 38.4, + "seed": 911663562, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848351610, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "k6build \nserver", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "i0gHncyuhEp5QgcgP36UW", + "originalText": "k6build server", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "text", + "version": 186, + "versionNonce": 1978281802, + "index": "aC", + "isDeleted": false, + "id": "2kU1RYhf56l6EgXUHPVUw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 938.2306288480759, + "y": -168.3415139873822, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 28.75, + "height": 19.2, + "seed": 23861386, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848385518, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "Pod", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Pod", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 339, + "versionNonce": 1147609098, + "index": "aD", + "isDeleted": false, + "id": "u4uDSiMCAkH7knEgUJuZT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 930.7306288480759, + "y": 65.25848601261782, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 174, + "height": 176, + "seed": 2872854, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "za6EUjImrkawN35sH-CRV", + "type": "arrow" + } + ], + "updated": 1724848355893, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 330, + "versionNonce": 1966602582, + "index": "aE", + "isDeleted": false, + "id": "zUtiT7wYWYVxufAurYZnN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 952.7306288480759, + "y": 98.25848601261782, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 138, + "height": 120, + "seed": 1739891542, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "1t9HwU4dkeef5nWtCfh1Z" + }, + { + "id": "dy0GU6SqJfke2ziAxXzbd", + "type": "arrow" + } + ], + "updated": 1724848351610, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 296, + "versionNonce": 931011542, + "index": "aF", + "isDeleted": false, + "id": "1t9HwU4dkeef5nWtCfh1Z", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 988.6056288480759, + "y": 139.05848601261783, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 66.25, + "height": 38.4, + "seed": 389138582, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848351610, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "k6build\ncache", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "zUtiT7wYWYVxufAurYZnN", + "originalText": "k6build\ncache", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "text", + "version": 343, + "versionNonce": 272118038, + "index": "aG", + "isDeleted": false, + "id": "oBJrWz8-au44FGp1jSbS1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 944.2306288480759, + "y": 70.6584860126178, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 28.75, + "height": 19.2, + "seed": 1045972438, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848351610, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "Pod", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Pod", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "id": "SeJXS2JTLx_kG3Z7UB3l4", + "type": "arrow", + "x": 728.7306288480759, + "y": -103.74151398738218, + "width": 195, + "height": 0, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": { + "type": 2 + }, + "seed": 773445194, + "version": 187, + "versionNonce": 290314582, + "isDeleted": false, + "boundElements": null, + "updated": 1724848393628, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 195, + 0 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "MrrTcDt1tHhlgya7fYE5Y", + "focus": -0.45, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "i0gHncyuhEp5QgcgP36UW", + "focus": 0.3333333333333333, + "gap": 24, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "za6EUjImrkawN35sH-CRV", + "type": "arrow", + "x": 1022.7306288480759, + "y": 1.2584860126178228, + "width": 1.1572908078342152, + "height": 64, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": { + "type": 2 + }, + "seed": 1738840918, + "version": 246, + "versionNonce": 328991638, + "isDeleted": false, + "boundElements": null, + "updated": 1724848362713, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.1572908078342152, + 64 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "i0gHncyuhEp5QgcgP36UW", + "focus": -0.06367947042300588, + "gap": 25, + "fixedPoint": null + }, + "endBinding": { + "elementId": "u4uDSiMCAkH7knEgUJuZT", + "focus": 0.08746420774262165, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "type": "arrow", + "version": 316, + "versionNonce": 714291978, + "index": "aJ", + "isDeleted": false, + "id": "vNjC-PnYoiSspAIGw3VzR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 925.2306288480759, + "y": -67.74151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 194, + "height": 1, + "seed": 567899018, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1724848397476, + "link": null, + "locked": false, + "startBinding": { + "elementId": "i0gHncyuhEp5QgcgP36UW", + "focus": -0.2572807242292254, + "gap": 22.5, + "fixedPoint": null + }, + "endBinding": { + "elementId": "MrrTcDt1tHhlgya7fYE5Y", + "focus": 0.17179093005380477, + "gap": 2.5, + "fixedPoint": null + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -194, + 1 + ] + ], + "elbowed": false + }, + { + "id": "dy0GU6SqJfke2ziAxXzbd", + "type": "arrow", + "x": 659.7306288480759, + "y": -15.741513987382177, + "width": 270, + "height": 181.60926811129977, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aK", + "roundness": { + "type": 2 + }, + "seed": 671594122, + "version": 300, + "versionNonce": 98197142, + "isDeleted": false, + "boundElements": [], + "updated": 1724848351610, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 22, + 172 + ], + [ + 270, + 181.60926811129977 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "MrrTcDt1tHhlgya7fYE5Y", + "focus": 0.10175917500758265, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "zUtiT7wYWYVxufAurYZnN", + "focus": -0.17828888345159447, + "gap": 23, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "iJbyBwrA-kdllHKJYkOHX", + "type": "arrow", + "x": 585.7306288480759, + "y": -84.74151398738218, + "width": 103, + "height": 1.5855071562340726, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aM", + "roundness": null, + "seed": 1797640010, + "version": 85, + "versionNonce": 917425174, + "isDeleted": false, + "boundElements": null, + "updated": 1724848321765, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -103, + -1.5855071562340726 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "MrrTcDt1tHhlgya7fYE5Y", + "focus": 0.11211924821775762, + "gap": 20, + "fixedPoint": null + }, + "endBinding": { + "elementId": "0D9YgqACS6le7AjyInh_G", + "focus": -0.08753109452736318, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Zvs_4tbVy7IU942G8SqZq", + "type": "text", + "x": 758.9539361397427, + "y": -150.74151398738218, + "width": 138.74348958333317, + "height": 20.199999999999974, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aO", + "roundness": null, + "seed": 23552214, + "version": 56, + "versionNonce": 1008913866, + "isDeleted": false, + "boundElements": null, + "updated": 1724848344150, + "link": null, + "locked": false, + "text": "Request binary", + "fontSize": 16.833333333333307, + "fontFamily": 3, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Request binary", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "text", + "version": 110, + "versionNonce": 15504854, + "index": "aP", + "isDeleted": false, + "id": "Abdt6NTcxxPX_6tHxKcU2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 729.3588840564095, + "y": 124.1584860126178, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 149.043212890625, + "height": 20.199999999999967, + "seed": 2058424918, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848409995, + "link": null, + "locked": false, + "fontSize": 16.833333333333307, + "fontFamily": 3, + "text": "Download binary", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Download binary", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 215, + "versionNonce": 164811222, + "index": "aQ", + "isDeleted": false, + "id": "ri7uncm2rJ0OlmerVVtyr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1185.2306288480759, + "y": -137.24151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 138, + "height": 120, + "seed": 471122442, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "mxzqiC7aUkouTIfhrR6lb" + } + ], + "updated": 1724848450405, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 166, + "versionNonce": 1270763082, + "index": "aR", + "isDeleted": false, + "id": "mxzqiC7aUkouTIfhrR6lb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1221.1056288480759, + "y": -86.84151398738217, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 66.25, + "height": 19.2, + "seed": 1828974794, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848483012, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "catalog", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ri7uncm2rJ0OlmerVVtyr", + "originalText": "catalog", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 366, + "versionNonce": 1174829450, + "index": "aT", + "isDeleted": false, + "id": "muEoqEM-0GiayzVn9u8sH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1166.7306288480759, + "y": -175.24151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 171.99999999999997, + "height": 167, + "seed": 1289633930, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "0JjTVJ_LkCevqE1iFRm2e", + "type": "arrow" + } + ], + "updated": 1724848478824, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 188, + "versionNonce": 837540246, + "index": "aU", + "isDeleted": false, + "id": "vkq9LKOjfxrpyKQiYiq1t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1175.7306288480759, + "y": -171.24151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 85, + "height": 19.2, + "seed": 1964613450, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848450405, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "configmap", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "configmap", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "rectangle", + "version": 405, + "versionNonce": 440431626, + "index": "aW", + "isDeleted": false, + "id": "Oxt7wvWPZxPRJEkCGRpGP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 928.7306288480759, + "y": -169.24151398738218, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 171.99999999999997, + "height": 167, + "seed": 172553750, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [ + { + "id": "0JjTVJ_LkCevqE1iFRm2e", + "type": "arrow" + } + ], + "updated": 1724848478824, + "link": null, + "locked": false + }, + { + "id": "0JjTVJ_LkCevqE1iFRm2e", + "type": "arrow", + "x": 1100.7306288480759, + "y": -84.74151398738218, + "width": 62, + "height": 1, + "angle": 0, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aX", + "roundness": null, + "seed": 1494732170, + "version": 27, + "versionNonce": 1323918026, + "isDeleted": false, + "boundElements": null, + "updated": 1724848478824, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 62, + 1 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "Oxt7wvWPZxPRJEkCGRpGP", + "focus": -0.004560136804104123, + "gap": 1, + "fixedPoint": null + }, + "endBinding": { + "elementId": "muEoqEM-0GiayzVn9u8sH", + "focus": -0.111343340300209, + "gap": 4, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "type": "text", + "version": 134, + "versionNonce": 279123594, + "index": "aY", + "isDeleted": false, + "id": "GgMGZ-xowRwFH-nG3mcTU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 764.3588840564095, + "y": -53.8415139873822, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 149.043212890625, + "height": 20.199999999999967, + "seed": 743160458, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848511549, + "link": null, + "locked": false, + "fontSize": 16.833333333333307, + "fontFamily": 3, + "text": "binary metadata", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "binary metadata", + "autoResize": true, + "lineHeight": 1.2 + }, + { + "type": "text", + "version": 100, + "versionNonce": 1817254538, + "index": "aZ", + "isDeleted": false, + "id": "Pel8YL7lCkgatpemc44Wz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1043.3588840564094, + "y": 18.1584860126178, + "strokeColor": "#364fc7", + "backgroundColor": "transparent", + "width": 119.4625244140625, + "height": 20.199999999999967, + "seed": 702972298, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1724848534501, + "link": null, + "locked": false, + "fontSize": 16.833333333333307, + "fontFamily": 3, + "text": "store binary", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "store binary", + "autoResize": true, + "lineHeight": 1.2 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/examples/kubernetes/images/architecture.png b/examples/kubernetes/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..fbbfeaf7275c6ac9426c060fafecd88c49fb4c41 GIT binary patch literal 60768 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

~Z30vZeT6z=3;M=`f`rKxq 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 literal 0 HcmV?d00001 diff --git a/examples/kubernetes/tests/sqlite.js b/examples/kubernetes/tests/sqlite.js new file mode 100644 index 0000000..c17f93e --- /dev/null +++ b/examples/kubernetes/tests/sqlite.js @@ -0,0 +1,24 @@ +// source: https://github.com/grafana/xk6-sql/blob/v0.4.0/examples/sqlite3_test.js +import sql from "k6/x/sql"; + +const db = sql.open("sqlite3", "./test.db"); + +export function setup() { + db.exec(`CREATE TABLE IF NOT EXISTS keyvalues ( + id integer PRIMARY KEY AUTOINCREMENT, + key varchar NOT NULL, + value varchar);`); +} + +export function teardown() { + db.close(); +} + +export default function () { + db.exec("INSERT INTO keyvalues (key, value) VALUES('plugin-name', 'k6-plugin-sql');"); + + let results = sql.query(db, "SELECT * FROM keyvalues WHERE key = $1;", "plugin-name"); + for (const row of results) { + console.log(`key: ${row.key}, value: ${row.value}`); + } +}