Documentation navigation
Mimir Ingester PVC Near Full
Runbook for a Mimir ingester PVC approaching full. For the generic PVC near-full runbook (any PVC, expansion procedure, StatefulSet volumeClaimTemplate convergence), see 04-storage/04-pvc-near-full.md. This runbook is the Mimir-ingester-specific overlay: the failure mode (disk-full deadlock wedges ingestion) and the scoped PVC regex (.*mimir-ingester.*) differ.
Meaning
With the filesystem blocks backend, the Mimir ingester's local PVC is the only copy of recent data — blocks are flushed to the PVC before upload to object storage. A full ingester disk causes a disk-full deadlock: the ingester cannot flush new blocks (no space) and cannot upload old ones to free space (the upload path needs temp space on the same disk). Ingestion halts.
kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes (scraped from each node's kubelet by synapse-client) is the PVC filesystem utilisation. The regex persistentvolumeclaim=~".*mimir-ingester.*" scopes to the ingester PVCs. > 0.8 sustained for 10m is the warning tier; > 0.9 for 5m is the critical tier (imminent deadlock).
The metrics are already in the synapse-client kubelet allow-list (kubelet_volume_stats_used_bytes, kubelet_volume_stats_capacity_bytes) — no chart PR is needed.
What changed from the chart
- All environments — the chart alert had no
environmentfilter. Kept as-is. The{{ $labels.environment }}is in the summary/description. - Two tiers, one runbook — the warning tier (80%) is this runbook's alert. The critical tier (90%) is the same expr with
> 0.9andseverity: critical. Create a separate runbook if you want a distinct critical alert name.
Impact
- The ingester disk is approaching full. At 100% the disk-full deadlock halts ingestion — new samples are not consumed and the ingester cannot recover without human intervention.
- Recent data on the full ingester is at risk: if the disk corrupts under pressure, the un-uploaded blocks are lost.
- The ingester's PVC is a
volumeClaimTemplateon a StatefulSet — expansion requires the GitOps convergence procedure (see04-storage/04-pvc-near-full.mdMitigation step 3).
Diagnosis
The alert labels carry k8s_cluster_name, environment, namespace, persistentvolumeclaim. From the alert, note all of them.
1. Confirm the utilisation and identify the ingester
export KUBECONFIG=~/.kube/<cluster>.yaml # e.g. prd-par01.yaml
NS=monitoring-system
kubectl -n $NS get pvc <persistentvolumeclaim> -o wide
kubectl -n $NS get pod -o wide | grep mimir-ingester # find the pod mounting the PVC
Confirm via Mimir (port-forward synapse-server-mimir-gateway, header X-Scope-OrgID: corti):
QUERY='kubelet_volume_stats_used_bytes{persistentvolumeclaim="<persistentvolumeclaim>"} / kubelet_volume_stats_capacity_bytes{persistentvolumeclaim="<persistentvolumeclaim>"}'
curl -s -G -H "X-Scope-OrgID: corti" "http://localhost:9090/prometheus/api/v1/query" --data-urlencode "query=$QUERY" | jq -r '.data.result[0].value[1]'
A value > 0.8 confirms the alert.
2. Is ingestion already wedged?
Check whether the ingester is failing records (the disk-full deadlock manifests as the ingest-storage wedge):
QUERY='sum by (pod, namespace, k8s_cluster_name) (rate(cortex_ingest_storage_reader_records_failed_total[5m]))'
If > 0, see 05-mimir-ingest-storage-wedged.md.
Mitigation
Step 1 — Activate PIM
Activate the required Azure Privileged Identity Management roles before touching production (MultiTenantEuOnlyAccessPimRoles / DevOpsPimRoles / Platform Team (privileged)), as in 03-kafka/01-consumer-lag.md.
Step 2 — Expand the PVC (the durable fix)
Follow 04-storage/04-pvc-near-full.md Mitigation step 3 for the full procedure — the ingester PVC is a volumeClaimTemplate on the Mimir ingester StatefulSet, so the zero-downtime orphan-delete + ArgoCD sync convergence applies:
# 1. Capacity fix (urgent, online) — expands the PVC immediately
kubectl -n monitoring-system patch pvc <persistentvolumeclaim> --patch '{"spec":{"resources":{"requests":{"storage":"<new-size>Gi"}}}}'
# 2. GitOps convergence — edit the synapse-server chart values to match, merge, then:
kubectl -n monitoring-system delete sts <statefulset> --cascade=orphan
# ArgoCD recreates the STS with the new volumeClaimTemplate and re-adopts the running pod
Step 3 — Trim retention / cardinality (reversible)
If expanding the PVC is not immediately possible, reduce the data on the disk:
- Lower the ingester's
max_seriesto reduce active series (carefully — see04-mimir-ingester-series-limit.md). - Confirm the compactor is enabled and retention is reclaiming space.
- Reduce the blocks retention period if the ingester holds more history than needed.
Verify
- The alert clears once
used / capacity <= 0.8sustained for thefor: 10mwindow. kubectl -n monitoring-system get pvc <persistentvolumeclaim>shows the updatedCapacity.cortex_ingest_storage_reader_records_failed_totaldoes not appear (no wedge).
Notes
- Metrics already collected —
kubelet_volume_stats_used_bytes/kubelet_volume_stats_capacity_bytesare in the synapse-client kubelet allow-list. No chart PR required. - Two tiers, one runbook — warning (80%) is this alert; critical (90%) is the same expr with
> 0.9. - Filesystem blocks backend — the disk-full deadlock is specific to the filesystem blocks backend. If Mimir is configured with a different backend, the failure mode differs.
- See also —
04-storage/04-pvc-near-full.md(generic PVC expansion),05-mimir-ingest-storage-wedged.md(post-wedge),04-mimir-ingester-series-limit.md(series limit that can drive disk fill).