<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Set up distributed k6 on Grafana Labs</title><link>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/</link><description>Recent content in Set up distributed k6 on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/index.xml" rel="self" type="application/rss+xml"/><item><title>Install k6 Operator</title><link>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/install-k6-operator/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/install-k6-operator/</guid><content><![CDATA[&lt;h1 id=&#34;install-k6-operator&#34;&gt;Install k6 Operator&lt;/h1&gt;
&lt;p&gt;This guide provides step-by-step instructions on how to install k6 Operator.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;To install k6 Operator, you&amp;rsquo;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Kubernetes cluster, along with access to it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/docs/tasks/tools/#kubectl&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;kubectl&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;deploy-the-operator&#34;&gt;Deploy the operator&lt;/h2&gt;
&lt;p&gt;There are three different methods to deploy the k6 Operator. The first two methods, with bundle and Helm, install the latest official release of the k6 Operator by default. The third method installs from the branch of the &lt;a href=&#34;https://github.com/grafana/k6-operator&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6-operator repository&lt;/a&gt; and is intended for development purposes or for users who have their own &lt;code&gt;kustomize&lt;/code&gt; pipeline.&lt;/p&gt;
&lt;h3 id=&#34;deploy-with-bundle&#34;&gt;Deploy with bundle&lt;/h3&gt;
&lt;p&gt;The easiest way to install the operator is with bundle:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl https://raw.githubusercontent.com/grafana/k6-operator/main/bundle.yaml | kubectl apply -f -&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Bundle includes default manifests for k6 Operator, including a &lt;code&gt;k6-operator-system&lt;/code&gt; namespace and k6 Operator deployment with the latest tagged Docker image. Customizations can be made on top of this manifest as needed, for example, with &lt;code&gt;kustomize&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;deploy-with-helm&#34;&gt;Deploy with Helm&lt;/h3&gt;
&lt;p&gt;Helm releases of k6 Operator are published together with other Grafana Helm charts. You can install it with the following commands:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm install k6-operator grafana/k6-operator&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can also pass additional configuration options with a &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm install k6-operator grafana/k6-operator -f values.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;https://github.com/grafana/k6-operator/blob/main/charts/k6-operator/samples/customAnnotationsAndLabels.yaml&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6 Operator samples folder&lt;/a&gt; for an example file.&lt;/p&gt;
&lt;p&gt;You can find a complete list of Helm options in the &lt;a href=&#34;https://github.com/grafana/k6-operator/blob/main/charts/k6-operator/README.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6 Operator charts folder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Helm chart configures only the k6-operator application (the controller-manager and related deployment). It does not configure PrivateLoadZone (PLZ) or TestRun resources—those are configured via their CRD definitions. For details, see &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/configure-testrun-crd/&#34;&gt;Configure TestRun CRD&lt;/a&gt; and &lt;a href=&#34;/docs/grafana-cloud/testing/k6/author-run/private-load-zone/#plz-configuration-options&#34;&gt;PLZ configuration options&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;deploy-with-makefile&#34;&gt;Deploy with Makefile&lt;/h3&gt;
&lt;p&gt;This method installs the k6 Operator from the GitHub repository, using the latest files in a branch. By default, it uses the &lt;code&gt;main&lt;/code&gt; branch, which is not guaranteed to be stable at all times. This method is helpful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Development purposes.&lt;/li&gt;
&lt;li&gt;Users who have a &lt;code&gt;kustomize&lt;/code&gt; pipeline and want to adjust manifests with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To use this method for production deployments, it&amp;rsquo;s recommended to do that from the tagged commits:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;git clone https://github.com/grafana/k6-operator &amp;amp;&amp;amp; cd k6-operator
git checkout v0.0.22&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The tagged commits correspond to the official releases and are expected to be stable.&lt;/p&gt;
&lt;p&gt;In order to install the operator with the Makefile, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://go.dev/doc/install&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kubectl.docs.kubernetes.io/installation/kustomize/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;kustomize&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then, you can install the k6 Operator by running the command below from the root of the cloned repository:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;make deploy&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;install-the-crds&#34;&gt;Install the CRDs&lt;/h3&gt;
&lt;p&gt;The k6 Operator includes custom resources called &lt;code&gt;TestRun&lt;/code&gt; and &lt;code&gt;PrivateLoadZone&lt;/code&gt;. They&amp;rsquo;re automatically installed when you use one of the three installation methods above. But you can also manually install the CRDs by running:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;make install&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;uninstall-k6-operator&#34;&gt;Uninstall k6 Operator&lt;/h2&gt;
&lt;p&gt;Removal of the k6 Operator depends on the installation method. If you use the bundle installation method, you can remove all of the resources created by the k6 Operator with the following:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl https://raw.githubusercontent.com/grafana/k6-operator/main/bundle.yaml | kubectl delete -f -&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you use Helm installation, then removal should be done with the &lt;code&gt;helm&lt;/code&gt; command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm uninstall k6-operator&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finally, if you use Makefile installation, use the &lt;code&gt;make&lt;/code&gt; command to uninstall:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;make delete&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;watch-namespaces&#34;&gt;Watch namespaces&lt;/h2&gt;
&lt;p&gt;By default, the k6 Operator watches the &lt;code&gt;TestRun&lt;/code&gt; and &lt;code&gt;PrivateLoadZone&lt;/code&gt; custom resources in all namespaces.
You can also configure the k6 Operator to watch specific namespaces by setting either of the following environment variables on the controller&amp;rsquo;s deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WATCH_NAMESPACE&lt;/code&gt;: expects the name of a single namespace.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WATCH_NAMESPACES&lt;/code&gt;: expects a comma-separated list of namespaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;rsquo;t set both variables. If &lt;code&gt;WATCH_NAMESPACES&lt;/code&gt; is set, &lt;code&gt;WATCH_NAMESPACE&lt;/code&gt; will be ignored.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: k6-operator-controller-manager
  namespace: k6-operator-system
spec:
  template:
    spec:
      containers:
        - name: manager
          image: ghcr.io/grafana/k6-operator:controller-v0.0.22
          env:
            - name: WATCH_NAMESPACE
              value: &amp;#34;some-ns&amp;#34;
            # Only use one option, WATCH_NAMESPACE or WATCH_NAMESPACES
            # - name: WATCH_NAMESPACES
            #   value: &amp;#34;some-ns,some-other-namespace&amp;#34;
# ...&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="install-k6-operator">Install k6 Operator&lt;/h1>
&lt;p>This guide provides step-by-step instructions on how to install k6 Operator.&lt;/p>
&lt;h2 id="before-you-begin">Before you begin&lt;/h2>
&lt;p>To install k6 Operator, you&amp;rsquo;ll need:&lt;/p>
&lt;ul>
&lt;li>A Kubernetes cluster, along with access to it.&lt;/li>
&lt;li>&lt;a href="https://kubernetes.io/docs/tasks/tools/#kubectl" target="_blank" rel="noopener noreferrer">kubectl&lt;/a>.&lt;/li>
&lt;/ul>
&lt;h2 id="deploy-the-operator">Deploy the operator&lt;/h2>
&lt;p>There are three different methods to deploy the k6 Operator. The first two methods, with bundle and Helm, install the latest official release of the k6 Operator by default. The third method installs from the branch of the &lt;a href="https://github.com/grafana/k6-operator" target="_blank" rel="noopener noreferrer">k6-operator repository&lt;/a> and is intended for development purposes or for users who have their own &lt;code>kustomize&lt;/code> pipeline.&lt;/p></description></item><item><title>Upgrade the k6 Operator</title><link>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/upgrade-k6-operator/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/upgrade-k6-operator/</guid><content><![CDATA[&lt;h1 id=&#34;upgrade-the-k6-operator&#34;&gt;Upgrade the k6 Operator&lt;/h1&gt;
&lt;p&gt;This guide explains how to upgrade the k6 Operator, depending on your installation method. Before upgrading, make sure to read the &lt;a href=&#34;https://github.com/grafana/k6-operator/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;release notes&lt;/a&gt; to know what changed and if any breaking changes happened.&lt;/p&gt;
&lt;h2 id=&#34;k6-operator-installed-with-bundle&#34;&gt;k6 Operator installed with bundle&lt;/h2&gt;
&lt;p&gt;If you installed the k6 Operator with 
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/install-k6-operator/#deploy-with-bundle&#34;&gt;bundle&lt;/a&gt;, you can usually upgrade by re-running the &lt;code&gt;kubectl apply&lt;/code&gt; command with the latest bundle file. However, this won&amp;rsquo;t remove resources that are no longer present in the new bundle. To avoid leaving outdated resources in your cluster, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the version of &lt;code&gt;bundle.yaml&lt;/code&gt; you originally used and save it as &lt;code&gt;old.bundle.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delete the old installation:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;kubectl -f old.bundle.yaml delete&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download the latest bundle and install it:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;curl https://raw.githubusercontent.com/grafana/k6-operator/main/bundle.yaml &amp;gt; bundle.yaml
kubectl apply -f bundle.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save the latest bundle as your new &lt;code&gt;old.bundle.yaml&lt;/code&gt; for future upgrades:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;cp bundle.yaml old.bundle.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Always review the &lt;a href=&#34;https://github.com/grafana/k6-operator/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;release notes&lt;/a&gt; and compare the new &lt;code&gt;bundle.yaml&lt;/code&gt; with your previous version before upgrading.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h3 id=&#34;split-the-bundle-for-long-term-maintenance&#34;&gt;Split the bundle for long-term maintenance&lt;/h3&gt;
&lt;p&gt;Bundle installation is quick, but not always flexible for long-term maintenance. You can split the bundle into separate manifest files and manage them with Kustomize or a GitOps workflow. For inspiration, refer to the &lt;a href=&#34;https://github.com/grafana/k6-operator/blob/main/e2e/run-tests.sh&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;run-tests.sh script&lt;/a&gt; in the k6 Operator repository.&lt;/p&gt;
&lt;h2 id=&#34;k6-operator-installed-with-helm&#34;&gt;k6 Operator installed with Helm&lt;/h2&gt;
&lt;p&gt;If you installed the k6 Operator with 
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/install-k6-operator/#deploy-with-helm&#34;&gt;Helm&lt;/a&gt;, upgrade with these commands:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;helm repo update
helm upgrade k6-operator grafana/k6-operator&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;k6-operator-installed-with-makefile&#34;&gt;k6 Operator installed with Makefile&lt;/h2&gt;
&lt;p&gt;If you installed the k6 Operator with a 
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/install-k6-operator/#deploy-with-makefile&#34;&gt;Makefile&lt;/a&gt;, upgrade with these commands:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;sh&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-sh&#34;&gt;git clone https://github.com/grafana/k6-operator &amp;amp;&amp;amp; cd k6-operator
git checkout &amp;lt;LATEST_RELEASE_TAG&amp;gt;

make deploy&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;&amp;lt;LATEST_RELEASE_TAG&amp;gt;&lt;/code&gt; with the latest release tag from the &lt;a href=&#34;https://github.com/grafana/k6-operator/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6 Operator releases&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;Make sure to switch to the tagged commit before running &lt;code&gt;make deploy&lt;/code&gt;. If you run &lt;code&gt;make deploy&lt;/code&gt; from the latest commit of the &lt;code&gt;main&lt;/code&gt; branch, you may end up with a broken installation, because the &lt;code&gt;main&lt;/code&gt; branch isn&amp;rsquo;t guaranteed to be stable.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;This method is similar to the &lt;a href=&#34;#split-the-bundle-for-long-term-maintenance&#34;&gt;split bundle approach&lt;/a&gt;, but it&amp;rsquo;s closer to development mode and requires Golang and Kustomize to be installed.&lt;/p&gt;
]]></content><description>&lt;h1 id="upgrade-the-k6-operator">Upgrade the k6 Operator&lt;/h1>
&lt;p>This guide explains how to upgrade the k6 Operator, depending on your installation method. Before upgrading, make sure to read the &lt;a href="https://github.com/grafana/k6-operator/releases" target="_blank" rel="noopener noreferrer">release notes&lt;/a> to know what changed and if any breaking changes happened.&lt;/p></description></item><item><title>Run browser tests in Kubernetes</title><link>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/browser-tests/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/browser-tests/</guid><content><![CDATA[&lt;h1 id=&#34;run-browser-tests-in-kubernetes&#34;&gt;Run browser tests in Kubernetes&lt;/h1&gt;
&lt;p&gt;Running browser tests in Kubernetes provides several benefits especially in locked down environments. Some reasons you might want to run browser tests in Kubernetes include staying consistent with other testing tools and infrastructure components in your Kubernetes environment, and the ability to run tests within your private network for security and privacy reasons.&lt;/p&gt;
&lt;p&gt;This guide will help you get setup with k6 browser testing using the official &lt;code&gt;grafana/k6:latest-with-browser&lt;/code&gt; image. We first explain how to make a simple setup for browser test, and then introduce requirements and how to integrate it with k6 Operator.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;This list may expand in the future, as we learn about new use cases of browser testing. Pay attention to the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you use &lt;code&gt;securityContext&lt;/code&gt; or OpenShift SCCs/PSPs, verify the policy allows Chromium to start. Capture the exact error string in Troubleshooting so it is searchable.&lt;/li&gt;
&lt;li&gt;Chromium is sensitive to restrictive security policies. In particular, avoid overly aggressive capability drops without testing browser startup.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;create-and-run-a-browser-test&#34;&gt;Create and run a browser test&lt;/h2&gt;
&lt;p&gt;Start with the simplest Pod flow to verify that Chromium can launch in your cluster.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/using-k6-browser/write-your-first-browser-test/&#34;&gt;Create a browser test&lt;/a&gt; and name it &lt;code&gt;script.js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Create a ConfigMap with your script:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;kubectl create configmap script --from-file script.js&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Create a Pod with &lt;code&gt;kubectl apply -f pod.yaml&lt;/code&gt;, where &lt;code&gt;pod.yaml&lt;/code&gt; looks like&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;apiVersion: v1
kind: Pod
metadata:
  name: k6-browser-test
spec:
  containers:
    - name: k6
      image: grafana/k6:latest-with-browser
      command:
        - k6
      args:
        - run
        - /script/script.js
      resources:
        requests:
          cpu: &amp;#34;4&amp;#34;
          memory: &amp;#34;8G&amp;#34;
        limits:
          cpu: &amp;#34;4&amp;#34;
          memory: &amp;#34;8G&amp;#34;
      volumeMounts:
        - name: script
          mountPath: /script/script.js
          subPath: script.js
  volumes:
    - name: script
      configMap:
        name: script&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Now wait and view the logs to see if it ran successfuly or not. We have some &lt;a href=&#34;#troubleshooting&#34;&gt;troubleshooting&lt;/a&gt; steps below that might help.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;architecture-and-performance-considerations&#34;&gt;Architecture and performance considerations&lt;/h2&gt;
&lt;h3 id=&#34;browser-runner-model&#34;&gt;Browser runner model&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;grafana/k6:latest-with-browser&lt;/code&gt; bundles the k6 binary and Chromium in the same pod. Each k6 runner starts its own browser process, which is simple but CPU and memory-intensive.&lt;/p&gt;
&lt;p&gt;There is an &lt;a href=&#34;https://github.com/grafana/k6-operator/issues/631&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;open proposal&lt;/a&gt; to split browser and k6 runners, enabling an M:N model (M k6 runners to N browser instances) and potentially improving resource efficiency. This is relevant for capacity planning and for teams running larger browser workloads.&lt;/p&gt;
&lt;h3 id=&#34;cpu-rendering&#34;&gt;CPU rendering&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/grafana/k6/blob/master/Dockerfile#L19&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;grafana/k6:latest-with-browser&lt;/code&gt;&lt;/a&gt; includes both the k6 binary and a Chromium build that uses SwiftShader (CPU rendering). This keeps setup simple but can be heavy on CPU and may not work well for apps that require GPU-backed rendering. You can find more details on &lt;a href=&#34;https://github.com/grafana/k6/issues/5571&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;this GitHub issue&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;performance-and-sizing-recommendations&#34;&gt;Performance and sizing recommendations&lt;/h3&gt;
&lt;p&gt;Browser tests are CPU and memory-heavy. Start with higher limits to confirm stability, then scale down.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set CPU and memory to match, or exceed, a modern desktop machine for initial runs.&lt;/li&gt;
&lt;li&gt;Try to keep CPU/memory utilization under ~80% during steady-state.&lt;/li&gt;
&lt;li&gt;Refer to 
    &lt;a href=&#34;/docs/k6/v2.3.x/testing-guides/running-large-tests/&#34;&gt;Running large tests&lt;/a&gt; for general guidance on running larger tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If Chromium crashes immediately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s often due to security policies preventing Chromium from starting.&lt;/li&gt;
&lt;li&gt;In rare cases, we have seen it occur due to trying to run the incorrect arch image on an incompatible arch, for example, running an image built for AMD64 on an ARM-based machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Headless: true&lt;/code&gt; is not supported in this environment. A common error looks like:
&lt;code&gt;Missing X server or $DISPLAY\n[13:13:1211/091921.199737:ERROR:ui/aura/env.cc:257] The platform failed to initialize.  Exiting.&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;capabilities.drop: all&lt;/code&gt; is generally a good security posture, but can break Chromium. It requires more capabilities than most CLI workloads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Either add larger instances or reduce the CPU allocation if you see something like: &lt;code&gt;0/1 nodes are available: 1 Insufficient cpu. no new claims to deallocate, preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.&lt;/code&gt;. Keep in mind that reducing CPU might worsen the browser test result.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;error building browser on IterStart: making browser data directory &amp;quot;/tmp/k6browser-data-...&amp;quot;: read-only file system&lt;/code&gt;&lt;br /&gt;
Fix: mount a writable &lt;code&gt;emptyDir&lt;/code&gt; and set &lt;code&gt;TMPDIR&lt;/code&gt; to that path (or mount &lt;code&gt;emptyDir&lt;/code&gt; at &lt;code&gt;/tmp&lt;/code&gt;). Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;securityContext:
  readOnlyRootFilesystem: true
env:
  - name: TMPDIR
    value: /var/tmp
volumeMounts:
  - name: tmp
    mountPath: /var/tmp
volumes:
  - name: tmp
    emptyDir: {}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Error from server (BadRequest): error when creating &amp;quot;plz.yaml&amp;quot;: PrivateLoadZone in version &amp;quot;v1alpha1&amp;quot; cannot be handled as a PrivateLoadZone: strict decoding error: unknown field &amp;quot;spec.*.securityContext&amp;quot;&lt;/code&gt;
Fix: This is a known issue with the PLZ CRD. Refer to &lt;a href=&#34;https://github.com/grafana/k6-operator/issues/696&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;this GitHub issue&lt;/a&gt; for more details.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can&amp;rsquo;t find the answer you are looking for, open a new issue in the &lt;a href=&#34;https://github.com/grafana/k6-operator/issues&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6 Operator GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/k6/blob/master/Dockerfile#L19&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;k6 with-browser Dockerfile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/crocochrome/blob/main/doc/capabilities.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Chromium capabilities reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/using-k6-browser/write-your-first-browser-test/&#34;&gt;k6 browser test example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/testing-guides/running-large-tests/&#34;&gt;Large test sizing guidance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/k6/issues/4338&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Chrome crashing in with-browser image, in Podman and Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="run-browser-tests-in-kubernetes">Run browser tests in Kubernetes&lt;/h1>
&lt;p>Running browser tests in Kubernetes provides several benefits especially in locked down environments. Some reasons you might want to run browser tests in Kubernetes include staying consistent with other testing tools and infrastructure components in your Kubernetes environment, and the ability to run tests within your private network for security and privacy reasons.&lt;/p></description></item><item><title>Usage</title><link>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/</guid><content><![CDATA[&lt;h1 id=&#34;usage&#34;&gt;Usage&lt;/h1&gt;
&lt;p&gt;This section includes the following topics:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/&#34;&gt;Run k6 scripts with TestRun CRD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/extensions/&#34;&gt;Use k6 Operator with k6 extensions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/k6-operator-to-gck6/&#34;&gt;Use the k6 Operator with Grafana Cloud k6&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/configure-testrun-crd/&#34;&gt;Configure the TestRun CRD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/scheduling-tests/&#34;&gt;Schedule k6 tests&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
    &lt;a href=&#34;/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/istio/&#34;&gt;Use the k6 Operator with Istio&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
]]></content><description>&lt;h1 id="usage">Usage&lt;/h1>
&lt;p>This section includes the following topics:&lt;/p>
&lt;ul>&lt;li>
&lt;a href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/">Run k6 scripts with TestRun CRD&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/extensions/">Use k6 Operator with k6 extensions&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/k6-operator-to-gck6/">Use the k6 Operator with Grafana Cloud k6&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/configure-testrun-crd/">Configure the TestRun CRD&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/scheduling-tests/">Schedule k6 tests&lt;/a>&lt;/li>&lt;li>
&lt;a href="/docs/k6/v2.3.x/set-up/set-up-distributed-k6/usage/istio/">Use the k6 Operator with Istio&lt;/a>&lt;/li>&lt;/ul></description></item><item><title>Troubleshoot</title><link>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/troubleshooting/</link><pubDate>Mon, 21 Sep 2026 15:16:28 +0000</pubDate><guid>https://grafana.com/docs/k6/v2.3.x/set-up/set-up-distributed-k6/troubleshooting/</guid><content><![CDATA[&lt;h1 id=&#34;troubleshoot&#34;&gt;Troubleshoot&lt;/h1&gt;
&lt;p&gt;This topic includes instructions to help you troubleshoot common issues with the k6 Operator.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re using Private Load Zones in Grafana Cloud k6, refer to &lt;a href=&#34;/docs/grafana-cloud/testing/k6/author-run/private-load-zone/troubleshoot/&#34;&gt;Troubleshoot Private Load Zones&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;how-to-troubleshoot&#34;&gt;How to troubleshoot&lt;/h2&gt;


&lt;div data-shared=&#34;k6-operator/troubleshooting-how-to.md&#34;&gt;
            &lt;h3 id=&#34;test-your-script-locally&#34;&gt;Test your script locally&lt;/h3&gt;
&lt;p&gt;Always run your script locally before trying to run it with the k6 Operator:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;k6 run script.js&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;rsquo;re using environment variables or CLI options, pass them in as well:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;MY_ENV_VAR=foo k6 run script.js --tag my_tag=bar&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That ensures that the script has correct syntax and can be parsed with k6 in the first place. Additionally, running locally can help you check if the configured options are doing what you expect. If there are any errors or unexpected results in the output of &lt;code&gt;k6 run&lt;/code&gt;, make sure to fix those prior to deploying the script elsewhere.&lt;/p&gt;
&lt;h3 id=&#34;testrun-deployment&#34;&gt;&lt;code&gt;TestRun&lt;/code&gt; deployment&lt;/h3&gt;
&lt;h4 id=&#34;the-jobs-and-pods&#34;&gt;The Jobs and Pods&lt;/h4&gt;
&lt;p&gt;In case of one &lt;code&gt;TestRun&lt;/code&gt; Custom Resource (CR) creation with &lt;code&gt;parallelism: n&lt;/code&gt;, there are certain repeating patterns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;There will be &lt;code&gt;n &#43; 2&lt;/code&gt; Jobs (with corresponding Pods) created: initializer, starter, and &lt;code&gt;n&lt;/code&gt; runners.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If any of these Jobs didn&amp;rsquo;t result in a Pod being deployed, there must be an issue with that Job. Some commands that can help here:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get jobs -A
kubectl describe job mytest-initializer&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If one of the Pods was deployed but finished with &lt;code&gt;Error&lt;/code&gt;, you can check its logs with the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl logs mytest-initializer-xxxxx&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;testrun-with-cleanup-option&#34;&gt;&lt;code&gt;TestRun&lt;/code&gt; with &lt;code&gt;cleanup&lt;/code&gt; option&lt;/h4&gt;
&lt;p&gt;If a &lt;code&gt;TestRun&lt;/code&gt; has the &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/#clean-up-resources&#34;&gt;&lt;code&gt;spec.cleanup&lt;/code&gt; option&lt;/a&gt; set, as &lt;a href=&#34;/docs/grafana-cloud/testing/k6/author-run/private-load-zone/&#34;&gt;&lt;code&gt;PrivateLoadZone&lt;/code&gt;&lt;/a&gt; tests always do, for example, it may be harder to locate and analyze the Pod before it&amp;rsquo;s deleted.&lt;/p&gt;
&lt;p&gt;In that case, we recommend using observability solutions, like Prometheus and Loki, to store metrics and logs for later analysis.&lt;/p&gt;
&lt;p&gt;As an alternative, it&amp;rsquo;s also possible to watch for the resources manually with the following commands:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl get jobs -n my-namespace -w
kubectl get pods -n my-namespace -w

# To get detailed information (this one is quite verbose so use with caution):
kubectl get pods -n my-namespace -w -o yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;k6-operator&#34;&gt;k6 Operator&lt;/h4&gt;
&lt;p&gt;Another source of info is the k6 Operator itself. It&amp;rsquo;s deployed as a Kubernetes &lt;code&gt;Deployment&lt;/code&gt;, with &lt;code&gt;replicas: 1&lt;/code&gt; by default, and its logs together with observations about the Pods from the previous section usually contain enough information to help you diagnose any issues. With the standard deployment, the logs of the k6 Operator can be checked with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl -n k6-operator-system -c manager logs k6-operator-controller-manager-xxxxxxxx-xxxxx&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;inspect-testrun-resource&#34;&gt;Inspect &lt;code&gt;TestRun&lt;/code&gt; resource&lt;/h4&gt;
&lt;p&gt;After you or &lt;code&gt;PrivateLoadZone&lt;/code&gt; deployed a &lt;code&gt;TestRun&lt;/code&gt; CR, you can inspect it the same way as any other resource:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl describe testrun my-testrun&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Firstly, check if the spec is as expected. Then, see the current status:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;Status:
  Conditions:
    Last Transition Time:  2024-01-17T10:30:01Z
    Message:
    Reason:                CloudTestRunFalse
    Status:                False
    Type:                  CloudTestRun
    Last Transition Time:  2024-01-17T10:29:58Z
    Message:
    Reason:                TestRunPreparation
    Status:                Unknown
    Type:                  TestRunRunning
    Last Transition Time:  2024-01-17T10:29:58Z
    Message:
    Reason:                CloudTestRunAbortedFalse
    Status:                False
    Type:                  CloudTestRunAborted
    Last Transition Time:  2024-01-17T10:29:58Z
    Message:
    Reason:                CloudPLZTestRunFalse
    Status:                False
    Type:                  CloudPLZTestRun
  Stage:                   error&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If &lt;code&gt;Stage&lt;/code&gt; is equal to &lt;code&gt;error&lt;/code&gt;, you can check the logs of k6 Operator.&lt;/p&gt;
&lt;p&gt;Conditions can be used as a source of info as well, but it&amp;rsquo;s a more advanced troubleshooting option that should be used if the previous steps weren&amp;rsquo;t enough to diagnose the issue. Note that conditions that start with the &lt;code&gt;Cloud&lt;/code&gt; prefix only matter in the setting of k6 Cloud test runs, for example, for cloud output and PLZ test runs.&lt;/p&gt;
&lt;h4 id=&#34;debugging-k6-process&#34;&gt;Debugging k6 process&lt;/h4&gt;
&lt;p&gt;If the script is working locally as expected, and the previous steps show no errors as well, yet you don&amp;rsquo;t see an expected result of a test and suspect k6 process is at fault, you can use the k6 
    &lt;a href=&#34;/docs/k6/v2.3.x/using-k6/k6-options/#options&#34;&gt;verbose option&lt;/a&gt; in the &lt;code&gt;TestRun&lt;/code&gt; spec:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: k6.io/v1alpha1
kind: TestRun
metadata:
  name: k6-sample
spec:
  parallelism: 2
  script:
    configMap:
      name: &amp;#39;test&amp;#39;
      file: &amp;#39;test.js&amp;#39;
  arguments: --verbose&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

        
&lt;h2 id=&#34;common-errors&#34;&gt;Common errors&lt;/h2&gt;
&lt;h3 id=&#34;issues-with-environment-variables&#34;&gt;Issues with environment variables&lt;/h3&gt;
&lt;p&gt;Refer to &lt;a href=&#34;https://github.com/grafana/k6-operator/blob/main/docs/env-vars.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Environment variables&lt;/a&gt; for details on how to pass environment variables to the k6 Operator.&lt;/p&gt;
&lt;h3 id=&#34;tags-not-working&#34;&gt;Tags not working&lt;/h3&gt;
&lt;p&gt;Tags are a rather common source of errors when using the k6 Operator. For example, the following tags would lead to parsing errors:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;  arguments: --tag product_id=&amp;#34;Test A&amp;#34;
  # or
  arguments: --tag foo=\&amp;#34;bar\&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can see those errors in the logs of either the initializer or the runner Pod, for example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;time=&amp;#34;2024-01-11T11:11:27Z&amp;#34; level=error msg=&amp;#34;invalid argument \&amp;#34;product_id=\\\&amp;#34;Test\&amp;#34; for \&amp;#34;--tag\&amp;#34; flag: parse error on line 1, column 12: bare \&amp;#34; in non-quoted-field&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is a common problem with escaping the characters. You can find an &lt;a href=&#34;https://github.com/grafana/k6-operator/issues/211&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;issue&lt;/a&gt; in the k6 Operator repository that can be upvoted.&lt;/p&gt;
&lt;h3 id=&#34;an-error-on-reading-output-of-the-initializer-pod&#34;&gt;An error on reading output of the initializer Pod&lt;/h3&gt;
&lt;p&gt;The k6 runners fail to start, and in the k6 Operator logs, you see the &lt;code&gt;unable to marshal&lt;/code&gt; error. This can happen for several reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Your Kubernetes setup includes some tool that is implicitly adding symbols to the log output of Pods. You can verify this case by checking the logs of the initializer Pod: they should contain valid JSON, generated by k6. Currently, to fix this, the tool adding symbols must be switched off for the k6 Operator workloads.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multi-file script includes many files which all must be fully accessible from the runner Pod. You can verify this case by checking the logs of the initializer Pod: there will be an error about some file not being found. To fix this, refer to &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/#multi-file-tests&#34;&gt;Multi-file tests&lt;/a&gt; on how to configure multi-file tests in &lt;code&gt;TestRun&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are problems with environment variables or with importing an extension. Following the steps found in &lt;a href=&#34;#test-your-script-locally&#34;&gt;testing locally&lt;/a&gt; and in &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/extensions/#troubleshooting&#34;&gt;troubleshooting extensions&lt;/a&gt; can help debug this issue. One additional command that you can use to help diagnose issues with your script is the following:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;k6 inspect --execution-requirements script.js&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That command is a shortened version of what the initializer Pod is executing. If the command produces an error, there&amp;rsquo;s a problem with the script itself and it should be solved outside of the k6 Operator. The error itself may contain a hint to what&amp;rsquo;s wrong, such as a syntax error.&lt;/p&gt;
&lt;p&gt;If the standalone &lt;code&gt;k6 inspect --execution-requirements&lt;/code&gt; executes successfully, then it&amp;rsquo;s likely a problem with &lt;code&gt;TestRun&lt;/code&gt; deployment specific to your Kubernetes setup.&lt;/p&gt;
&lt;h3 id=&#34;an-issue-with-volumeclaim&#34;&gt;An issue with &lt;code&gt;volumeClaim&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Storing k6 scripts on a persistent volume is one approach to &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/executing-k6-scripts-with-testrun-crd/#multi-file-tests&#34;&gt;multi-file tests&lt;/a&gt;. However, errors can occur due to misconfiguration of the volume. These errors are not within the purview of the k6 Operator; they are inherent to the Kubernetes setup itself, as the k6 Operator only mounts volumes to the Pods. However, here are some general recommendations to help debug such errors.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;volumeClaim&lt;/code&gt; option is expecting a persistent volume claim, so first, check the &lt;a href=&#34;https://kubernetes.io/docs/concepts/storage/persistent-volumes/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kubernetes documentation&lt;/a&gt; and your infrastructure provider documentation to confirm if the volume is indeed set up correctly and can be mounted by Kubernetes pods.&lt;/p&gt;
&lt;p&gt;Then, if the volume appears to be correct and is mounted to the k6 Pods without an issue, yet the &lt;code&gt;TestRun&lt;/code&gt; fails with an error like the following:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;The moduleSpecifier \&amp;#34;/test/utils.js\&amp;#34; couldn&amp;#39;t be found on local disk.&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This error implies that either the file was not written successfully to the Volume or there is a misconfiguration with a path. So it makes sense to create a separate debug Pod, for example, with the &lt;a href=&#34;https://hub.docker.com/_/busybox&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;busybox&lt;/code&gt; image&lt;/a&gt; to confirm that the Volume contains the script and all its dependencies. Such a Pod should have a configuration similar to this one:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  volumes:
  - name: test-volume
    volumeSource:
      persistentVolumeClaim:
        claimName: test-pvc
        readOnly: false
  containers:
  - image: busybox
    name: busybox
    imagePullPolicy: IfNotPresent
    command:
      - sleep
      - &amp;#34;3600&amp;#34;
    volumeMounts:
    - mountPath: /test
      name: test-volume
  restartPolicy: Always&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then execute &lt;code&gt;ls /test&lt;/code&gt; on this debug Pod to see which files are present.&lt;/p&gt;


&lt;div data-shared=&#34;k6-operator/troubleshooting-common-scenarios.md&#34;&gt;
            &lt;h3 id=&#34;k6-runners-do-not-start&#34;&gt;k6 runners do not start&lt;/h3&gt;
&lt;p&gt;The k6 runners fail to start, and in the k6 Operator logs, you see the error &lt;code&gt;Waiting for initializing pod to finish&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In this case, it&amp;rsquo;s most likely that an initializer Pod was not able to start for some reason.&lt;/p&gt;
&lt;h4 id=&#34;how-to-fix&#34;&gt;How to fix&lt;/h4&gt;
&lt;p&gt;Refer to &lt;a href=&#34;#the-jobs-and-pods&#34;&gt;The Jobs and Pods&lt;/a&gt; section to see how to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check if the initializer Pod has started and finished.&lt;/li&gt;
&lt;li&gt;See an issue in the initializer Job&amp;rsquo;s description that prevents a Pod from being scheduled.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once the error preventing the initializer Pod from starting and completing is resolved, redeploy the &lt;code&gt;TestRun&lt;/code&gt; or, in case of a &lt;code&gt;PrivateLoadZone&lt;/code&gt; test, restart the k6 process.&lt;/p&gt;
&lt;h3 id=&#34;non-existent-serviceaccount&#34;&gt;Non-existent ServiceAccount&lt;/h3&gt;
&lt;p&gt;A ServiceAccount can be defined as &lt;code&gt;serviceAccountName&lt;/code&gt; in a PrivateLoadZone, and as &lt;code&gt;runner.serviceAccountName&lt;/code&gt; in a TestRun CRD. If the specified ServiceAccount doesn&amp;rsquo;t exist, k6 Operator will successfully create Jobs but corresponding Pods will fail to be deployed, and the k6 Operator will wait indefinitely for Pods to be &lt;code&gt;Ready&lt;/code&gt;. This error can be best seen in the events of the Job:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl describe job plz-test-xxxxxx-initializer
...
Events:
  Warning  FailedCreate  57s (x4 over 2m7s)  job-controller  Error creating: pods &amp;#34;plz-test-xxxxxx-initializer-&amp;#34; is forbidden: error looking up service account plz-ns/plz-sa: serviceaccount &amp;#34;plz-sa&amp;#34; not found&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;k6 Operator doesn&amp;rsquo;t try to analyze such scenarios on its own, but you can refer to the following &lt;a href=&#34;https://github.com/grafana/k6-operator/issues/260&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;issue&lt;/a&gt; for improvements.&lt;/p&gt;
&lt;h4 id=&#34;how-to-fix-1&#34;&gt;How to fix&lt;/h4&gt;
&lt;p&gt;To fix this issue, the incorrect &lt;code&gt;serviceAccountName&lt;/code&gt; must be corrected, and the &lt;code&gt;TestRun&lt;/code&gt; or &lt;code&gt;PrivateLoadZone&lt;/code&gt; resource must be re-deployed.&lt;/p&gt;
&lt;h3 id=&#34;non-existent-nodeselector&#34;&gt;Non-existent &lt;code&gt;nodeSelector&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;nodeSelector&lt;/code&gt; can be defined as &lt;code&gt;nodeSelector&lt;/code&gt; in a PrivateLoadZone, and as &lt;code&gt;runner.nodeSelector&lt;/code&gt; in the TestRun CRD.&lt;/p&gt;
&lt;p&gt;This case is very similar to the &lt;a href=&#34;#non-existent-serviceaccount&#34;&gt;ServiceAccount&lt;/a&gt;: the Pod creation will fail, but the error is slightly different:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl describe pod plz-test-xxxxxx-initializer-xxxxx
...
Events:
  Warning  FailedScheduling  48s (x5 over 4m6s)  default-scheduler  0/1 nodes are available: 1 node(s) didn&amp;#39;t match Pod&amp;#39;s node affinity/selector.&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;how-to-fix-2&#34;&gt;How to fix&lt;/h4&gt;
&lt;p&gt;To fix this issue, the incorrect &lt;code&gt;nodeSelector&lt;/code&gt; must be corrected and the &lt;code&gt;TestRun&lt;/code&gt; or &lt;code&gt;PrivateLoadZone&lt;/code&gt; resource must be re-deployed.&lt;/p&gt;
&lt;h3 id=&#34;insufficient-resources&#34;&gt;Insufficient resources&lt;/h3&gt;
&lt;p&gt;A related problem can happen when the cluster does not have sufficient resources to deploy the runners. There&amp;rsquo;s a higher probability of hitting this issue when setting small CPU and memory limits for runners or using options like &lt;code&gt;nodeSelector&lt;/code&gt;, &lt;code&gt;runner.affinity&lt;/code&gt; or &lt;code&gt;runner.topologySpreadConstraints&lt;/code&gt;, and not having a set of nodes matching the spec. Alternatively, it can happen if there is a high number of runners required for the test (via &lt;code&gt;parallelism&lt;/code&gt; in TestRun or during PLZ test run) and autoscaling of the cluster has limits on the maximum number of nodes, and can&amp;rsquo;t provide the required resources on time or at all.&lt;/p&gt;
&lt;p&gt;This case is somewhat similar to the previous two: the k6 Operator will wait indefinitely and can be monitored with events in Jobs and Pods. If it&amp;rsquo;s possible to fix the issue with insufficient resources on-the-fly, for example, by adding more nodes, k6 Operator will attempt to continue executing a test run.&lt;/p&gt;
&lt;h3 id=&#34;oom-of-a-runner-pod&#34;&gt;OOM of a runner Pod&lt;/h3&gt;
&lt;p&gt;If there&amp;rsquo;s at least one runner Pod that OOM-ed, the whole test will be &lt;a href=&#34;https://github.com/grafana/k6-operator/issues/251&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;stuck&lt;/a&gt; and will have to be deleted manually:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl delete testrun my-test&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A &lt;code&gt;PrivateLoadZone&lt;/code&gt; test or a &lt;code&gt;TestRun&lt;/code&gt; &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/k6-operator-to-gck6/#cloud-output&#34;&gt;with cloud output&lt;/a&gt; will be aborted by Grafana Cloud k6 after its expected duration is up.&lt;/p&gt;
&lt;h4 id=&#34;how-to-fix-3&#34;&gt;How to fix&lt;/h4&gt;
&lt;p&gt;In the case of OOM, review your k6 script to understand what kind of resource usage the script requires. It may be that the k6 script can be improved to be more performant. Then, set the &lt;code&gt;spec.runner.resources&lt;/code&gt; in the &lt;code&gt;TestRun&lt;/code&gt; CRD, or &lt;code&gt;spec.resources&lt;/code&gt; in the &lt;code&gt;PrivateLoadZone&lt;/code&gt; CRD accordingly.&lt;/p&gt;
&lt;h3 id=&#34;disruption-of-the-k6-runners&#34;&gt;Disruption of the k6 runners&lt;/h3&gt;
&lt;p&gt;A k6 test can be executed for a long time. But depending on the Kubernetes setup, it&amp;rsquo;s possible that the Pods running k6 are disrupted and moved elsewhere during execution. This will skew the test results. In the case of a &lt;code&gt;PrivateLoadZone&lt;/code&gt; test or a &lt;code&gt;TestRun&lt;/code&gt; &lt;a href=&#34;/docs/k6/latest/set-up/set-up-distributed-k6/usage/k6-operator-to-gck6/#cloud-output&#34;&gt;with cloud output&lt;/a&gt;, the test run may additionally be aborted by Grafana Cloud k6 once its expected duration is up, regardless of the exact state of k6 processes.&lt;/p&gt;
&lt;h4 id=&#34;how-to-fix-4&#34;&gt;How to fix&lt;/h4&gt;
&lt;p&gt;Ensure that k6 Pods can&amp;rsquo;t be disrupted by the Kubernetes setup, for example, with &lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/pods/disruptions/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PodDisruptionBudget&lt;/a&gt; and a less aggressive configuration of the autoscaler.&lt;/p&gt;
&lt;/div&gt;

        
]]></content><description>&lt;h1 id="troubleshoot">Troubleshoot&lt;/h1>
&lt;p>This topic includes instructions to help you troubleshoot common issues with the k6 Operator.&lt;/p>
&lt;p>If you&amp;rsquo;re using Private Load Zones in Grafana Cloud k6, refer to &lt;a href="/docs/grafana-cloud/testing/k6/author-run/private-load-zone/troubleshoot/">Troubleshoot Private Load Zones&lt;/a>.&lt;/p></description></item></channel></rss>