1. Images & Charts
  2. grafana-rollout-operator
grafana-rollout-operator

grafana-rollout-operator

Infra
Updated on August 1

Grafana Rollout Operator Overview

Secure your stack with a hardened Grafana Rollout Operator image freshly-built by Minimus. Minimus images always include the most up-to-date package version for all packages and dependencies contained in the image.


The Grafana Rollout Operator for Kubernetes coordinates the rollout of Pods between different StatefulSets within a specific namespace. It can be used to manage multi-Availability Zone deployments where Pods running in each Availability Zone (AZ) are managed by a dedicated StatefulSet.


Try It Out

Prerequisites

  • A running Kubernetes cluster (v1.21 or higher is recommended)
  • Helm v3.8 or higher for OCI support (Installation instructions)
  • kubectl installed and configured

Step 1: Start Cluster

If you have a cluster to work with, skip this step. Otherwise, start a Minikube cluster. Deployment instructions

Step 2: Add Repository to your Local Client

Add the Helm chart to your local Helm client.

helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

Step 3: Deploy via Helm Chart

Deploy the rollout operator to the namespace where your target StatefulSets run (e.g., mimir if managing Mimir StatefulSets):

helm install grafana-rollout-operator grafana/rollout-operator \
    --namespace mimir \
    --create-namespace \
    --set image.registry=reg.mini.dev \
    --set image.repository=grafana-rollout-operator \
    --set image.tag=latest

Wait a minute and check that the Pods are up and running:

kubectl -n mimir get po

Confirm that Minimus images were deployed:

kubectl -n mimir describe pods | grep Image:

Step 4: Clean Up

Uninstall the chart to delete the namespace and its resources, including Pods, Deployments, Services, Secrets, ConfigMaps, etc.:

helm uninstall grafana-rollout-operator -n mimir

Running with Grafana Mimir

The Grafana Rollout Operator is namespaced and must be installed in the same Kubernetes namespace as the StatefulSets it manages. For Mimir deployments, this means installing the rollout operator in the Mimir namespace (typically mimir).

Installing in the Mimir Namespace

Install the rollout operator directly into your Mimir namespace using the Minimus image:

helm install grafana-rollout-operator grafana/rollout-operator \
    --namespace mimir \
    --create-namespace \
    --set image.registry=reg.mini.dev \
    --set image.repository=grafana-rollout-operator \
    --set image.tag=latest

If you installed Mimir via the grafana/mimir-distributed Helm chart

If you installed Mimir using the grafana/mimir-distributed Helm chart, do not install a separate rollout-operator. Instead, enable and configure the rollout operator through the Mimir chart's values by overriding the rollout_operator section to use the Minimus image:

rollout_operator:
  enabled: true
  image:
    registry: reg.mini.dev
    repository: grafana-rollout-operator
    tag: latest

Note: The exact key names may vary slightly depending on your chart version. Consult your chart's values.yaml for the precise structure.

Prerequisites for coordinated rollouts

For the rollout operator to coordinate rollouts, your StatefulSets must:

  1. Be part of a rollout-group (shared label value, e.g., grafana.com/rollout-group=mimir-ingester)
  2. Use the OnDelete update strategy (not RollingUpdate)

The grafana/mimir-distributed Helm chart typically configures these automatically. If you're managing StatefulSets manually, ensure both conditions are met; otherwise the operator will skip the group.

Optional: Zone-by-zone downscale sequencing

For multi-zone Mimir deployments, you can configure zone-by-zone downscale sequencing by applying labels and annotations to each zone's StatefulSet:

Labels:

  • grafana.com/min-time-between-zones-downscale: Minimum time to wait between downscaling different zones (must be set on each StatefulSet)
  • grafana.com/prepare-downscale: Enable prepare-downscale hooks (set to true)

Annotations:

  • grafana.com/prepare-downscale-http-path: HTTP path for the prepare-downscale endpoint (use the path form expected by rollout-operator, typically without a leading /)
  • grafana.com/prepare-downscale-http-port: HTTP port for the prepare-downscale endpoint
  • grafana.com/rollout-downscale-leader: On non-leader zones, set this to the name of the leader StatefulSet (e.g., mimir-ingester-zone-a)
  • grafana.com/rollout-upscale-only-when-leader-ready: Set to true on follower zones to wait for leader readiness before upscaling

Important: Choose the correct Mimir prepare endpoint for your architecture. For example:

  • ingester/prepare-partition-downscale for ingest storage (no leading /)
  • ingester/prepare-instance-ring-downscale for classic ring-based deployments (no leading /)

Example commands for a three-zone deployment (replace <path> and <port> with your values, or use ingester/prepare-partition-downscale and 80 for ingest storage):

# Zone A (leader)
kubectl -n mimir label sts mimir-ingester-zone-a \
    grafana.com/min-time-between-zones-downscale=5m \
    grafana.com/prepare-downscale=true

kubectl -n mimir annotate sts mimir-ingester-zone-a \
    grafana.com/prepare-downscale-http-path=<path> \
    grafana.com/prepare-downscale-http-port=<port>

# Zone B (follows zone A)
kubectl -n mimir label sts mimir-ingester-zone-b \
    grafana.com/min-time-between-zones-downscale=5m \
    grafana.com/prepare-downscale=true

kubectl -n mimir annotate sts mimir-ingester-zone-b \
    grafana.com/rollout-downscale-leader=mimir-ingester-zone-a \
    grafana.com/rollout-upscale-only-when-leader-ready=true \
    grafana.com/prepare-downscale-http-path=<path> \
    grafana.com/prepare-downscale-http-port=<port>

# Zone C (follows zone B)
kubectl -n mimir label sts mimir-ingester-zone-c \
    grafana.com/min-time-between-zones-downscale=5m \
    grafana.com/prepare-downscale=true

kubectl -n mimir annotate sts mimir-ingester-zone-c \
    grafana.com/rollout-downscale-leader=mimir-ingester-zone-b \
    grafana.com/rollout-upscale-only-when-leader-ready=true \
    grafana.com/prepare-downscale-http-path=<path> \
    grafana.com/prepare-downscale-http-port=<port>

Technical Considerations

The Grafana Rollout Operator image provided by Minimus is a slim, security-hardened alternative to the public image from Docker Hub. The images are largely interchangeable, with a few differences as noted below.

Grafana-Rollout-Operator built by Minimus:

  1. Runs as non-root by default. The public image runs as user 65532.
  2. Drill down on the version specification tab to see the default user, listening ports, entrypoint, volumes, environment variables, etc.

The Payoff

A hardened, minimal image that will remain more secure for the long run and accrue vulnerabilities at a slower rate.


Terms & Info

Trademark

This catalog is published by Minimus. All product names, logos, and marks, other than those belonging to Minimus, shown are owned by their respective rights holders and appear here only to identify the open source software each image contains. Minimus claims no ownership of those marks and implies no affiliation with, endorsement by, certification by, or sponsorship by any rights holder.

Disclaimer

Images are provided "as-is" without warranty of any kind. "Hardened" refers to the security configuration applied at the time of build and does not constitute a guarantee of ongoing security or absence of vulnerabilities. The free tier is provided without support, SLA, or guaranteed patching timelines. Security updates may be applied to paid subscriptions before or instead of free tier images. By pulling or using any image you agree to our Terms of Use.