Skip to main content

Overview

Grafana Mimir is a long-term Prometheus metrics store you own. This template deploys Mimir in monolithic mode, with every Mimir component in one process. Your own collectors (Prometheus, Grafana Alloy, OpenTelemetry) push metrics in through Prometheus remote_write, and anything that speaks PromQL, such as your own Grafana, queries them back. Metric blocks are stored durably in your object bucket. This is a self-hosted metrics store for your own metrics from your own sources. It is separate from Control Plane’s built-in observability, which keeps collecting and dashboarding your workloads’ metrics natively.
This template deploys into an existing GVC that you already have. It does not create, provision, or manage a GVC. Pass the GVC name with --gvc GVC_NAME at install time.

What Gets Created

Prerequisites

Mimir needs an existing bucket in one of three backends, plus access to it. Complete the steps for your backend before installing, and set storage.type to match (aws is the default).
AWS S3 uses a Control Plane cloud identity. No credentials are stored; the workload identity receives temporary credentials at runtime.
1

Create a bucket

Create an S3 bucket. Set storage.aws.bucket to its name and storage.aws.region to its region.
2

Set up a Cloud Account

If you do not have one, create a Cloud Account for your AWS account. Set storage.aws.cloudAccountName to its name.
3

Create a bucket-scoped IAM policy

In AWS IAM, create a policy with the JSON below, replacing YOUR_BUCKET with your bucket name. Set storage.aws.policyName to the policy name (the bare name, not the ARN).

Installation

Install with the bucket, cloud account and IAM policy from the AWS prerequisites (the default storage.type):
For Google Cloud Storage, set storage.type=gcp, storage.gcp.bucket and storage.gcp.cloudAccountName instead. For an S3-compatible server, set storage.type=minio, storage.minio.endpoint, storage.minio.bucket and storage.minio.credentialsSecretName. You can also install the template using your preferred method:

UI

Browse, install, and manage templates visually

CLI

Manage templates from your terminal

Terraform

Declare templates in your Terraform configurations

Pulumi

Declare templates in your Pulumi programs

Configuration

Image and Resources

replicas must be 1 or at least 3; the template refuses to render with 2. See Scaling and Availability.

Object Storage

Only the block matching storage.type is read. One bucket serves the whole deployment; the template namespaces its contents internally.

Tenancy

Tenants are implicit: writing with a new tenant ID creates it, with no provisioning step. The header identifies a tenant; it does not authenticate anyone. Changing multitenancy.enabled or retention.period updates only the Mimir configuration secret, which a running replica does not re-read. After the cpln helm upgrade, run cpln workload force-redeployment RELEASE_NAME-mimir --gvc GVC_NAME.

Retention

Volume Set

Internal Access

Mimir has no built-in authentication, so the template has no public access option. internalAccess.type decides which workloads can reach port 8080.

Connecting

There is no public endpoint. Collectors and Grafana must run as workloads that internalAccess admits (by default, any workload in the same GVC). Point Prometheus at the remote write endpoint:
In Grafana, add a Prometheus data source with the PromQL query URL above. When multitenancy is on, add a custom HTTP header X-Scope-OrgID with the tenant ID. To check Mimir from your machine, open a tunnel and request its readiness endpoint:
The image is distroless and has no shell, so cpln workload exec cannot be used for debugging. Use the tunnel above or a client workload in the GVC instead.

Operations

Backing Up

Your metric blocks live in your object bucket, so protecting the bucket (for example with your provider’s versioning or replication) protects the data. The volume set holds only the ingester WAL and compactor scratch space. Reinstalling the template against the same bucket resumes with your existing data.

Upgrading from 1.0.0

Version 1.1.0 renamed the resource limit keys so it is clear which number is the limit: Rename both in your values before upgrading. An upgrade that still carries the old names is refused at render, before anything is changed. If you are going straight to 1.2.0 with an S3-compatible backend, also follow Upgrading from 1.1.0.

Upgrading from 1.1.0

Version 1.2.0 moved the S3-compatible (storage.type: minio) access keys out of values and into a prerequisite secret. AWS and GCS installs are unaffected.
  1. Create the credentials secret described under Prerequisites, with your current access key pair as accessKey and secretKey.
  2. Delete storage.minio.accessKey and storage.minio.accessSecret from your values. An upgrade that still carries them is refused at render.
  3. Upgrade with your existing storage settings plus the new secret name:

Scaling and Availability

  • replicas: 1 (the default) runs a single instance. A restart briefly interrupts ingest and queries.
  • replicas: 3 or more forms an HA cluster with 3-way replicated ingest, so pushes and queries continue through a replica loss or a rolling restart. 2 is rejected because it gives no failure tolerance.
  • When scaling an existing install from 1 to 3 replicas, metrics written shortly before the scale-up can be intermittently missing from query results for up to about 12 hours. No data is lost, new writes are unaffected, and it resolves on its own. Scale up at a quiet time if that matters.
  • Raise resources.maxMemory to ingest more active series; memory is what bounds the series count.

Troubleshooting

Cause: with storage.type: minio, the secret named by storage.minio.credentialsSecretName does not exist, so no container starts.Fix: read status.versions[].message with cpln workload get-deployments RELEASE_NAME-mimir --gvc GVC_NAME -o yaml; it names the missing secret. Create it as shown under Prerequisites, then wait or run cpln workload force-redeployment RELEASE_NAME-mimir --gvc GVC_NAME.
Error: mimir: resources.cpu was RENAMED to resources.maxCpu. (or the same for resources.memory)Cause: your values still use the pre-1.1.0 key names.Fix: rename them as described in Upgrading from 1.0.0.
Error: mimir: minio.accessKey and minio.accessSecret were REMOVEDCause: your values still carry the pre-1.2.0 S3-compatible keys.Fix: move them into a credentials secret as described in Upgrading from 1.1.0.
Error: mimir: replicas must be 1 or >= 3 — a 2-replica cluster has no failure tolerance under 3-way replicationFix: set replicas to 1 or to 3 or more.
Cause: with multitenancy.enabled: true, every request without an X-Scope-OrgID header is rejected.Fix: add the header to every collector’s remote_write config and to the Grafana data source.
Cause: on AWS and GCS, the workload identity’s cloud credentials are still being issued during the first seconds of a fresh boot.Fix: none needed. Mimir retries and proceeds on its own. If the warnings persist, check the cloud account, the IAM policy name and the bucket name.

Important Notes

  • Mimir has no built-in authentication and this template never exposes a public endpoint. To serve clients outside Control Plane, put your own authenticating proxy in front of it.
  • X-Scope-OrgID separates tenants but is not a security boundary: any client that can reach Mimir can send any tenant ID.
  • Changing retention.period applies to existing blocks too, because the compactor enforces it.
  • Your data lives in your bucket. Deleting data means emptying the bucket; uninstalling the template does not.
  • After uninstalling, re-check the bucket before emptying it: a terminating replica can re-write a small cluster-seed file under blocks/__mimir_cluster/ shortly after teardown.

External References

Grafana Mimir Documentation

Official Grafana Mimir documentation

Mimir HTTP API

Ingest, query, and status endpoints reference

Prometheus remote_write

Remote-write tuning and best practices

Grafana Mimir (GitHub)

Source code and releases

Mimir Template

View the source files, default values, and chart definition