---
title: "Upgrade from the Loki Helm chart to the Community Helm chart | Grafana Enterprise Logs documentation"
description: "Upgrade from the Loki repository Helm chart (6.x) to the Grafana Community Helm chart."
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

# Upgrade from the Loki Helm chart to the Community Helm chart

The Loki Helm chart has moved from the [Loki repository](https://github.com/grafana/loki) to the [Grafana Community Helm Charts repository](https://github.com/grafana-community/helm-charts). Chart version 6.55.0 (appVersion 3.6.7) was the last release from the Loki repository. Chart version 18.7.6 (appVersion 3.7.6) is the current release from the community repository at the time this topic was published.

This guide walks you through upgrading from 6.55.0 to the current community chart version, which spans twelve major chart versions (7 through 18), each with breaking changes.

> Warning
> 
> Grafana Enterprise Logs (GEL) support was removed from the community chart in version 8.0.0. If you are a GEL user, **do not migrate** to the community chart. The `grafana/loki` chart remains available for GEL users.

> Caution
> 
> This upgrade spans several major versions with accumulated breaking changes. Test the upgrade in a non-production environment before applying it to production.

## Prerequisites

Before you begin:

- Kubernetes 1.25 or later is required (enforced since chart version 7.0.0).
- Helm 3.x is required.
- Back up your current Helm release values:
  
  Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
  
  ```bash
  helm get values <RELEASE_NAME> -o yaml > backup-values.yaml
  ```
- Back up any persistent volumes and object store indexes.

## Update your Helm repository

The chart is now published to a different Helm repository and Open Container Initiative (OCI) registry. The official Helm documentation now recommends using OCI registries as they implement unified storage, distribution, and improved security.

Old location for 6.x from the Loki repository:

Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```bash
helm repo add grafana https://grafana.github.io/helm-charts
helm upgrade <RELEASE_NAME> grafana/loki -f values.yaml
```

New location for 7.x and later from the community repository:

Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```bash
helm repo add grafana-community https://grafana-community.github.io/helm-charts
helm repo update
helm upgrade <RELEASE_NAME> grafana-community/loki -f values.yaml --version 18.7.6
```

Or if you are using OCI for 7.x and later:

Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```bash
helm upgrade <RELEASE_NAME> oci://ghcr.io/grafana-community/helm-charts/loki -f values.yaml --version 18.7.6
```

## Update your values file for breaking changes

The following sections describe every breaking change between chart versions 6.55.0 and 18.x, grouped by the major version that introduced each change. Review each section and update your values file accordingly.

> Caution
> 
> Check the Loki Helm Chart [README](https://github.com/grafana-community/helm-charts/tree/main/charts/loki#upgrading) for the latest changes and upgrade information. The Grafana Community is constantly improving the charts.

### 6.x to 7.0: Kubernetes API cleanup

Support for deprecated Kubernetes APIs and PodSecurityPolicy has been removed. Kubernetes 1.25 or later is now required.

Remove the following from your values file:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
rbac:
  pspEnabled: false        # remove this key
  pspAnnotations: {}       # remove this key
```

The `rbac` section in 13.x only contains:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
rbac:
  sccEnabled: false
  sccAllowHostDirVolumePlugin: false
  namespaced: false
```

Expand table

| If you have                   | using                       | update them to         |
|-------------------------------|-----------------------------|------------------------|
| custom Ingress resources      | `networking.k8s.io/v1beta1` | `networking.k8s.io/v1` |
| PodDisruptionBudget resources | `policy/v1beta1`            | `policy/v1`            |

### 7.x to 8.0: Enterprise support removed

Enterprise support is removed in the community Helm chart.

Remove the entire `enterprise` configuration section from your chart, including any `enterprise.*` keys:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
enterprise:
  enabled: false
  version: 3.6.5
  cluster_name: null
  license:
    contents: "NOTAVALIDLICENSE"
  useExternalLicense: false
  externalLicenseName: null
  externalConfigName: ""
  gelGateway: true
```

> Note
> 
> The Helm Chart in the Loki repository is being maintained for GEL customers only.

### 8.x to 9.0: Self-monitoring and Grafana Agent Operator removed

The `monitoring.selfMonitoring` section and the `grafana-agent-operator` subchart dependency have been removed.

Remove the `monitoring.selfMonitoring` section from your values file:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
monitoring:
  selfMonitoring:
    enabled: false
    tenant:
      name: "self-monitoring"
      password: null
      secretNamespace: '{{ include "loki.namespace" . }}'
    grafanaAgent:
      installOperator: false
      annotations: {}
      labels: {}
      enableConfigReadAPI: false
      priorityClassName: null
      resources: {}
      tolerations: []
    podLogs:
      apiVersion: monitoring.grafana.com/v1alpha1
      # ...
    logsInstance:
      # ...
```

Also remove `monitoring.serviceMonitor.metricsInstance`, if present. It referenced a Grafana Agent CRD that no longer exists.

Loki canary tenant authentication has moved from `monitoring.selfMonitoring.tenant` to the top-level `lokiCanary.tenant` section. If you were using canary tenant auth, update as follows:

Before (6.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
monitoring:
  selfMonitoring:
    tenant:
      name: "self-monitoring"
      password: "my-password"
```

After (13.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
lokiCanary:
  tenant:
    name: "self-monitoring"
    password: "my-password"
```

> Tip
> 
> [Grafana Alloy](/docs/alloy/latest/) is the successor to Grafana Agent. If you relied on Agent-based self-monitoring, consider using Alloy for log collection.

### 9.x to 10.0: Index gateway persistence restructured

The `indexGateway.persistence.inMemory` field has been replaced with `indexGateway.persistence.dataVolumeParameters` for more consistent configuration across components.

Before (6.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
indexGateway:
  persistence:
    enabled: false
    inMemory: false
    size: 10Gi
```

After (13.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
indexGateway:
  persistence:
    enabled: false
    dataVolumeParameters:
      emptyDir: {}
    size: 10Gi
```

If you were using in-memory storage (`inMemory: true`), the equivalent configuration is:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
indexGateway:
  persistence:
    dataVolumeParameters:
      emptyDir:
        medium: Memory
        sizeLimit: 10Gi
```

### 10.x to 11.0: Legacy read target removed

The `read.legacyReadTarget` option has been removed. Simple scalable deployments now always require a dedicated backend target (read, write, and backend).

Remove from your values file if present:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
read:
  legacyReadTarget: false  # remove this key
```

If you had `legacyReadTarget: true` (running the 2-target read/write mode without a backend), you must now run the 3-target mode (read, write, backend) or switch to a different deployment mode.

### 11.x to 12.0: Deployment mode renamed and default changed

The default `deploymentMode` has changed from `SimpleScalable` to `Monolithic`, and `SingleBinary` has been renamed to `Monolithic`.

Before (6.x default):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
deploymentMode: SimpleScalable
```

After (13.x default):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
deploymentMode: Monolithic
```

Action required based on your current mode:

If you are running `SimpleScalable` (the 6.x default), explicitly set it in your values file to preserve your current deployment:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
deploymentMode: SimpleScalable
```

> Note
> 
> `SimpleScalable` is deprecated and will be removed in Loki 4.0. Plan to migrate to `Monolithic` or `Distributed`.

If you are running `SingleBinary`, update the value to the new name:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
# Before
deploymentMode: SingleBinary

# After
deploymentMode: Monolithic
```

If you are running `Distributed`, no change is needed.

### 12.x to 13.0: Ephemeral volume persistence flattened

The persistence configuration for ephemeral volumes has been flattened across all components. The nested `persistence.ephemeralDataVolume` structure has been replaced with a `persistence.type` field.

> Note
> 
> If you are migrating directly from 6.55.0 and have never used the `ephemeralDataVolume` configuration introduced in the community chart, this change doesn’t require action on your existing values. However, be aware of the new `persistence.type` field when configuring persistence for components like the compactor or bloom-builder.

If you adopted the `ephemeralDataVolume` pattern from any intermediate community chart version, update your values as follows:

Before (12.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
<component>:
  persistence:
    ephemeralDataVolume:
      enabled: true
      accessModes:
        - ReadWriteOnce
      size: 10Gi
      storageClass: null
```

After (13.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
<component>:
  persistence:
    enabled: true
    type: ephemeral
    accessModes:
      - ReadWriteOnce
    size: 10Gi
    storageClass: null
```

The `type` field accepts `pvc` (default for most components) or `ephemeral`. Fields that were nested under `ephemeralDataVolume` (`accessModes`, `size`, `storageClass`, `volumeAttributesClassName`, `selector`, `annotations`, `labels`) now sit directly under `persistence`.

### 13.x to 14.0: Image registry always applied

The dot-based registry format has been removed. Previously, if the `repository` value contained a dot (`.`) in its first path segment, the chart assumed the full registry was already included and silently skipped prepending `global.imageRegistry` or a component-level `image.registry`. This caused configured registries to be ignored for references such as `mirror.gcr.io/grafana/loki`.

The new behavior is that a configured registry is always prepended, unconditionally. `global.imageRegistry` is the highest-precedence registry setting and overrides all component-level `image.registry` values.

If you stored a fully-qualified image reference in `repository` and relied on the old format to prevent double-prefixing, split the value into separate `registry` and `repository` fields:

Before (13.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
loki:
  image:
    repository: private.registry.com/grafana/loki
```

After (14.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
loki:
  image:
    registry: private.registry.com
    repository: grafana/loki
```

Users who only set `repository` to a plain path (for example, `grafana/loki`) or who already use `global.imageRegistry` / `image.registry` correctly are unaffected.

### 14.x to 15.0: Cilium network policies removed

Support for Cilium-specific network policies has been removed. The chart now renders Kubernetes `NetworkPolicy` resources only.

Remove the following from your values file:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
networkPolicy:
  flavor: cilium        # remove this key
  egressWorld:
    enabled: true       # remove this section
  egressKubeApiserver:
    enabled: true       # remove this section
```

After (15.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
networkPolicy:
  enabled: true
```

If you relied on Cilium-only behavior such as `CiliumNetworkPolicy` resources, manage those rules outside the Loki chart using separate manifests or your GitOps workflow.

### 15.x to 16.0: Loki Canary pod template isolated

The `loki-canary` workload no longer inherits metadata from the shared Loki pod template. Canary-specific metadata that was previously sourced from `loki.*` keys must now be set explicitly under `lokiCanary.*`.

Before (15.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
loki:
  annotations:
    team: observability
  serviceAnnotations:
    prometheus.io/scrape: "true"
  serviceLabels:
    app: loki
```

After (16.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
lokiCanary:
  annotations:
    team: observability
  podAnnotations:
    team: observability
  service:
    annotations:
      prometheus.io/scrape: "true"
    labels:
      app: loki-canary
  automountServiceAccountToken: false
```

If you did not set any `loki.annotations`, `loki.serviceAnnotations`, or `loki.serviceLabels` for canary purposes, no action is required.

### 16.x to 17.0: Built-in MinIO subchart deprecated

The built-in MinIO subchart is officially deprecated and **will be removed on 2026-10-31**. Setting `minio.enabled=true` now fails chart rendering unless the workaround `ignoreMinioDeprecation: true` is also set.

#### Temporary workaround (not for new deployments)

If you need to continue using the built-in MinIO subchart temporarily while you plan a migration:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
ignoreMinioDeprecation: true  # Remove before 2026-10-31
minio:
  enabled: true
```

#### Migrate to external object storage

Grafana recommends migrating to a dedicated external object storage backend. The following steps preserve data continuity using a dual-store transition period.

**Before (legacy state using built-in MinIO):**

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
minio:
  enabled: true

loki:
  schemaConfig:
    configs:
      - from: "2024-01-01"
        store: tsdb
        object_store: s3
        schema: v13
        index:
          prefix: index_
          period: 24h
```

**Transition release (temporary dual-store period):**

Keep old MinIO data readable while writing new data to external storage:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
ignoreMinioDeprecation: true
minio:
  enabled: true

loki:
  structuredConfig:
    storage_config:
      named_stores:
        aws:
          minio:
            endpoint: '{{ include "loki.minio" $ }}'
            bucketnames: chunks
            secret_access_key: '{{ $.Values.minio.rootPassword }}'
            access_key_id: '{{ $.Values.minio.rootUser }}'
            s3forcepathstyle: true
            insecure: true
          s3-loki-chunks:
            endpoint: 's3.example.com'
            bucketnames: chunks
            access_key_id: '<s3-access-key>'
            secret_access_key: '<s3-secret-key>'
            s3forcepathstyle: true
            insecure: true
    schema_config:
      configs:
        - from: "2024-01-01"
          store: tsdb
          object_store: minio
          schema: v13
          index:
            prefix: index_
            period: 24h
        - from: "<date shortly after migration start>"
          store: tsdb
          object_store: s3-loki-chunks
          schema: v13
          index:
            prefix: index_
            period: 24h
```

**Final release (after retention has elapsed):**

Once the retention window for data in MinIO has elapsed, remove the MinIO configuration entirely. The chart still requires `loki.storage.bucketNames` for helper-generated storage sections:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
loki:
  storage:
    bucketNames:
      chunks: chunks
      ruler: ruler
  structuredConfig:
    storage_config:
      named_stores:
        aws:
          s3-loki-chunks:
            endpoint: 's3.example.com'
            bucketnames: chunks
            access_key_id: '<s3-access-key>'
            secret_access_key: '<s3-secret-key>'
            s3forcepathstyle: true
            insecure: true
    schema_config:
      configs:
        - from: "<date from transition release>"
          store: tsdb
          object_store: s3-loki-chunks
          schema: v13
          index:
            prefix: index_
            period: 24h
```

For more information on storage schema configuration, see [Storage schema](/docs/loki/latest/operations/storage/schema/).

### 17.x to 18.0: Monitoring block refactored

The `.Values.monitoring` block has been refactored. Do not assume backwards compatibility with any prior monitoring configuration — review this section in full before upgrading.

All dashboards, recording rules, and alert rules are now generated from the upstream [loki-mixin](https://github.com/grafana/loki/tree/main/production/loki-mixin). This keeps the chart aligned with the upstream Loki observability stack and ensures dashboard queries work correctly across all deployment modes.

#### `cluster` label replaced by `app_instance`

The metric label that identifies the Loki Helm release has changed from `cluster` to `app_instance`. The `cluster` label is no longer added by default — it is now reserved for multi-cluster environments and controlled by `monitoring.multiCluster`.

Actions required:

- Update any alerting rules, dashboards, or downstream recording rules that filter on `cluster=~"<release-name>"` to use `app_instance=~"<release-name>"` instead.
- Update any Grafana dashboard URLs that encode the `cluster` variable.
- If you run Loki across multiple Kubernetes clusters, enable `monitoring.multiCluster.enabled` and set `monitoring.multiCluster.clusterName` to restore the `cluster` label with a per-cluster value.

#### Alerts separated from recording rules

Alert rules have been split into a new `monitoring.alerts` section, separate from `monitoring.rules` (which now only controls recording rules). The old `monitoring.rules.configs` block — with per-alert `enabled`, `for`, `lookbackPeriod`, `threshold`, and `severity` fields — has been removed.

Before (17.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
monitoring:
  rules:
    enabled: true
    alerting: true
    configs:
      LokiRequestErrors:
        enabled: true
        for: 15m
        severity: critical
```

After (18.x):

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
monitoring:
  rules:
    enabled: true    # recording rules only
  alerts:
    enabled: true
    overrides:
      LokiRequestErrors:
        for: 15m
        severity: critical
```

> Note
> 
> The `lookbackPeriod` and `threshold` fields are not carried forward. They did not generalize across all PromQL alert expressions and are not present in the loki-mixin alerts.

#### Removed and renamed values

Remove or rename the following keys in your values file:

Expand table

| Old value                                | Replacement                                                                                       |
|------------------------------------------|---------------------------------------------------------------------------------------------------|
| `ingester.updateStrategy`                | `ingester.strategy`                                                                               |
| `clusterLabelOverride`                   | `monitoring.appInstanceLabelName` and `monitoring.appInstanceLabelValue`                          |
| `monitoring.serviceMonitor.clusterLabel` | `monitoring.appInstanceLabelName` and `monitoring.appInstanceLabelValue`                          |
| `monitoring.dashboards.namespace`        | `monitoring.namespace` (now applies to all monitoring resources)                                  |
| `monitoring.rules.namespace`             | `monitoring.namespace`                                                                            |
| `monitoring.rules.additionalGroups`      | `monitoring.additionalPrometheusRules` (dict structure, supports both recording rules and alerts) |
| `monitoring.dashboards.multiCluster`     | `monitoring.multiCluster` (hoisted to the monitoring level)                                       |

#### Recording rule names changed

Recording rule `record:` names now use the `cluster_job:`, `cluster_job_route:`, and `cluster_namespace_job_route:` conventions from the upstream loki-mixin. If you reference recording rule metric names directly in custom alerts or dashboards, update those queries.

#### Dashboard architecture changed

Dashboards are now generated into individual ConfigMap resources (one per dashboard) instead of a single ConfigMap containing all dashboards. If you reference the dashboard ConfigMap by name in any tooling or GitOps manifests, update those references.

## Review additional deprecations

Several per-component fields have been deprecated in favor of unified blocks. These deprecated per-component service fields apply to indexGateway, compactor, and others.

These still work but will be removed in a future release. Consider updating them now:

| Deprecated | Use | | ——————————- | ——————————- – | | indexGateway.serviceLabels | indexGateway.service.labels | | indexGateway.serviceAnnotations | indexGateway.service.annotations | | indexGateway.serviceType | indexGateway.service.type | | indexGateway.appProtocol | indexGateway.service.type | | indexGateway.maxUnavailable | podDisruptionBudget.maxUnavailable |

The global image registry override has also been renamed:

YAML ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```yaml
# Deprecated
global:
  image:
    registry: null

# Use instead
global:
  imageRegistry: null
```

> Note
> 
> As of chart 18.3.0, `singleBinary.persistence.enableStatefulSetAutoDeletePVC` defaults to `false` (it defaulted to `true` before). Since you’re upgrading straight to 18.7.6, your deployment starts on the new default: persistent volume claims (PVCs) for the single binary StatefulSet are retained, not automatically deleted, when the StatefulSet is deleted or scaled down. If you rely on the old auto-delete behavior, set `singleBinary.persistence.enableStatefulSetAutoDeletePVC: true` explicitly in your values file.

## Perform the upgrade

After updating your values file, run the upgrade:

Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```bash
helm upgrade <RELEASE_NAME> grafana-community/loki \
  -f your-updated-values.yaml \
  --version 18.7.6
```

Or using OCI:

Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```bash
helm upgrade <RELEASE_NAME> oci://ghcr.io/grafana-community/helm-charts/loki \
  -f your-updated-values.yaml \
  --version 18.7.6
```

### Verify the upgrade

Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```bash
# Check all pods are running
kubectl get pods -l app.kubernetes.io/name=loki

# Verify Loki is accepting writes
kubectl logs -l app.kubernetes.io/component=write --tail=50

# Verify Loki canary is healthy (if enabled)
kubectl logs -l app.kubernetes.io/component=loki-canary --tail=20
```

## Post-migration cleanup

After a successful upgrade:

- Remove the old Helm repository if no longer needed:
  
  Bash ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy
  
  ```bash
  helm repo remove grafana
  ```
- Update any CI/CD pipelines to reference `grafana-community/loki` or the OCI URL `oci://ghcr.io/grafana-community/helm-charts/loki`.
- Review monitoring dashboards for renamed metrics. Refer to the [Loki 3.x upgrade notes](/docs/loki/latest/setup/upgrade/#30) for metric namespace changes.

## Troubleshoot

### Pods fail to start with PodSecurityPolicy errors

**Cause:** Leftover `rbac.pspEnabled` or `rbac.pspAnnotations` in your values file.

**Fix:** Remove both keys from your values file and re-run the upgrade.

### Loki canary fails authentication

**Cause:** Canary tenant configuration was under `monitoring.selfMonitoring.tenant` in 6.x and has moved to `lokiCanary.tenant` in 13.x.

**Fix:** Move `tenant.name` and `tenant.password` to the `lokiCanary.tenant` section.

### Index gateway CrashLoopBackOff

**Cause:** The old `indexGateway.persistence.inMemory` field is no longer recognized.

**Fix:** Replace `inMemory: true` with the equivalent `dataVolumeParameters` configuration as described in [9.x to 10.0](#9x-to-100-index-gateway-persistence-restructured).

### Unexpected deployment mode change

**Cause:** The default `deploymentMode` changed from `SimpleScalable` to `Monolithic`. If you relied on the default without explicitly setting it, your deployment mode changed on upgrade.

**Fix:** Explicitly set `deploymentMode: SimpleScalable` in your values file (or choose `Monolithic` or `Distributed`) and re-run the upgrade.

### Unknown field errors from enterprise values

**Cause:** The `enterprise.*` section was removed in 8.0.0. Any leftover keys cause Helm to reject the values.

**Fix:** Remove the entire `enterprise` section from your values file.

### Unknown field `ephemeralDataVolume`

**Cause:** The nested `persistence.ephemeralDataVolume` structure was flattened in 13.0.0. If you adopted this pattern from an intermediate community chart version, the old keys are no longer recognized.

**Fix:** Replace `persistence.ephemeralDataVolume.enabled: true` with `persistence.enabled: true` and `persistence.type: ephemeral`, and move all nested fields directly under `persistence` as described in [12.x to 13.0](#12x-to-130-ephemeral-volume-persistence-flattened).

### `minio.enabled=true` fails chart rendering

**Cause:** The built-in MinIO subchart was deprecated in 17.0.0. Setting `minio.enabled=true` without `ignoreMinioDeprecation: true` causes chart rendering to fail with the error:

`The Loki chart builtin MinIO dependency is deprecated and will be removed 2026-10-31.`

**Fix:** Either set `ignoreMinioDeprecation: true` as a temporary workaround while you plan a migration, or migrate to an external object storage backend. See [16.x to 17.0](#16x-to-170-built-in-minio-subchart-deprecated) for migration steps.

### Monitoring values rejected or dashboards missing after upgrade to 18.x

**Cause:** The `monitoring` block was refactored in 18.0.0. Old keys such as `clusterLabelOverride`, `monitoring.serviceMonitor.clusterLabel`, `monitoring.dashboards.namespace`, `monitoring.rules.namespace`, `monitoring.rules.additionalGroups`, and `monitoring.dashboards.multiCluster` no longer exist. Alert rules under `monitoring.rules.configs` are also removed.

**Fix:** Remove or rename all obsolete monitoring keys as described in [17.x to 18.0](#17x-to-180-monitoring-block-refactored). In particular:

- Move alert configuration from `monitoring.rules` to `monitoring.alerts`.
- Replace `clusterLabelOverride` with `monitoring.appInstanceLabelName` / `monitoring.appInstanceLabelValue`.
- Rename `monitoring.dashboards.multiCluster` to `monitoring.multiCluster`.

### Metrics show `app_instance` instead of `cluster` after upgrade to 18.x

**Cause:** The 18.0.0 refactoring renamed the Loki release identifier label from `cluster` to `app_instance`.

**Fix:** Update any alerting rules, dashboards, or recording rules that filter on `cluster=~"<release-name>"` to use `app_instance=~"<release-name>"`. See [17.x to 18.0](#17x-to-180-monitoring-block-refactored) for details.

### Image pulled from wrong registry after upgrade to 14.x

**Cause:** The dot-based registry format was removed in 14.0.0. If you had a fully-qualified image reference such as `private.registry.com/grafana/loki` in the `repository` field, the configured registry is now prepended unconditionally, resulting in a double-prefixed reference.

**Fix:** Split the fully-qualified reference into separate `registry` and `repository` fields as described in [13.x to 14.0](#13x-to-140-image-registry-always-applied).

### Loki Canary fails to start or has missing annotations after upgrade to 16.x

**Cause:** The `loki-canary` workload no longer inherits metadata from the shared `loki.*` pod template values. Settings such as `loki.annotations` and `loki.serviceAnnotations` are no longer applied to the canary.

**Fix:** Move canary-specific metadata to the `lokiCanary.*` section as described in [15.x to 16.0](#15x-to-160-loki-canary-pod-template-isolated).

## Further reading

- [Community chart changelog](https://grafana-community.github.io/helm-charts/changelog/?chart=loki)
- [Community chart README - Upgrading](https://github.com/grafana-community/helm-charts/blob/main/charts/loki/README.md#upgrading)
- [Helm chart 6.x upgrade guide](/docs/loki/latest/setup/upgrade/upgrade-to-6x/)
