Last modified October 21, 2026
Prepare your environment for the standalone Observability Platform
The standalone Observability Platform runs Mimir, Loki, Tempo, and Grafana in a Kubernetes cluster you own. It stores all data in object storage you own.
This page lists what the cluster and the object storage need before the install. Each requirement links to a setup guide in the observability-platform repository.
Responsibility boundary
The diagram shows what you provide in blue, the Giant Swarm Observability Platform in orange, and the network paths between them.
(agents, collectors, users)"] registries["Giant Swarm Registries
gsoci.azurecr.io
docker.io"] subgraph customer["Customer-provided"] dns["DNS record
observability.#lt;domain#gt;"] oidc["OIDC issuer
(JWKS URI)"] storage["Object storage
(Amazon S3, Azure Blob Storage)"] subgraph cluster["Kubernetes cluster"] gateway["Envoy Gateway
HTTPS listener, TLS certificate"] subgraph chart["Giant Swarm Observability Platform
(monitoring namespace)"] grafana["Grafana"] hl["Grafana"] api["observability-platform-api"] operator["observability-operator"] spacer["Mimir, Loki, Tempo"] backends["Mimir, Loki, Tempo"] end end end clients -- "HTTPS" --> dns dns --> gateway gateway -- "Grafana Route" --> grafana gateway -- "Ingest and Query" --> api gateway -- "JWKS Fetch" --> oidc grafana <--> operator api <--> operator operator --> backends api --> backends backends -- "Object Storage Egress" --> storage backends ~~~ registries operator ~~~ spacer gateway ~~~ hl hl ~~~ operator spacer ~~~ oidc cluster -- "Image and Chart Pulls" --> registries classDef customerNode fill:#bfdbfe,stroke:#2563eb,color:#1e3a8a classDef gsNode fill:#F17130,stroke:#c4571f,color:#ffffff classDef hidden fill:none,stroke:none,color:transparent class dns,oidc,storage,gateway customerNode class api,backends,grafana,operator,registries gsNode class spacer,hl hidden style customer fill:#eff6ff,stroke:#2563eb,color:#1e3a8a style cluster fill:#dbeafe,stroke:#2563eb,color:#1e3a8a style chart fill:#fde3d6,stroke:#F17130,color:#7c2d12
Requirements
Kubernetes cluster
- Kubernetes cluster: a conformant cluster that can host the Observability Platform. Any managed or self-managed distribution works. Giant Swarm has verified the platform on Kubernetes 1.36 and Amazon EKS 1.36.
- Release namespace
monitoring. The platform installs into themonitoringnamespace only.
Access and tools
cluster-adminon the Kubernetes cluster. The install creates custom resource definitions and cluster-wide RBAC.kubectlandhelm, pointed at the right cluster.
Cluster capacity
Pick the profile that matches your data volume. The chart’s default values match the minimum profile. Larger profiles need more Mimir ingesters and higher autoscaling limits in your values.
At rest, the platform requests 5.2 vCPU and 36.9 GiB of memory. The remaining capacity absorbs ingest and query load.
| Profile | Minimum | Recommended | High volume |
|---|---|---|---|
| Nodes | 3, one per availability zone | 6, two per availability zone | 9, three per availability zone |
| CPU per node | 4 vCPU | 8 vCPU | 16 vCPU |
| Memory per node | 16 GiB | 32 GiB | 64 GiB |
| Node disk per node | 50 GiB | 100 GiB | 100 GiB |
| Metrics | Up to 1 million series / 20,000 samples/sec | Up to 5 million series / 100,000 samples/sec | Up to 20 million series / 350,000 samples/sec |
| Logs | Up to 30 GB/day | Up to 150 GB/day | Up to 500 GB/day |
| Traces | Up to 2,000 spans/sec | TBD | TBD |
Cluster add-ons
- Default StorageClass backed by a working CSI driver. Mimir, Loki, and Tempo store data on persistent volumes. Use
volumeBindingMode: WaitForFirstConsumeron a multi-zone cluster. A volume then lands in the zone of the pod that uses it. See EKS_CLUSTER.md and Provider guidance. - Metrics server. The platform scales Mimir and Loki components with HorizontalPodAutoscalers. These need the
metrics.k8s.ioAPI. If it’s missing, install metrics-server. See EKS_CLUSTER.md. - DNS service. Mimir discovers its components through the cluster DNS service. The chart expects a Service named
kube-dnsinkube-system. On a cluster where the Service has another name, setmimir.global.dnsServiceto that name.
Check that a default StorageClass exists. One class must show (default) next to its name:
kubectl get storageclass
Check that the metrics API serves. The command prints CPU and memory per node:
kubectl top nodes
Check that each HorizontalPodAutoscaler reads its metrics after the install. No target must show <unknown>:
kubectl get hpa -n monitoring
Network access
Allow egress to these hosts from the cluster nodes. See the observability-platform README.
gsoci.azurecr.io, for container images.docker.io, for container images.giantswarm.github.io/giantswarm-catalog, for Helm charts.giantswarm.github.io/control-plane-catalog, for Helm charts.- Object storage endpoint, over HTTPS on port 443. Mimir, Loki, and Tempo reach it.
- OIDC issuer JWKS URI, over HTTPS, with the External API enabled. The Envoy Gateway pods fetch it.
A registry cache or proxy in front of these hosts works too. For examples on Giant Swarm clusters, see the Zot registry cache and the cluster proxy settings.
Object storage
The platform supports Amazon S3 and Azure Blob Storage. See OBJECT_STORAGE.md.
- Buckets: five private buckets. On Azure Blob Storage, a bucket is a container in a storage account.
mimir-blocks, for metrics.mimir-alertmanager, for Alertmanager state.mimir-ruler, for recording and alerting rules.loki, for logs.tempo, for traces.
- Bucket names: you can pick other names. Set them under
global.objectStorage.bucketsat install time. - Public access: disabled.
- Transport: HTTPS only.
- Minimum TLS version: 1.2.
- Redundancy: zone-redundant, if your data needs to survive a zone outage.
- Credentials with read and write access to the five buckets.
Release namespace, Secret, and Helm values
The platform reads object storage settings from two places:
- Secret: holds the credentials.
- Helm values under
global.objectStorage: hold the account and bucket names.
Inside the monitoring namespace, in which the platform lives:
- Secret name:
observability-platform-object-storage. Keep the name and the key names exactly as written. - Secret key on Azure Blob Storage:
AZURE_STORAGE_KEY, holding the storage account key.
Example for Azure Blob Storage:
kubectl create secret generic observability-platform-object-storage \
--namespace monitoring \
--from-literal=AZURE_STORAGE_KEY=<storage-account-key>
Warning: Static credentials are long-lived. Rotate them in your object storage service, then update the Secret and restart the Mimir, Loki, and Tempo pods.
Set the account and bucket names in your values file. Example for Azure Blob Storage:
global:
objectStorage:
azure:
accountName: <storage-account>
buckets:
mimirBlocks: mimir-blocks
mimirAlertmanager: mimir-alertmanager
mimirRuler: mimir-ruler
loki: loki
tempo: tempo
The bucket names above are the defaults. With these names, only accountName is required.
Grafana access
External access to Grafana is disabled by default. Giant Swarm recommends exposing Grafana to your users through an ingress. See GATEWAY.md.
An ingress for Grafana needs:
- Ingress controller or Gateway API implementation.
- DNS name for Grafana.
- TLS certificate for that name.
External API (optional)
The Observability Platform API accepts metrics, logs, and traces from outside the cluster. It’s disabled by default. Without it, the platform observes only the cluster it runs in. Enable it when agents, collectors, or users outside the cluster send or query data. See EXTERNAL_API.md.
- Envoy Gateway installed in the cluster. See GATEWAY.md.
- Gateway with an HTTPS listener that accepts routes from the
monitoringnamespace. SetparentRefson every API component (loki,mimir,tempo, andbasicAuth) to that Gateway and listener. See GATEWAY.md. - Base domain. The API answers at
observability.<domain>. - DNS record for
observability.<domain>, pointing at the Gateway. See GATEWAY.md. - OIDC issuer, at least one. Every request carries a JWT from that issuer.
- Tenant header. Every request carries an
X-Scope-OrgIDheader with the tenant name.
Provider guidance
See EKS_CLUSTER.md.
- Nodes: 3 ×
m6i.xlargeort3.xlarge, one per availability zone. - CSI driver: install the
aws-ebs-csi-driveradd-on. Its IAM role needs theAmazonEBSCSIDriverPolicypolicy. - StorageClass: create a
gp3class with provisionerebs.csi.aws.comand mark it as default. The built-ingp2class isn’t the default on EKS 1.30 and later. - Metrics server: install the
metrics-serveradd-on. - DNS service:
kube-dns. No change needed.
Create the gp3 StorageClass:
kubectl apply -f - <<'EOF'
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
type: gp3
encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
EOF
- Nodes: 3 ×
Standard_D4s_v5, spread over zones 1, 2, and 3. - CSI driver: the Azure Disk CSI driver ships with AKS. No change needed.
- StorageClass: the built-in
defaultclass is the default. It uses zone-redundant Standard SSD (StandardSSD_ZRS) withWaitForFirstConsumer. Usemanaged-csi-premiumfor Premium SSD. - Metrics server: ships with AKS. No change needed.
- DNS service:
kube-dns. No change needed.
Create a node pool across three zones:
az aks nodepool add \
--resource-group <resource-group> \
--cluster-name <cluster> \
--name observability \
--node-count 3 \
--node-vm-size Standard_D4s_v5 \
--zones 1 2 3
Next steps
Install the platform with the observability-platform chart.
If you need help with the setup, contact your Giant Swarm account engineer. For sharing any secret with us, read Sharing secrets with our team first.
Need help, got feedback?
We listen to your Slack support channel. You can also reach us at support@giantswarm.io. And of course, we welcome your pull requests!