<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Migration guides on Grafana Labs</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/</link><description>Recent content in Migration guides on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/helm-charts/mimir-distributed/latest/migration-guides/index.xml" rel="self" type="application/rss+xml"/><item><title>Migrate from Cortex to Grafana Mimir</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-from-cortex/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-from-cortex/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-from-cortex-to-grafana-mimir&#34;&gt;Migrate from Cortex to Grafana Mimir&lt;/h1&gt;
&lt;p&gt;As an operator, you can migrate a Helm deployment of &lt;a href=&#34;https://cortexmetrics.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Cortex&lt;/a&gt; to Grafana Mimir.
The overview includes the steps required for any environment. To migrate deployment environments with Helm, see &lt;a href=&#34;#migrate-to-grafana-mimir-using-helm&#34;&gt;Migrate to Grafana Mimir using Helm&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This document was tested with Cortex versions 1.10 and 1.11. It might work with more recent versions of Cortex, but that is not guaranteed.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To migrate a Jsonnet deployment of Cortex refer to [Migrate from Cortex].&lt;/p&gt;
&lt;p&gt;Grafana Mimir includes significant changes that simplify the deployment and continued operation of a horizontally scalable, multi-tenant time series database with long-term storage.&lt;/p&gt;
&lt;p&gt;The changes make Grafana Mimir easier to run out of the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removed configuration parameters that don&amp;rsquo;t require tuning&lt;/li&gt;
&lt;li&gt;Renamed some parameters so that they&amp;rsquo;re more easily understood&lt;/li&gt;
&lt;li&gt;Updated the default values of some existing parameters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;mimirtool&lt;/code&gt; automates configuration conversion.
It provides a simple migration by generating Mimir configuration from Cortex configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before you begin:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ensure that you are running either Cortex 1.10.X or Cortex 1.11.X.&lt;/p&gt;
&lt;p&gt;If you are running an older version of Cortex, upgrade to &lt;a href=&#34;https://github.com/cortexproject/cortex/releases&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Cortex 1.11.1&lt;/a&gt; before proceeding with the migration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure you have installed Cortex alerting and recording rules as well as Cortex dashboards.&lt;/p&gt;
&lt;p&gt;Using the monitoring mixin, you need to install both alerting and recording rules in either Prometheus or Cortex. You also need to install dashboards in Grafana.
To download a prebuilt ZIP file that contains the alerting and recording rules, refer to &lt;a href=&#34;https://github.com/grafana/cortex-jsonnet/releases/download/1.11.0/cortex-mixin.zip&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Release Cortex-jsonnet 1.11.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To upload rules to the ruler using mimirtool, refer to [mimirtool rules].
To import the dashboards into Grafana, refer to &lt;a href=&#34;/docs/grafana/latest/dashboards/export-import/#import-dashboard&#34;&gt;Import dashboard&lt;/a&gt;
.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;notable-changes&#34;&gt;Notable changes&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For the full list of changes, refer to Mimir’s &lt;a href=&#34;https://github.com/grafana/mimir/blob/main/CHANGELOG.md&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;The Grafana Mimir HTTP server defaults to listening on port 8080; Cortex defaults to listening on port 80.
To maintain port 80 as the listening port, set &lt;code&gt;-server.http-listen-port=80&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Grafana Mimir uses &lt;code&gt;anonymous&lt;/code&gt; as the default tenant ID when &lt;code&gt;-auth.multitenancy=false&lt;/code&gt;.
Cortex uses &lt;code&gt;fake&lt;/code&gt; as the default tenant ID when &lt;code&gt;-auth.enabled=false&lt;/code&gt;.
Use &lt;code&gt;-auth.no-auth-tenant=fake&lt;/code&gt; when &lt;code&gt;-auth.multitenancy=false&lt;/code&gt; to match the Cortex default tenant ID.&lt;/li&gt;
&lt;li&gt;Grafana Mimir removes the legacy HTTP prefixes deprecated in Cortex.
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Query endpoints&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Legacy&lt;/th&gt;
              &lt;th&gt;Current&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/query&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/query&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/query_range&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/query_range&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/query_exemplars&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/query_exemplars&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/series&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/series&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/labels&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/labels&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/label/{name}/values&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/label/{name}/values&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/metadata&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/metadata&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/read&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/read&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/cardinality/label_names&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/cardinality/label_names&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/cardinality/label_values&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/cardinality/label_values&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/api/prom/user_stats&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/api/v1/user_stats&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distributor endpoints&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Legacy endpoint&lt;/th&gt;
              &lt;th&gt;Current&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/push&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/api/v1/push&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/all_user_stats&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/distributor/all_user_stats&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/ha-tracker&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/distributor/ha_tracker&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ingester endpoints&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Legacy&lt;/th&gt;
              &lt;th&gt;Current&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/ring&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/ingester/ring&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/shutdown&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/ingester/shutdown&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/flush&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/ingester/flush&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/push&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/ingester/push&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ruler endpoints&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Legacy&lt;/th&gt;
              &lt;th&gt;Current&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/rules&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/rules&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/api/v1/alerts&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/api/v1/alerts&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/rules&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/config/v1/rules&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/rules/{namespace}&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/config/v1/rules/{namespace}&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/rules/{namespace}/{groupName}&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/config/v1/rules/{namespace}/{groupName}&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/rules/{namespace}&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/config/v1/rules/{namespace}&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/rules/{namespace}/{groupName}&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/config/v1/rules/{namespace}/{groupName}&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;/rules/{namespace}&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;&amp;lt;prometheus-http-prefix&amp;gt;/config/v1/rules/{namespace}&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/ruler_ring&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/ruler/ring&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alertmanager endpoints&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Legacy&lt;/th&gt;
              &lt;th&gt;Current&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/&amp;lt;legacy-http-prefix&amp;gt;&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/alertmanager&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;/status&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;/multitenant_alertmanager/status&lt;/code&gt;&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;generate-the-configuration-for-grafana-mimir&#34;&gt;Generate the configuration for Grafana Mimir&lt;/h2&gt;
&lt;p&gt;The [&lt;code&gt;mimirtool config convert&lt;/code&gt;] command converts Cortex configuration to Mimir configuration. You can use it to update both flags and configuration files.&lt;/p&gt;
&lt;h3 id=&#34;install-mimirtool&#34;&gt;Install mimirtool&lt;/h3&gt;
&lt;p&gt;To install Mimirtool, download the appropriate binary from the &lt;a href=&#34;https://github.com/grafana/mimir/releases/latest&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;latest release&lt;/a&gt; for your operating system and architecture and make it executable.&lt;/p&gt;
&lt;p&gt;Alternatively, use a command line tool such as &lt;code&gt;curl&lt;/code&gt; to download &lt;code&gt;mimirtool&lt;/code&gt;. For example, for Linux with the AMD64 architecture, use the following command:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl -fLo mimirtool https://github.com/grafana/mimir/releases/latest/download/mimirtool-linux-amd64
chmod &amp;#43;x mimirtool&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;use-mimirtool&#34;&gt;Use mimirtool&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;mimirtool config convert&lt;/code&gt; command converts Cortex 1.11 configuration files to Grafana Mimir configuration files.
It removes any configuration parameters that are no longer available in Grafana Mimir, and it renames configuration parameters that have a new name.
If you have explicitly set configuration parameters to a value matching the Cortex default, by default, &lt;code&gt;mimirtool config convert&lt;/code&gt; doesn&amp;rsquo;t update the value.
To have &lt;code&gt;mimirtool config convert&lt;/code&gt; update explicitly set values from the Cortex defaults to the new Grafana Mimir defaults, provide the &lt;code&gt;--update-defaults&lt;/code&gt; flag.
Refer to [convert] for more information on using &lt;code&gt;mimirtool&lt;/code&gt; for configuration conversion.&lt;/p&gt;
&lt;h2 id=&#34;migrate-to-grafana-mimir-using-helm&#34;&gt;Migrate to Grafana Mimir using Helm&lt;/h2&gt;
&lt;p&gt;You can migrate to the Grafana Mimir Helm chart (&lt;code&gt;grafana/mimir-distributed&lt;/code&gt; v3.1.0) from the Cortex Helm chart
(&lt;code&gt;cortex-helm/cortex&lt;/code&gt; v1.7.0).&lt;/p&gt;
&lt;h3 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ensure that you are running the v1.7.0 release of the Cortex Helm chart.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that you are running ingesters using a Kubernetes StatefulSet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &lt;code&gt;yq&lt;/code&gt; &lt;a href=&#34;https://github.com/mikefarah/yq&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;v4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;ingester:
  statefulSet:
    enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The ingester needs storage capacity for write-ahead-logging (WAL) and to create blocks for uploading.
The WAL was optional in Cortex with chunks, but not optional in Mimir.
A StatefulSet is the most convenient way to make sure that each Pod gets a dedicated storage volume.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;To migrate to the Grafana Mimir Helm chart:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install the updated monitoring mixin.&lt;/p&gt;
&lt;p&gt;a. Add the dashboards to Grafana. The dashboards replace your Cortex dashboards and continue to work for monitoring Cortex deployments.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Resource dashboards are now enabled by default and require additional metrics sources.
To understand the required metrics sources, refer to [Additional resources metrics].&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;b. Install the recording and alerting rules into the ruler or a Prometheus server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following command to add the Grafana Helm chart repository:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm repo add grafana https://grafana.github.io/helm-charts&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Convert the Cortex configuration in your &lt;code&gt;values.yaml&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;a. Extract the Cortex configuration and write the output to the &lt;code&gt;cortex.yaml&lt;/code&gt; file.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yq &amp;#39;.config&amp;#39; &amp;lt;VALUES YAML FILE&amp;gt; &amp;gt; cortex.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;b. Use &lt;code&gt;mimirtool&lt;/code&gt; to update the configuration.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;mimirtool config convert --yaml-file cortex.yaml --yaml-out mimir.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;c. Clean up the generated YAML configuration.&lt;/p&gt;
&lt;p&gt;You have to remove some fields that are generated by &lt;code&gt;mimirtool config convert&lt;/code&gt; or are coming from old configuration,
because the mimir-distributed Helm chart has already set the default value for them. Use the following script to
clean up those fields:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;yq -i &amp;#39;del(.activity_tracker.filepath,.alertmanager.data_dir,.compactor.data_dir,.frontend_worker.frontend_address,.ingester.ring.tokens_file_path,.ruler.alertmanager_url,.ruler.rule_path,.runtime_config.file)&amp;#39; mimir.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;d. At the top level of your custom Helm values file, put the updated configuration under the &lt;code&gt;mimir.structuredConfig&lt;/code&gt; key.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;code&gt;mimir.structuredConfig&lt;/code&gt; field, which is added in v3.0.0, allows you to override a specific
configuration without needing to rewrite the whole block string literal, such as in &lt;code&gt;mimir.config&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In your Helm values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig: &amp;lt;CONFIGURATION FILE CONTENTS&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    ingester:
      ring:
        num_tokens: 512&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;e. Set the ingester &lt;code&gt;podManagementPolicy&lt;/code&gt; to &lt;code&gt;&amp;quot;OrderedReady&amp;quot;&lt;/code&gt;.
The Grafana Mimir chart prefers &lt;code&gt;&amp;quot;Parallel&amp;quot;&lt;/code&gt; for faster scale up, but this field is immutable on an existing StatefulSet.&lt;/p&gt;
&lt;p&gt;In your &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  podManagementPolicy: &amp;#34;OrderedReady&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;f. Set the &lt;code&gt;nameOverride&lt;/code&gt; parameter to &lt;code&gt;cortex&lt;/code&gt;.
This configuration parameter ensures that resources have the same names as those created by the Cortex Helm chart and ensures Kubernetes performs a rolling upgrade of existing resources instead of creating new resources.&lt;/p&gt;
&lt;p&gt;In your &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;nameOverride: &amp;#34;cortex&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;g. Disable MinIO.
The Grafana Mimir Helm chart enables MinIO by default for convenience during first time install.
If you are migrating from Cortex and have your existing object storage you must disable MinIO in Grafana Mimir Helm
chart custom values.yaml.&lt;/p&gt;
&lt;p&gt;In your &lt;code&gt;values.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;minio:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the Helm upgrade with the Grafana Mimir chart.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The name of the release must match your Cortex Helm chart release.&lt;/p&gt;&lt;/blockquote&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm upgrade &amp;lt;RELEASE&amp;gt; grafana/mimir-distributed [-n &amp;lt;NAMESPACE&amp;gt;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To verify that the cluster is operating correctly, use the [monitoring mixin dashboards].&lt;/p&gt;
]]></content><description>&lt;h1 id="migrate-from-cortex-to-grafana-mimir">Migrate from Cortex to Grafana Mimir&lt;/h1>
&lt;p>As an operator, you can migrate a Helm deployment of &lt;a href="https://cortexmetrics.io/" target="_blank" rel="noopener noreferrer">Cortex&lt;/a> to Grafana Mimir.
The overview includes the steps required for any environment. To migrate deployment environments with Helm, see &lt;a href="#migrate-to-grafana-mimir-using-helm">Migrate to Grafana Mimir using Helm&lt;/a>.&lt;/p></description></item><item><title>Migrate from single zone to zone-aware replication in Mimir Helm chart version 4.0</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-from-single-zone-with-helm/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-from-single-zone-with-helm/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-from-single-zone-to-zone-aware-replication-in-mimir-helm-chart-version-40&#34;&gt;Migrate from single zone to zone-aware replication in Mimir Helm chart version 4.0&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart version 4.0 enables zone-aware replication by default. This is a breaking change for existing installations and requires a migration.&lt;/p&gt;
&lt;p&gt;This document explains how to migrate stateful components from single zone to 
    &lt;a href=&#34;/docs/mimir/v3.1.x/configure/configure-zone-aware-replication/&#34;&gt;zone-aware replication&lt;/a&gt; with Helm. The three components in question are the 
    &lt;a href=&#34;/docs/mimir/v3.1.x/references/architecture/components/alertmanager/&#34;&gt;alertmanager&lt;/a&gt;, the 
    &lt;a href=&#34;/docs/mimir/v3.1.x/references/architecture/components/store-gateway/&#34;&gt;store-gateway&lt;/a&gt; and the 
    &lt;a href=&#34;/docs/mimir/v3.1.x/references/architecture/components/ingester/&#34;&gt;ingester&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The migration path of Alertmanager and store-gateway is straight forward, however migrating ingesters is more complicated.&lt;/p&gt;
&lt;h2 id=&#34;prerequisite&#34;&gt;Prerequisite&lt;/h2&gt;
&lt;p&gt;Depending on what version of the &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart is installed currently, make sure to meet the following requirements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If the current version of the &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart is less than 4.0.0 (version &amp;lt; 4.0.0).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Follow the upgrade instructions for 4.0.0 in the &lt;a href=&#34;https://github.com/grafana/mimir/blob/main/operations/helm/charts/mimir-distributed/CHANGELOG.md#400&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;CHANGELOG.md&lt;/a&gt;.
In particular make sure to disable zone awareness before upgrading the chart:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: false
store_gateway:
  zoneAwareReplication:
    enabled: false
rollout_operator:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  A direct upgrade from non-zone aware ingesters to zone-aware ingesters will cause data loss.
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have modified the &lt;code&gt;mimir.config&lt;/code&gt; value, either make sure to merge in the latest version from the chart, or consider using &lt;code&gt;mimir.structuredConfig&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href=&#34;../../run-production-environment-with-helm/configuration-with-helm/&#34;&gt;Manage the configuration of Grafana Mimir with Helm&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the current version of the &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart is greater than 4.0.0 (version &amp;gt;= 4.0.0).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure that zone-aware replication is turned off for the component in question.&lt;/p&gt;
&lt;p&gt;For example, the store-gateway:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have modified the &lt;code&gt;mimir.config&lt;/code&gt; value, either make sure to merge in the latest version from the chart, or consider using &lt;code&gt;mimir.structuredConfig&lt;/code&gt; instead.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href=&#34;../../run-production-environment-with-helm/configuration-with-helm/&#34;&gt;Manage the configuration of Grafana Mimir with Helm&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;migrate-alertmanager-to-zone-aware-replication&#34;&gt;Migrate alertmanager to zone-aware replication&lt;/h2&gt;
&lt;p&gt;Using zone-aware replication for alertmanager is optional and is only available if alertmanager is deployed as a StatefulSet.&lt;/p&gt;
&lt;h3 id=&#34;configure-zone-aware-replication-for-alertmanagers&#34;&gt;Configure zone-aware replication for Alertmanagers&lt;/h3&gt;
&lt;p&gt;This section is about planning and configuring the availability zones defined under the &lt;code&gt;alertmanager.zoneAwareReplication&lt;/code&gt; Helm value.&lt;/p&gt;
&lt;p&gt;There are two use cases in general:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Speeding up rollout of alertmanagers in case there are more than 3 replicas. In this case use the default value in the &lt;code&gt;small.yaml&lt;/code&gt;, &lt;code&gt;large.yaml&lt;/code&gt;, &lt;code&gt;capped-small.yaml&lt;/code&gt; or &lt;code&gt;capped-large.yaml&lt;/code&gt;. The default value defines 3 &amp;ldquo;virtual&amp;rdquo; zones and sets affinity rules so that alertmanagers from different zones do not mix, but it allows multiple alertmanagers of the same zone on the same node:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;alertmanager:
  zoneAwareReplication:
    topologyKey: &amp;#34;kubernetes.io/hostname&amp;#34; # Triggers creating anti-affinity rules&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Geographical redundancy. In this case you need to set a suitable &lt;a href=&#34;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;nodeSelector&lt;/a&gt; value to choose where the pods of each zone are to be placed. Setting &lt;code&gt;topologyKey&lt;/code&gt; will instruct the Helm chart to create anti-affinity rules so that alertmanagers from different zones do not mix, but it allows multiple alertmanagers of the same zone on the same node. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;alertmanager:
  zoneAwareReplication:
    topologyKey: &amp;#34;kubernetes.io/hostname&amp;#34; # Triggers creating anti-affinity rules
    zones:
      - name: zone-a
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-a
      - name: zone-b
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-b
      - name: zone-c
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-c&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: as the &lt;code&gt;zones&lt;/code&gt; value is an array, you must copy and modify it to make changes to it, there is no way to overwrite just parts of the array!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Set the chosen configuration in your custom values (e.g. &lt;code&gt;custom.yaml&lt;/code&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The number of alertmanager Pods that will be started is derived from &lt;code&gt;alertmanager.replicas&lt;/code&gt;. Each zone will start &lt;code&gt;alertmanager.replicas / number of zones&lt;/code&gt; pods, rounded up to the nearest integer value. For example if you have 3 zones, then &lt;code&gt;alertmanager.replicas=3&lt;/code&gt; will yield 1 alertmanager per zone, but &lt;code&gt;alertmanager.replicas=4&lt;/code&gt; will yield 2 per zone, 6 in total.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;migrate-alertmanager&#34;&gt;Migrate Alertmanager&lt;/h3&gt;
&lt;p&gt;Before starting this procedure, set up your zones according to &lt;a href=&#34;#configure-zone-aware-replication-for-alertmanagers&#34;&gt;Configure zone-aware replication for alertmanagers&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new empty YAML file called &lt;code&gt;migrate.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the migration.&lt;/p&gt;
&lt;p&gt;Copy the following into the &lt;code&gt;migrate.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;alertmanager:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;p&gt;In this step zone-awareness is enabled with the default zone and new StatefulSets are created for zone-aware alertmanagers, but no new pods are started.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all alertmanagers are restarted and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scale up zone-aware alertmanagers.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;alertmanager:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      writePath: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all new zone-aware alertmanagers are started and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the final configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merge&lt;/strong&gt; the following values into your custom Helm values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;alertmanager:
  zoneAwareReplication:
    enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the Service and StatefulSet resources of the non zone-aware alertmanagers have been deleted.
The previous step also removes the Service and StatefulSet manifests of the old non zone-aware alertmanagers.
In some cases, such as when using Helm from Tanka, these resources will not be automatically deleted from your Kubernetes cluster
even if the Helm chart no longer renders them. If the old resources still exist, delete them manually.
If not deleted, some of the pods may be scraped multiple times when using the Prometheus operator for metamonitoring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until old non zone-aware alertmanagers are terminated.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;migrate-store-gateways-to-zone-aware-replication&#34;&gt;Migrate store-gateways to zone-aware replication&lt;/h2&gt;
&lt;h3 id=&#34;configure-zone-aware-replication-for-store-gateways&#34;&gt;Configure zone-aware replication for store-gateways&lt;/h3&gt;
&lt;p&gt;This section is about planning and configuring the availability zones defined under the &lt;code&gt;store_gateway.zoneAwareReplication&lt;/code&gt; Helm value.&lt;/p&gt;
&lt;p&gt;There are two use cases in general:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Speeding up rollout of store-gateways in case there are more than 3 replicas. In this case use the default value in the &lt;code&gt;small.yaml&lt;/code&gt;, &lt;code&gt;large.yaml&lt;/code&gt;, &lt;code&gt;capped-small.yaml&lt;/code&gt; or &lt;code&gt;capped-large.yaml&lt;/code&gt;. The default value defines 3 &amp;ldquo;virtual&amp;rdquo; zones and sets affinity rules so that store-gateways from different zones do not mix, but it allows multiple store-gateways of the same zone on the same node:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: false # Do not turn on zone-awareness without migration because of potential query errors
    topologyKey: &amp;#34;kubernetes.io/hostname&amp;#34; # Triggers creating anti-affinity rules&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Geographical redundancy. In this case you need to set a suitable &lt;a href=&#34;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;nodeSelector&lt;/a&gt; value to choose where the pods of each zone are to be placed. Setting &lt;code&gt;topologyKey&lt;/code&gt; will instruct the Helm chart to create anti-affinity rules so that store-gateways from different zones do not mix, but it allows multiple store-gateways of the same zone on the same node. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: false # Do not turn on zone-awareness without migration because of potential query errors
    topologyKey: &amp;#34;kubernetes.io/hostname&amp;#34; # Triggers creating anti-affinity rules
    zones:
      - name: zone-a
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-a
      - name: zone-b
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-b
      - name: zone-c
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-c&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: as &lt;code&gt;zones&lt;/code&gt; value is an array, you must copy and modify it to make changes to it, there is no way to overwrite just parts of the array!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Set the chosen configuration in your custom values (e.g. &lt;code&gt;custom.yaml&lt;/code&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The number of store-gateway pods that will be started is derived from &lt;code&gt;store_gateway.replicas&lt;/code&gt;. Each zone will start &lt;code&gt;store_gateway.replicas / number of zones&lt;/code&gt; pods, rounded up to the nearest integer value. For example if you have 3 zones, then &lt;code&gt;store_gateway.replicas=3&lt;/code&gt; will yield 1 store-gateway per zone, but &lt;code&gt;store_gateway.replicas=4&lt;/code&gt; will yield 2 per zone, 6 in total.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;decide-which-migration-path-to-take-for-store-gateways&#34;&gt;Decide which migration path to take for store-gateways&lt;/h3&gt;
&lt;p&gt;There are two ways to do the migration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;With downtime. In this &lt;a href=&#34;#migrate-store-gateways-with-downtime&#34;&gt;procedure&lt;/a&gt; old non zone-aware store-gateways are stopped, which will cause queries that look back more than 12 hours (or whatever &lt;code&gt;querier.query_store_after&lt;/code&gt; Mimir parameter is set to) to fail. Ingestion is not impacted. This is the quicker and simpler way.&lt;/li&gt;
&lt;li&gt;Without downtime. This is a multi step &lt;a href=&#34;#migrate-store-gateways-without-downtime&#34;&gt;procedure&lt;/a&gt; which requires additional hardware resources as the old and new store-gateways run in parallel for some time.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;migrate-store-gateways-with-downtime&#34;&gt;Migrate store-gateways with downtime&lt;/h3&gt;
&lt;p&gt;Before starting this procedure, set up your zones according to &lt;a href=&#34;#configure-zone-aware-replication-for-store-gateways&#34;&gt;Configure zone-aware replication for store-gateways&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new empty YAML file called &lt;code&gt;migrate.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scale the current store-gateways to 0.&lt;/p&gt;
&lt;p&gt;Copy the following into the &lt;code&gt;migrate.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  replicas: 0
  zoneAwareReplication:
    enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all store-gateways have terminated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the final configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merge&lt;/strong&gt; the following values into your custom Helm values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These values are actually the default, which means that removing the values &lt;code&gt;store_gateway.zoneAwareReplication.enabled&lt;/code&gt; and &lt;code&gt;rollout_operator.enabled&lt;/code&gt; is also a valid step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the Service and StatefulSet resources of the non zone-aware store-gateways have been deleted.
The previous step also removes the Service and StatefulSet manifests of the old non zone-aware store-gateways.
In some cases, such as when using Helm from Tanka, these resources will not be automatically deleted from your Kubernetes cluster
even if the Helm chart no longer renders them. If the old resources still exist, delete them manually.
If not deleted, some of the pods may be scraped multiple times when using the Prometheus operator for metamonitoring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all store-gateways are running and ready.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;migrate-store-gateways-without-downtime&#34;&gt;Migrate store-gateways without downtime&lt;/h3&gt;
&lt;p&gt;Before starting this procedure, set up your zones according to &lt;a href=&#34;#configure-zone-aware-replication-for-store-gateways&#34;&gt;Configure zone-aware replication for store-gateways&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new empty YAML file called &lt;code&gt;migrate.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create the new zone-aware store-gateways&lt;/p&gt;
&lt;p&gt;Copy the following into the &lt;code&gt;migrate.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for all new store-gateways to start up and be ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make the read path use the new zone-aware store-gateways.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      readPath: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for all queriers and rulers to restart and become ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the final configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merge&lt;/strong&gt; the following values into your custom Helm values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;store_gateway:
  zoneAwareReplication:
    enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These values are actually the default, which means that removing the values &lt;code&gt;store_gateway.zoneAwareReplication.enabled&lt;/code&gt; and &lt;code&gt;rollout_operator.enabled&lt;/code&gt; is also a valid step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the Service and StatefulSet resources of the non zone-aware store-gateways have been deleted.
The previous step also removes the Service and StatefulSet manifests of the old non zone-aware store-gateways.
In some cases, such as when using Helm from Tanka, these resources will not be automatically deleted from your Kubernetes cluster
even if the Helm chart no longer renders them. If the old resources still exist, delete them manually.
If not deleted, some of the pods may be scraped multiple times when using the Prometheus operator for metamonitoring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for non zone-aware store-gateways to terminate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;migrate-ingesters-to-zone-aware-replication&#34;&gt;Migrate ingesters to zone-aware replication&lt;/h2&gt;
&lt;h3 id=&#34;configure-zone-aware-replication-for-ingesters&#34;&gt;Configure zone-aware replication for ingesters&lt;/h3&gt;
&lt;p&gt;This section is about planning and configuring the availability zones defined under the &lt;code&gt;ingester.zoneAwareReplication&lt;/code&gt; Helm value.&lt;/p&gt;
&lt;p&gt;There are two use cases in general:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Speeding up rollout of ingesters in case there are more than 3 replicas. In this case use the default value in the &lt;code&gt;small.yaml&lt;/code&gt;, &lt;code&gt;large.yaml&lt;/code&gt;, &lt;code&gt;capped-small.yaml&lt;/code&gt; or &lt;code&gt;capped-large.yaml&lt;/code&gt;. The default value defines 3 &amp;ldquo;virtual&amp;rdquo; zones and sets affinity rules so that ingesters from different zones do not mix, but it allows multiple ingesters of the same zone on the same node:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: false # Do not turn on zone-awareness without migration because of potential data loss
    topologyKey: &amp;#34;kubernetes.io/hostname&amp;#34; # Triggers creating anti-affinity rules&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Geographical redundancy. In this case you need to set a suitable &lt;a href=&#34;https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;nodeSelector&lt;/a&gt; value to choose where the pods of each zone are to be placed. Setting &lt;code&gt;topologyKey&lt;/code&gt; will instruct the Helm chart to create anti-affinity rules so that ingesters from different zones do not mix, but it allows multiple ingesters of the same zone on the same node. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: false # Do not turn on zone-awareness without migration because of potential data loss
    topologyKey: &amp;#34;kubernetes.io/hostname&amp;#34; # Triggers creating anti-affinity rules
    zones:
      - name: zone-a
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-a
      - name: zone-b
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-b
      - name: zone-c
        nodeSelector:
          topology.kubernetes.io/zone: us-central1-c&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: as &lt;code&gt;zones&lt;/code&gt; value is an array, you must copy and modify it to make changes to it, there is no way to overwrite just parts of the array!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Set the chosen configuration in your custom values (e.g. &lt;code&gt;custom.yaml&lt;/code&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The number of ingester pods that will be started is derived from &lt;code&gt;ingester.replicas&lt;/code&gt;. Each zone will start &lt;code&gt;ingester.replicas / number of zones&lt;/code&gt; pods, rounded up to the nearest integer value. For example if you have 3 zones, then &lt;code&gt;ingester.replicas=3&lt;/code&gt; will yield 1 ingester per zone, but &lt;code&gt;ingester.replicas=4&lt;/code&gt; will yield 2 per zone, 6 in total.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;decide-which-migration-path-to-take-for-ingesters&#34;&gt;Decide which migration path to take for ingesters&lt;/h3&gt;
&lt;p&gt;There are two ways to do the migration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;With downtime. In this &lt;a href=&#34;#migrate-ingesters-with-downtime&#34;&gt;procedure&lt;/a&gt; ingress is stopped to the cluster while ingesters are migrated. This is the quicker and simpler way. The time it takes to execute this migration depends on how fast ingesters restart and upload their data to object storage, but in general should be finished in an hour.&lt;/li&gt;
&lt;li&gt;Without downtime. This is a multi step &lt;a href=&#34;#migrate-ingesters-without-downtime&#34;&gt;procedure&lt;/a&gt; which requires additional hardware resources as the old and new ingesters run in parallel for some time. This is a complex migration that can take days and requires monitoring for increased resource utilization. The minimum time it takes to do this migration can be calculated as (&lt;code&gt;querier.query_store_after&lt;/code&gt;) &#43; (2h TSDB blocks range period &#43; &lt;code&gt;blocks_storage.tsdb.head_compaction_idle_timeout&lt;/code&gt;) * (1 &#43; number_of_ingesters / 21). With the default values this means 12h &#43; 3h * (1 &#43; number of ingesters / 21) = 15h &#43; 3h * (number_of_ingesters / 21). Add an extra 12 hours if shuffle sharding is enabled.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;migrate-ingesters-with-downtime&#34;&gt;Migrate ingesters with downtime&lt;/h3&gt;
&lt;p&gt;Before starting this procedure, set up your zones according to &lt;a href=&#34;#configure-zone-aware-replication-for-ingesters&#34;&gt;Configure zone-aware replication for ingesters&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a new empty YAML file called &lt;code&gt;migrate.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable flushing data from ingesters to storage on shutdown.&lt;/p&gt;
&lt;p&gt;Copy the following into the &lt;code&gt;migrate.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    blocks_storage:
      tsdb:
        flush_blocks_on_shutdown: true
    ingester:
      ring:
        unregister_on_shutdown: true

ingester:
  zoneAwareReplication:
    enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for all ingesters to restart and be ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn off traffic to the installation.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    blocks_storage:
      tsdb:
        flush_blocks_on_shutdown: true
    ingester:
      ring:
        unregister_on_shutdown: true

ingester:
  zoneAwareReplication:
    enabled: false

nginx:
  replicas: 0
gateway:
  replicas: 0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until there is no nginx or gateway running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scale the current ingesters to 0.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    blocks_storage:
      tsdb:
        flush_blocks_on_shutdown: true
    ingester:
      ring:
        unregister_on_shutdown: true

ingester:
  replicas: 0
  zoneAwareReplication:
    enabled: false

nginx:
  replicas: 0
gateway:
  replicas: 0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until no ingesters are running.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the new zone-aware ingesters.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true

nginx:
  replicas: 0
gateway:
  replicas: 0

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all requested ingesters are running and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable traffic to the installation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merge&lt;/strong&gt; the following values into your custom Helm values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These values are actually the default, which means that removing the values &lt;code&gt;ingester.zoneAwareReplication.enabled&lt;/code&gt; and &lt;code&gt;rollout_operator.enabled&lt;/code&gt; is also a valid step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the Service and StatefulSet resources of the non zone-aware ingesters have been deleted.
The previous step also removes the Service and StatefulSet manifests of the old non zone-aware ingesters.
In some cases, such as when using Helm from Tanka, these resources will not be automatically deleted from your Kubernetes cluster
even if the Helm chart no longer renders them. If the old resources still exist, delete them manually.
If not deleted, some of the pods may be scraped multiple times when using the Prometheus operator for metamonitoring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;migrate-ingesters-without-downtime&#34;&gt;Migrate ingesters without downtime&lt;/h3&gt;
&lt;p&gt;Before starting this procedure, set up your zones according to &lt;a href=&#34;#configure-zone-aware-replication-for-ingesters&#34;&gt;Configure zone-aware replication for ingesters&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Double the series limits for tenants and the ingesters.&lt;/p&gt;
&lt;p&gt;Explanation: while new ingesters are being added, some series will start to be written to new ingesters, however the series will also exist on old ingesters, thus the series will count twice towards limits. Not updating the limits might lead to writes to be refused due to limits violation.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;limits.max_global_series_per_user&lt;/code&gt; Mimir configuration parameter has a non-zero default value of 150000. Double the default or your value by setting:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    limits:
      max_global_series_per_user: 300000 # &amp;lt;-- or your value doubled&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you have set the Mimir configuration parameter &lt;code&gt;ingester.instance_limits.max_series&lt;/code&gt; via &lt;code&gt;mimir.config&lt;/code&gt; or &lt;code&gt;mimir.structuredConfig&lt;/code&gt; or via runtime overrides, double it for the duration of the migration.&lt;/p&gt;
&lt;p&gt;If you have set per tenant limits in the Mimir configuration parameters &lt;code&gt;limits.max_global_series_per_user&lt;/code&gt;, &lt;code&gt;limits.max_global_series_per_metric&lt;/code&gt; via &lt;code&gt;mimir.config&lt;/code&gt; or &lt;code&gt;mimir.structuredConfig&lt;/code&gt; or via runtime overrides, double the set limits. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;runtimeConfig:
  ingester_limits:
    max_series: X # &amp;lt;-- double it
  overrides:
    tenantA:
      max_global_series_per_metric: Y # &amp;lt;-- double it
      max_global_series_per_user: Z # &amp;lt;-- double it&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new empty YAML file called &lt;code&gt;migrate.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the migration.&lt;/p&gt;
&lt;p&gt;Copy the following into the &lt;code&gt;migrate.yaml&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      replicas: 0

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;p&gt;In this step new zone-aware StatefulSets are created - but no new pods are started yet. The parameter &lt;code&gt;ingester.ring.zone_awareness_enabled: true&lt;/code&gt; is set in the Mimir configuration via the &lt;code&gt;mimir.config&lt;/code&gt; value. The flag &lt;code&gt;-ingester.ring.zone-awareness-enabled=false&lt;/code&gt; is set on distributors, rulers and queriers. The flags &lt;code&gt;-blocks-storage.tsdb.flush-blocks-on-shutdown&lt;/code&gt; and &lt;code&gt;-ingester.ring.unregister-on-shutdown&lt;/code&gt; are set to true for the ingesters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait for all Mimir components to restart and be ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add zone-aware ingester replicas, maximum 21 at a time.&lt;/p&gt;
&lt;p&gt;Explanation: while new ingesters are being added, some series will start to be written to new ingesters, however the series will also exist on old ingesters, thus the series will count twice towards limits. Adding only 21 replicas at a time reduces the number of series affected and thus the likelihood of breaching maximum series limits.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      replicas: &amp;lt;N&amp;gt;

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: replace &lt;code&gt;&amp;lt;N&amp;gt;&lt;/code&gt; with the number of replicas in each step until &lt;code&gt;&amp;lt;N&amp;gt;&lt;/code&gt; reaches the same number as in &lt;code&gt;ingester.replicas&lt;/code&gt;, do not increase &lt;code&gt;&amp;lt;N&amp;gt;&lt;/code&gt; with more than 21 in each step.&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the new ingesters are started and are ready, wait at least 3 hours.&lt;/p&gt;
&lt;p&gt;The 3 hours is calculated from 2h TSDB block range period &#43; &lt;code&gt;blocks_storage.tsdb.head_compaction_idle_timeout&lt;/code&gt; Grafana Mimir parameters to give enough time for ingesters to remove stale series from memory. Stale series will be there due to series being moved between ingesters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the current &lt;code&gt;&amp;lt;N&amp;gt;&lt;/code&gt; above in &lt;code&gt;ingester.zoneAwareReplication.migration.replicas&lt;/code&gt; is less than &lt;code&gt;ingester.replicas&lt;/code&gt;, go back and increase &lt;code&gt;&amp;lt;N&amp;gt;&lt;/code&gt; with at most 21 and repeat these four steps.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are using 
    &lt;a href=&#34;/docs/mimir/v3.1.x/configure/configure-shuffle-sharding/&#34;&gt;shuffle sharding&lt;/a&gt;, it must be turned off on the read path at this point.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Update your configuration with these values and keep them until otherwise instructed.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;querier:
  extraArgs:
    &amp;#34;querier.shuffle-sharding-ingesters-enabled&amp;#34;: &amp;#34;false&amp;#34;
ruler:
  extraArgs:
    &amp;#34;querier.shuffle-sharding-ingesters-enabled&amp;#34;: &amp;#34;false&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until queriers and rulers have restarted and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monitor resource utilization of queriers and rulers and scale up if necessary. Turning off shuffle sharding may increase resource utilization.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable zone-awareness on the write path.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      writePath: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;p&gt;In this step the flag &lt;code&gt;-ingester.ring.zone-awareness-enabled=false&lt;/code&gt; is removed from distributors and rulers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once all distributors and rulers have restarted and are ready, wait 12 hours.&lt;/p&gt;
&lt;p&gt;The 12 hours is calculated from the &lt;code&gt;querier.query_store_after&lt;/code&gt; Grafana Mimir parameter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable zone-awareness on the read path.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      writePath: true
      readPath: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;p&gt;In this step the flag &lt;code&gt;-ingester.ring.zone-awareness-enabled=false&lt;/code&gt; is removed from queriers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all queriers have restarted and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exclude non zone-aware ingesters from the write path.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      writePath: true
      readPath: true
      excludeDefaultZone: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;p&gt;In this step the flag &lt;code&gt;-ingester.ring.excluded-zones=zone-default&lt;/code&gt; is added to distributors and rulers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all distributors and rulers have restarted and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scale down non zone-aware ingesters to 0.&lt;/p&gt;
&lt;p&gt;Replace the contents of the &lt;code&gt;migrate.yaml&lt;/code&gt; file with:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true
    migration:
      enabled: true
      writePath: true
      readPath: true
      excludeDefaultZone: true
      scaleDownDefaultZone: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command and make sure to provide the flag &lt;code&gt;-f migrate.yaml&lt;/code&gt; as the last flag.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until all non zone-aware ingesters are terminated.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delete the default zone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merge&lt;/strong&gt; the following values into your custom Helm values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;ingester:
  zoneAwareReplication:
    enabled: true

rollout_operator:
  enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These values are actually the default, which means that removing the values &lt;code&gt;ingester.zoneAwareReplication.enabled&lt;/code&gt; and &lt;code&gt;rollout_operator.enabled&lt;/code&gt; from your &lt;code&gt;custom.yaml&lt;/code&gt; is also a valid step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ensure that the Service and StatefulSet resources of the non zone-aware ingesters have been deleted.
The previous step also removes the Service and StatefulSet manifests of the old non zone-aware ingesters.
In some cases, such as when using Helm from Tanka, these resources will not be automatically deleted from your Kubernetes cluster
even if the Helm chart no longer renders them. If the old resources still exist, delete them manually.
If not deleted, some of the pods may be scraped multiple times when using the Prometheus operator for metamonitoring.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait at least 3 hours.&lt;/p&gt;
&lt;p&gt;The 3 hours is calculated from 2h TSDB block range period &#43; &lt;code&gt;blocks_storage.tsdb.head_compaction_idle_timeout&lt;/code&gt; Grafana Mimir parameters to give enough time for ingesters to remove stale series from memory. Stale series will be there due to series being moved between ingesters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are using 
    &lt;a href=&#34;/docs/mimir/v3.1.x/configure/configure-shuffle-sharding/&#34;&gt;shuffle sharding&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Wait an extra 12 hours.&lt;/p&gt;
&lt;p&gt;The 12 hours is calculated from the &lt;code&gt;querier.query_store_after&lt;/code&gt; Grafana Mimir parameter. After this time, no series are stored outside their dedicated shard, meaning that shuffle sharding on the read path can be safely enabled.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove these values from your configuration:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;querier:
  extraArgs:
    &amp;#34;querier.shuffle-sharding-ingesters-enabled&amp;#34;: &amp;#34;false&amp;#34;
ruler:
  extraArgs:
    &amp;#34;querier.shuffle-sharding-ingesters-enabled&amp;#34;: &amp;#34;false&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait until queriers and rulers have restarted and are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The resource utilization of queriers and rulers should return to pre-migration levels and you can scale them down to previous numbers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Undo the doubling of series limits done in the first step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Upgrade the installation with the &lt;code&gt;helm&lt;/code&gt; command using your regular command line flags.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="migrate-from-single-zone-to-zone-aware-replication-in-mimir-helm-chart-version-40">Migrate from single zone to zone-aware replication in Mimir Helm chart version 4.0&lt;/h1>
&lt;p>The &lt;code>mimir-distributed&lt;/code> Helm chart version 4.0 enables zone-aware replication by default. This is a breaking change for existing installations and requires a migration.&lt;/p></description></item><item><title>Migrate to Kubernetes version 1.25</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-to-kubernetes-version-1.25/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-to-kubernetes-version-1.25/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-to-kubernetes-version-125&#34;&gt;Migrate to Kubernetes version 1.25&lt;/h1&gt;
&lt;p&gt;This procedure describes how to prepare a &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart release for an upgrade to Kubernetes 1.25.&lt;/p&gt;
&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;Kubernetes version 1.25 removes the support for the deprecated &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-policy/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PodSecurityPolicy&lt;/a&gt; object. You can learn more about this topic by visiting &lt;a href=&#34;https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PodSecurityPolicy Deprecation: Past, Present, and Future&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Due to how Helm &lt;a href=&#34;https://helm.sh/docs/topics/kubernetes_apis/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;works&lt;/a&gt;, PodSecurityPolicy objects must already be removed from the release prior to upgrading to Kubernetes version 1.25. If you are using PodSecurityPolicy on Kubernetes 1.24, this is a breaking change. &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart versions before 5.0 used PodSecurityPolicy by default in Kubernetes version 1.24.&lt;/p&gt;
&lt;h2 id=&#34;prerequisite&#34;&gt;Prerequisite&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You have Kubernetes version 1.22, 1.23 or 1.24.&lt;/li&gt;
&lt;li&gt;This procedure is only applicable if &lt;code&gt;rbac.create&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;rbac.type&lt;/code&gt; is &lt;code&gt;psp&lt;/code&gt; in your current Helm values. This was the case by default before Helm chart version 5.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;procedure&#34;&gt;Procedure&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;rbac.create&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt; or &lt;code&gt;rbac.type&lt;/code&gt; is &lt;code&gt;scc&lt;/code&gt;, then there is nothing to do, skip the whole procedure.&lt;/li&gt;
&lt;li&gt;Optionally follow the Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/migrate-from-psp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller&lt;/a&gt; guide to replace PodSecurityPolicy.&lt;/li&gt;
&lt;li&gt;Set the &lt;code&gt;rbac.create&lt;/code&gt; value to &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Upgrade the deployment. The chart will not install PodSecurityPolicy objects anymore.&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Grafana Mimir does not require any special permissions on the hosts that it
runs on. Because of this, you can deploy it in environments that enforce the
Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-standards/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Restricted security policy&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;troubleshoot&#34;&gt;Troubleshoot&lt;/h2&gt;
&lt;p&gt;If you have upgraded to Kubernetes 1.25 and see the following error containing PodSecurityPolicy during a Helm release upgrade:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;resource mapping not found for name: &amp;#34;mimir&amp;#34; namespace: &amp;#34;&amp;#34; from &amp;#34;&amp;#34;:
no matches for kind &amp;#34;PodSecurityPolicy&amp;#34; in version &amp;#34;policy/v1beta1&amp;#34; ensure CRDs are installed first&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This happens because Helm stores the current release in a Secret in the namespace. If the current release contains removed resources the &lt;code&gt;helm&lt;/code&gt; command fails to determine the current state of the release.&lt;/p&gt;
&lt;p&gt;To remove the PodSecurityPolicy from the Helm release history follow this procedure:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Optionally follow the Kubernetes &lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/migrate-from-psp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller&lt;/a&gt; guide to replace PodSecurityPolicy.&lt;/li&gt;
&lt;li&gt;Set the &lt;code&gt;rbac.create&lt;/code&gt; value to &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Remove PodSecurityPolicy from the Helm release history following the &lt;a href=&#34;https://helm.sh/docs/topics/kubernetes_apis/#updating-api-versions-of-a-release-manifest&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Updating API Versions of a Release Manifest&lt;/a&gt; Helm documentation in order to proceed with the upgrade.&lt;/li&gt;
&lt;li&gt;Upgrade the release. The upgrade should succeed now.&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="migrate-to-kubernetes-version-125">Migrate to Kubernetes version 1.25&lt;/h1>
&lt;p>This procedure describes how to prepare a &lt;code>mimir-distributed&lt;/code> Helm chart release for an upgrade to Kubernetes 1.25.&lt;/p>
&lt;h2 id="background">Background&lt;/h2>
&lt;p>Kubernetes version 1.25 removes the support for the deprecated &lt;a href="https://kubernetes.io/docs/concepts/security/pod-security-policy/" target="_blank" rel="noopener noreferrer">PodSecurityPolicy&lt;/a> object. You can learn more about this topic by visiting &lt;a href="https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/" target="_blank" rel="noopener noreferrer">PodSecurityPolicy Deprecation: Past, Present, and Future&lt;/a>.&lt;/p></description></item><item><title>Migrate the Mimir Helm chart from version 2.x to 3.0</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-helm-chart-2.x-to-3.0/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-helm-chart-2.x-to-3.0/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-the-mimir-helm-chart-from-version-2x-to-30&#34;&gt;Migrate the Mimir Helm chart from version 2.x to 3.0&lt;/h1&gt;
&lt;p&gt;There are breaking changes between the Grafana Mimir Helm chart versions 2.x and 3.0.
Several parameters that were available in versions 2.x of the mimir-distributed Helm chart have changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To migrate from Helm chart 2.x to 3.0:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Understand the improvements that we made to the Mimir configuration in the Helm chart:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Mimir configuration is now stored in a Kubernetes ConfigMap by default, instead of a Kubernetes Secret.&lt;/li&gt;
&lt;li&gt;You can override individual properties without copying the entire &lt;code&gt;mimir.config&lt;/code&gt; block. Specify properties you want to override under the &lt;code&gt;mimir.structuredConfig&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You can move secrets outside the Mimir configuration via external secrets and environment variables. Environment variables can be used to externalize secrets from the configuration file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decide whether or not you need to update the Mimir configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you are using external configuration (&lt;code&gt;useExternalConfig: true&lt;/code&gt;), then you must set &lt;code&gt;configStorageType: Secret&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is now possible to use a ConfigMap to manage your external configuration instead.
If your external configuration contains secrets, then you can externalize them and use a ConfigMap. See &lt;em&gt;Externalize secrets&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are not using external configuration (&lt;code&gt;useExternalConfig: false&lt;/code&gt;), and your Mimir configuration contains secrets, chose one of two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep the previous location as-is by setting &lt;code&gt;configStorageType: Secret&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Externalize secrets:
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Move secrets from the Mimir configuration to a &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/secret/#working-with-secrets&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Kubernetes Secret&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mount the Kubernetes Secret via &lt;code&gt;global.extraEnvFrom&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;global:
  extraEnvFrom:
    - secretRef:
        name: mysecret&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For more information, see &lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/secret/#use-case-as-container-environment-variables&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Secrets - Use case: As container environment variables&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace the values in the Mimir configuration with environment variables.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    blocks_storage:
      s3:
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are not using an external configuration (&lt;code&gt;useExternalConfig: false&lt;/code&gt;), and your Mimir configuration does not contain secrets, then the storage location is automatically changed by Helm and you do not need to do anything.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See &lt;a href=&#34;#example-of-migrated-values&#34;&gt;Example migrated values file&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update your memcached configuration via your customized Helm chart values, if needed:&lt;/p&gt;
&lt;p&gt;The mimir-distributed Helm chart supports multiple cache types.
If you have not enabled any memcached caches,
and you are not overriding the values of &lt;code&gt;memcached&lt;/code&gt;,
&lt;code&gt;memcached-queries&lt;/code&gt;,
&lt;code&gt;memcached-metadata&lt;/code&gt;,
or &lt;code&gt;memcached-results&lt;/code&gt; sections,
then you do not need to update the memcached configuration.&lt;/p&gt;
&lt;p&gt;Otherwise, check to see if you need to change any of the following configuration parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;memcached&lt;/code&gt; section was repurposed, and &lt;code&gt;chunks-cache&lt;/code&gt; was added.&lt;/li&gt;
&lt;li&gt;The contents of the &lt;code&gt;memcached&lt;/code&gt; section now contain the following common values that are shared across all memcached instances: &lt;code&gt;image&lt;/code&gt;, &lt;code&gt;podSecurityContext&lt;/code&gt;, and &lt;code&gt;containerSecurityContext&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The following sections were renamed:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;memcached-queries&lt;/code&gt; is now &lt;code&gt;index-cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memcached-metadata&lt;/code&gt; is now &lt;code&gt;metadata-cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memcached-results&lt;/code&gt; is now &lt;code&gt;results-cache&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;memcached*.replicaCount&lt;/code&gt; values were renamed:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;memcached.replicaCount&lt;/code&gt; is now &lt;code&gt;chunks-cache.replicas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memcached-queries.replicaCount&lt;/code&gt; is now &lt;code&gt;index-cache.replicas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memcached-metadata.replicaCount&lt;/code&gt; is now &lt;code&gt;metadata-cache.replicas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memcached-results.replicaCount&lt;/code&gt; is now &lt;code&gt;results-cache.replicas&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;memcached*.architecture&lt;/code&gt; values were removed.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;memcached*.arguments&lt;/code&gt; values were removed.&lt;/li&gt;
&lt;li&gt;The default arguments are now encoded in the Helm chart templates; the values &lt;code&gt;*-cache.allocatedMemory&lt;/code&gt;, &lt;code&gt;*-cache.maxItemMemory&lt;/code&gt; and &lt;code&gt;*-cache.port&lt;/code&gt; control the arguments &lt;code&gt;-m&lt;/code&gt;, &lt;code&gt;-I&lt;/code&gt; and &lt;code&gt;-u&lt;/code&gt;. To provide additional arguments, use &lt;code&gt;*-cache.extraArgs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;memcached*.metrics&lt;/code&gt; values were consolidated under &lt;code&gt;memcachedExporter&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See also an &lt;a href=&#34;#example-of-migration-of-customized-memcached-values-between-versions-2x-and-30&#34;&gt;example of migration of customized memcached values between versions 2.x and 3.0&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update your memcached-related Mimir configuration
via your customized Helm chart value that is named &lt;code&gt;mimir.config&lt;/code&gt;, if needed:&lt;/p&gt;
&lt;p&gt;The configuration parameters for memcached &lt;code&gt;addresses&lt;/code&gt; and &lt;code&gt;max_item_size&lt;/code&gt; have changed in the default &lt;code&gt;mimir.config&lt;/code&gt; value.
If you previously copied the value of &lt;code&gt;mimir.config&lt;/code&gt; into your values file, then take the latest version of the &lt;code&gt;memcached&lt;/code&gt; configuration in the &lt;code&gt;mimir.config&lt;/code&gt; from the &lt;code&gt;values.yaml&lt;/code&gt; file in the Helm chart.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(Conditional) If you have enabled &lt;code&gt;serviceMonitor&lt;/code&gt;, or you are overriding the value of anything under the &lt;code&gt;serviceMonitor&lt;/code&gt; section, or both, then move the &lt;code&gt;serviceMonitor&lt;/code&gt; section under &lt;code&gt;metaMonitoring&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the &lt;code&gt;rbac&lt;/code&gt; section, based on the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you are not overriding the value of anything under the &lt;code&gt;rbac&lt;/code&gt; section, then skip this step.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;rbac.pspEnabled&lt;/code&gt; value was removed.&lt;/li&gt;
&lt;li&gt;To continue using Pod Security Policy (PSP), set &lt;code&gt;rbac.create&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;rbac.type&lt;/code&gt; to &lt;code&gt;psp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;To start using Security Context Constraints (SCC) instead of PSP, set &lt;code&gt;rbac.create&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;rbac.type&lt;/code&gt; to &lt;code&gt;scc&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update the &lt;code&gt;mimir.config&lt;/code&gt; value, based on the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compare your overridden value of &lt;code&gt;mimir.config&lt;/code&gt; with the one in the &lt;code&gt;values.yaml&lt;/code&gt; file in the chart. If you are not overriding the value of &lt;code&gt;mimir.config&lt;/code&gt;, then skip this step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Decide whether or not to update the &lt;code&gt;nginx&lt;/code&gt; configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unless you have overridden the value of &lt;code&gt;nginx.nginxConfig.file&lt;/code&gt;,
and you are using the default &lt;code&gt;mimir.config&lt;/code&gt;, then skip this step.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otherwise, compare the overridden &lt;code&gt;nginx.nginxConfig.file&lt;/code&gt; value
to the one in the &lt;code&gt;values.yaml&lt;/code&gt; file in the Helm chart,
and incorporate the differences.
Pay attention to the sections that contain &lt;code&gt;x_scope_orgid&lt;/code&gt;.
The value in the &lt;code&gt;values.yaml&lt;/code&gt; file contains Nginx configuration
that adds the &lt;code&gt;X-Scope-OrgId&lt;/code&gt; header to incoming requests that do not already set it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This change allows Mimir clients to keep sending requests without needing to specify a tenant ID, even though multi-tenancy is now enabled by default.&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;example-of-migrated-values&#34;&gt;Example of migrated values&lt;/h2&gt;
&lt;p&gt;The example values file is compatible with any 2.x version of the mimir-distributed Helm chart, and demonstrates a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All memcached caches are enabled.&lt;/li&gt;
&lt;li&gt;The default pod security policy is disabled.&lt;/li&gt;
&lt;li&gt;ServiceMonitors are enabled.&lt;/li&gt;
&lt;li&gt;Object storage credentials for block storage are specified directly in the &lt;code&gt;mimir.config&lt;/code&gt; value.


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The unmodified parts of the default &lt;code&gt;mimir.config&lt;/code&gt; are omitted for brevity, even though in a valid 2.x values file they need to be included.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;rbac:
  pspEnabled: false

memcached:
  enabled: true
  replicaCount: 1

memcached-queries:
  enabled: true
  replicaCount: 1

memcached-metadata:
  enabled: true
  replicaCount: 1

memcached-results:
  enabled: true
  replicaCount: 1

serviceMonitor:
  enabled: true

mimir:
  config: |-
    #######
    # default contents omitted for brevity
    #######

    blocks_storage:
      backend: s3
      s3:
        endpoint: s3.amazonaws.com
        bucket_name: my-blocks-bucket
        access_key_id: FAKEACCESSKEY
        secret_access_key: FAKESECRETKEY

    #######
    # default contents omitted for brevity
    #######&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After applying the migration steps listed in this guide,
you now have a Kubernetes Secret that contains
the S3 credentials, and a values file for version 3.0.
The values file is does not have any omissions.
The parts that were omitted in the 2.x version are automatically included by the Helm chart in version 3.0.&lt;/p&gt;
&lt;p&gt;Kubernetes Secret:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Secret
metadata:
  name: mimir-bucket-secret
data:
  AWS_ACCESS_KEY_ID: FAKEACCESSKEY
  AWS_SECRET_ACCESS_KEY: FAKESECRETKEY&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;rbac:
  create: false

chunks-cache:
  enabled: true
  replicas: 1

index-cache:
  enabled: true
  replicas: 1

metadata-cache:
  enabled: true
  replicas: 1

results-cache:
  enabled: true
  replicas: 1

metaMonitoring:
  serviceMonitor:
    enabled: true

mimir:
  structuredConfig:
    blocks_storage:
      backend: s3
      s3:
        access_key_id: ${AWS_ACCESS_KEY_ID}
        bucket_name: my-blocks-bucket
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}

global:
  extraEnvFrom:
    - secretRef:
        name: mimir-bucket-secret&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;example-of-migration-of-customized-memcached-values-between-versions-2x-and-30&#34;&gt;Example of migration of customized memcached values between versions 2.x and 3.0&lt;/h2&gt;
&lt;p&gt;Version 2.1:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;memcached:
  replicaCount: 12
  arguments:
    - -m 2048
    - -I 128m
    - -u 12345
  image:
    repository: memcached
    tag: 1.6.9-alpine

memcached-queries:
  replicaCount: 3
  architecture: modern
  image:
    repository: memcached
    tag: 1.6.9-alpine&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Version 3.0:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;memcached:
  image:
    repository: memcached
    tag: 1.6.9-alpine

chunks-cache:
  allocatedMemory: 2048
  maxItemMemory: 128
  port: 12345
  replicas: 12

index-cache:
  replicas: 3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
]]></content><description>&lt;h1 id="migrate-the-mimir-helm-chart-from-version-2x-to-30">Migrate the Mimir Helm chart from version 2.x to 3.0&lt;/h1>
&lt;p>There are breaking changes between the Grafana Mimir Helm chart versions 2.x and 3.0.
Several parameters that were available in versions 2.x of the mimir-distributed Helm chart have changed.&lt;/p></description></item><item><title>Configure a unique Grafana Mimir's Memberlist cluster label in the mimir-distributed Helm chart installation</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-enable-cluster-label-verification/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-enable-cluster-label-verification/</guid><content><![CDATA[&lt;h1 id=&#34;configure-a-unique-grafana-mimirs-memberlist-cluster-label-in-the-mimir-distributed-helm-chart-installation&#34;&gt;Configure a unique Grafana Mimir&amp;rsquo;s Memberlist cluster label in the mimir-distributed Helm chart installation&lt;/h1&gt;
&lt;p&gt;This document shows the steps to configure cluster label verification in a Grafana Mimir installed by Helm.
Multiple 
    &lt;a href=&#34;/docs/mimir/v3.1.x/references/architecture/memberlist-and-the-gossip-protocol/&#34;&gt;Memberlist&lt;/a&gt; 
    &lt;a href=&#34;/docs/mimir/v3.1.x/references/architecture/hash-ring/&#34;&gt;gossip ring&lt;/a&gt; clusters are at risk of merging into one without enabling cluster label verification.
For example, if a Mimir, Tempo or Loki are running in the same Kubernetes cluster, they might communicate with each other without this configuration update.
Once cluster label verification is enabled, before Mimir components communicate with other components, they will verify whether the other components have the same cluster label.
The process to update the configuration will take three rollouts of the whole cluster.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You have a Grafana Mimir installed by mimir-distributed helm chart with its Memberlist cluster label still set to default value.&lt;/li&gt;
&lt;li&gt;You have &lt;code&gt;kubectl&lt;/code&gt; and &lt;code&gt;helm&lt;/code&gt; command line configured to connect to the Kubernetes cluster where your Grafana Mimir is running.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-update-steps&#34;&gt;Configuration update steps&lt;/h2&gt;
&lt;p&gt;There are three steps of the configuration update:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Disable Memberlist cluster label verification&lt;/li&gt;
&lt;li&gt;Set cluster label on all Mimir components&lt;/li&gt;
&lt;li&gt;Enable Memberlist cluster label verification again&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;1-disable-memberlist-cluster-label-verification&#34;&gt;1. Disable Memberlist cluster label verification&lt;/h3&gt;
&lt;p&gt;Cluster label verification flag is enabled by default with cluster label set to an empty string.
Using the default value of cluster label can make different systems that use Memberlist communicate with each other if they also have not updated the default cluster label.
Setting a new cluster label directly to a non-empty string value without first disabling cluster label verification will cause Memberlist to form partition in the Grafana Mimir cluster.
The partition makes some Mimir components have different cluster label values which can prevent the component from communicating.
To disable cluster label verification flag, set the following structured config in mimir-distributed values.yaml configuration.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    memberlist:
      cluster_label_verification_disabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Rollout the installation to apply the configuration changes by running &lt;code&gt;helm upgrade &amp;lt;my-mimir-release&amp;gt; mimir-distributed -f values.yaml&lt;/code&gt;.
Replace &lt;code&gt;&amp;lt;my-mimir-release&amp;gt;&lt;/code&gt; with the actual Mimir release name. Wait until all Pods are ready before going to the next step.&lt;/p&gt;
&lt;h3 id=&#34;2-set-cluster-label-on-all-mimir-components&#34;&gt;2. Set cluster label on all Mimir components&lt;/h3&gt;
&lt;p&gt;Set cluster label on all Mimir components by setting the following configuration.
The configuration will set &lt;code&gt;cluster_label&lt;/code&gt; to the Helm release name and the namespace where the helm release is installed.
Updating a new cluster label after disabling cluster label verification will prevent Memberlist from forming a partition.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    memberlist:
      cluster_label_verification_disabled: true
      cluster_label: &amp;#34;{{.Release.Name}}-{{.Release.Namespace}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Apply the configuration changes again by running &lt;code&gt;helm upgrade &amp;lt;my-mimir-release&amp;gt; mimir-distributed -f values.yaml&lt;/code&gt;.
Replace &lt;code&gt;&amp;lt;my-mimir-release&amp;gt;&lt;/code&gt; with the actual Mimir release name. Wait until all Pods are ready before going to the next step.&lt;/p&gt;
&lt;h3 id=&#34;3-enable-memberlist-cluster-label-verification&#34;&gt;3. Enable Memberlist cluster label verification&lt;/h3&gt;
&lt;p&gt;Remove &lt;code&gt;mimir.structuredConfig.memberlist.cluster_label_verification_disabled&lt;/code&gt; from the values.yaml file to re-enable Memberlist cluster label verification.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    memberlist:
      cluster_label: &amp;#34;{{.Release.Name}}-{{.Release.Namespace}}&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Apply the configuration changes by running &lt;code&gt;helm upgrade &amp;lt;my-mimir-release&amp;gt; mimir-distributed -f values.yaml&lt;/code&gt;.
Replace &lt;code&gt;&amp;lt;my-mimir-release&amp;gt;&lt;/code&gt; with the actual Mimir release name. Wait until all Pods are ready before verifying that the configuration is applied correctly.&lt;/p&gt;
&lt;h2 id=&#34;verifying-the-configuration-changes&#34;&gt;Verifying the configuration changes&lt;/h2&gt;
&lt;p&gt;Once the rollout is completed, verify the change by looking at the &lt;code&gt;/memberlist&lt;/code&gt; endpoint in some of Grafana Mimir pods.
Run the following port-forward command on several different Grafana Mimir components.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;   kubectl port-forward pod/&amp;lt;mimir-pod-1&amp;gt; --kube-context=&amp;lt;my-k8s-context&amp;gt; --namespace=&amp;lt;my-mimir-namespace&amp;gt; 8080:8080
   kubectl port-forward pod/&amp;lt;mimir-pod-2&amp;gt; --kube-context=&amp;lt;my-k8s-context&amp;gt; --namespace=&amp;lt;my-mimir-namespace&amp;gt; 8081:8080&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;&amp;lt;mimir-pod-1&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;mimir-pod-2&amp;gt;&lt;/code&gt; with several actual pods from different Mimir components.
Ensure the host port 8080 and 8081 are available, otherwise use different available ports.&lt;/p&gt;
&lt;p&gt;Open the port-forwarded URL in browser to see the Memberlist status http://localhost:8080/memberlist, http://localhost:8081/memberlist and also
few others Grafana Mimir components. The Memberlist page from different pods must show same view of all of their members.&lt;/p&gt;
]]></content><description>&lt;h1 id="configure-a-unique-grafana-mimirs-memberlist-cluster-label-in-the-mimir-distributed-helm-chart-installation">Configure a unique Grafana Mimir&amp;rsquo;s Memberlist cluster label in the mimir-distributed Helm chart installation&lt;/h1>
&lt;p>This document shows the steps to configure cluster label verification in a Grafana Mimir installed by Helm.
Multiple
&lt;a href="/docs/mimir/v3.1.x/references/architecture/memberlist-and-the-gossip-protocol/">Memberlist&lt;/a>
&lt;a href="/docs/mimir/v3.1.x/references/architecture/hash-ring/">gossip ring&lt;/a> clusters are at risk of merging into one without enabling cluster label verification.
For example, if a Mimir, Tempo or Loki are running in the same Kubernetes cluster, they might communicate with each other without this configuration update.
Once cluster label verification is enabled, before Mimir components communicate with other components, they will verify whether the other components have the same cluster label.
The process to update the configuration will take three rollouts of the whole cluster.&lt;/p></description></item><item><title>Migrate the Helm chart from version 4.x to 5.0</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-helm-chart-4.x-to-5.0/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-helm-chart-4.x-to-5.0/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-the-helm-chart-from-version-4x-to-50&#34;&gt;Migrate the Helm chart from version 4.x to 5.0&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart version 5.0 and later does not install &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-policy/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;PodSecurityPolicy&lt;/a&gt; objects on Kubernetes version 1.24 by default to prepare for upgrade to Kubernetes version 1.25.&lt;/p&gt;
&lt;h2 id=&#34;prerequisite&#34;&gt;Prerequisite&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This procedure is only applicable if &lt;code&gt;rbac.create&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;rbac.type&lt;/code&gt; is &lt;code&gt;psp&lt;/code&gt; in your current Helm values. This was the case by default before Helm chart version 5.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;procedure&#34;&gt;Procedure&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;rbac.create&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt; or &lt;code&gt;rbac.type&lt;/code&gt; is &lt;code&gt;scc&lt;/code&gt;, then there is nothing to do, skip the whole procedure.&lt;/li&gt;
&lt;li&gt;Choose between the following options:
&lt;ol&gt;
&lt;li&gt;If you are on Kubernetes version 1.22 or later and already have &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-admission/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Pod Security Admission&lt;/a&gt; set up, you don&amp;rsquo;t need to do anything and can upgrade to Helm chart version 5.0.&lt;/li&gt;
&lt;li&gt;If you are on Kubernetes version 1.22 or later but don&amp;rsquo;t have &lt;a href=&#34;https://kubernetes.io/docs/concepts/security/pod-security-admission/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Pod Security Admission&lt;/a&gt; set up and want to upgrade to Kubernetes version 1.25 after this procedure, then follow the &lt;a href=&#34;../migrate-to-kubernetes-version-1.25/&#34;&gt;Migrate to Kubernetes version 1.25&lt;/a&gt; guide.&lt;/li&gt;
&lt;li&gt;If you are on Kubernetes version 1.24 and want to keep using PodSecurityPolicy, then merge the following setting into your custom values file:

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;rbac:
  forcePSPOnKubernetes124: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Using &lt;code&gt;rbac.forcePSPOnKubernetes124&lt;/code&gt; equal &lt;code&gt;true&lt;/code&gt; value prevents you from upgrading to Kubernetes version 1.25.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

]]></content><description>&lt;h1 id="migrate-the-helm-chart-from-version-4x-to-50">Migrate the Helm chart from version 4.x to 5.0&lt;/h1>
&lt;p>The &lt;code>mimir-distributed&lt;/code> Helm chart version 5.0 and later does not install &lt;a href="https://kubernetes.io/docs/concepts/security/pod-security-policy/" target="_blank" rel="noopener noreferrer">PodSecurityPolicy&lt;/a> objects on Kubernetes version 1.24 by default to prepare for upgrade to Kubernetes version 1.25.&lt;/p></description></item><item><title>Migrate the Helm chart from version 5.x to 6.0</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-helm-chart-5.x-to-6.0/</link><pubDate>Mon, 29 Jun 2026 07:50:30 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/migration-guides/migrate-helm-chart-5.x-to-6.0/</guid><content><![CDATA[&lt;h1 id=&#34;migrate-the-helm-chart-from-version-5x-to-60&#34;&gt;Migrate the Helm chart from version 5.x to 6.0&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart version 6.0 introduces several breaking changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ingest storage and Kafka are enabled by default. The bundled Kafka deployment is for demonstration and testing purposes only and is not suitable for production use.&lt;/li&gt;
&lt;li&gt;Rollout-operator webhooks are enabled by default, which requires installing CRDs before upgrading.&lt;/li&gt;
&lt;li&gt;The top-level &lt;code&gt;nginx&lt;/code&gt; values section is removed. You must migrate to the unified gateway deployment before upgrading to version 6.0.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You are running &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart version 5.x.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re using the rollout-operator, you have cluster permissions to install CRDs.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re using the top-level &lt;code&gt;nginx&lt;/code&gt; values, you have already migrated to the unified gateway deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;procedure&#34;&gt;Procedure&lt;/h2&gt;
&lt;h3 id=&#34;migrate-to-unified-gateway-deployment-if-needed&#34;&gt;Migrate to unified gateway deployment (if needed)&lt;/h3&gt;
&lt;p&gt;If your values file contains a top-level &lt;code&gt;nginx&lt;/code&gt; section, you must migrate to the unified gateway deployment before upgrading to version 6.0.&lt;/p&gt;
&lt;p&gt;Follow the &lt;a href=&#34;/docs/helm-charts/mimir-distributed/v5.8.x/migration-guides/migrate-to-unified-proxy-deployment/&#34;&gt;Migrate to unified proxy deployment&lt;/a&gt; guide to complete this migration.&lt;/p&gt;
&lt;h3 id=&#34;account-for-the-rollout-operator&#34;&gt;Account for the rollout-operator&lt;/h3&gt;
&lt;p&gt;If your deployment uses the rollout-operator, you must ensure that the required CustomResourceDefinitions (CRDs) are installed. If you don&amp;rsquo;t use the rollout-operator, you must explicitly disable it in your values file to avoid unnecessary components and issues with subsequent rollouts.&lt;/p&gt;
&lt;h4 id=&#34;install-crds-if-using-the-rollout-operator&#34;&gt;Install CRDs if using the rollout-operator&lt;/h4&gt;
&lt;p&gt;If you&amp;rsquo;re using the rollout-operator, install the CRDs from the rollout-operator chart:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f https://raw.githubusercontent.com/grafana/helm-charts/main/charts/rollout-operator/crds/replica-templates-custom-resource-definition.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/helm-charts/main/charts/rollout-operator/crds/zone-aware-pod-disruption-budget-custom-resource-definition.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;disable-the-rollout-operator-if-not-in-use&#34;&gt;Disable the rollout-operator if not in use&lt;/h4&gt;
&lt;p&gt;If you don&amp;rsquo;t use the rollout-operator, disable it in your values file to prevent the installation of related webhooks which will interfere with subsequent rollouts:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;rollout_operator:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;choose-your-ingest-storage-strategy&#34;&gt;Choose your ingest storage strategy&lt;/h3&gt;
&lt;p&gt;Choose one of the following options:&lt;/p&gt;
&lt;h4 id=&#34;migrate-to-ingest-storage&#34;&gt;Migrate to ingest storage&lt;/h4&gt;
&lt;p&gt;If you want to migrate your existing installation to use ingest storage, follow the &lt;a href=&#34;/docs/mimir/latest/set-up/migrate/migrate-ingest-storage/&#34;&gt;Migrate from classic to ingest storage architecture&lt;/a&gt; guide.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The Kafka deployment included in the Helm chart is for demonstration and testing purposes only. For production deployments, set up your own Kafka-compatible backend and configure Mimir to connect to it.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;To use your own Kafka cluster:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Set up a production-grade Kafka-compatible backend (such as Apache Kafka, Amazon MSK, or Confluent Cloud).&lt;/li&gt;
&lt;li&gt;Disable the bundled Kafka deployment in your values file:

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;kafka:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Configure Mimir to connect to your Kafka cluster. Refer to the &lt;a href=&#34;/docs/mimir/latest/configure/configure-kafka-backend/&#34;&gt;Configure the Kafka backend&lt;/a&gt; documentation for configuration details.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;continue-using-classic-architecture-disable-ingest-storage&#34;&gt;Continue using classic architecture (disable ingest storage)&lt;/h4&gt;
&lt;p&gt;Classic architecture is supported in Mimir version 3.0. If you want to continue using the classic architecture without ingest storage, add the following to your values file:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;mimir:
  structuredConfig:
    ingest_storage:
      enabled: false
    ingester:
      push_grpc_method_enabled: true
kafka:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After adding these values, upgrade to version 6.0.&lt;/p&gt;
&lt;h3 id=&#34;upgrade-to-version-60&#34;&gt;Upgrade to version 6.0&lt;/h3&gt;
&lt;p&gt;After completing the prerequisites and choosing your ingest storage strategy, upgrade the Helm release:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm upgrade &amp;lt;RELEASE_NAME&amp;gt; grafana/mimir-distributed --version 6.0.2 -f &amp;lt;VALUES_FILE&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;troubleshooting&#34;&gt;Troubleshooting&lt;/h2&gt;
&lt;p&gt;Follow this guidance to recover from common issues with the rollout operator during migration.&lt;/p&gt;
&lt;h3 id=&#34;rollout-operator-misconfiguration&#34;&gt;Rollout operator misconfiguration&lt;/h3&gt;
&lt;p&gt;If you don&amp;rsquo;t install the rollout operator CustomResourceDefinitions (CRDs) and don&amp;rsquo;t disable the rollout operator, your deployment enters an error state.&lt;/p&gt;
&lt;p&gt;If you intend to use the rollout-operator, install the CRDs as described above.&lt;/p&gt;
&lt;p&gt;If you intend to disable the rollout-operator, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Disable the rollout-operator in your values file.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;rollout-operator:
  enabled: false&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Delete the rollout-operator validating and mutating webhook configurations.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl delete validatingwebhookconfiguration no-downscale-&amp;lt;NAMESPACE&amp;gt;
kubectl delete validatingwebhookconfiguration pod-eviction-&amp;lt;NAMESPACE&amp;gt;
kubectl delete mutatingwebhookconfigurations prepare-downscale-&amp;lt;NAMESPACE&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Re-apply the updated configuration&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;helm upgrade &amp;lt;RELEASE_NAME&amp;gt; grafana/mimir-distributed --version 6.0.2 -f &amp;lt;VALUES_FILE&amp;gt; --reset-values&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="migrate-the-helm-chart-from-version-5x-to-60">Migrate the Helm chart from version 5.x to 6.0&lt;/h1>
&lt;p>The &lt;code>mimir-distributed&lt;/code> Helm chart version 6.0 introduces several breaking changes:&lt;/p>
&lt;ul>
&lt;li>Ingest storage and Kafka are enabled by default. The bundled Kafka deployment is for demonstration and testing purposes only and is not suitable for production use.&lt;/li>
&lt;li>Rollout-operator webhooks are enabled by default, which requires installing CRDs before upgrading.&lt;/li>
&lt;li>The top-level &lt;code>nginx&lt;/code> values section is removed. You must migrate to the unified gateway deployment before upgrading to version 6.0.&lt;/li>
&lt;/ul>
&lt;h2 id="before-you-begin">Before you begin&lt;/h2>
&lt;ul>
&lt;li>You are running &lt;code>mimir-distributed&lt;/code> Helm chart version 5.x.&lt;/li>
&lt;li>If you&amp;rsquo;re using the rollout-operator, you have cluster permissions to install CRDs.&lt;/li>
&lt;li>If you&amp;rsquo;re using the top-level &lt;code>nginx&lt;/code> values, you have already migrated to the unified gateway deployment.&lt;/li>
&lt;/ul>
&lt;h2 id="procedure">Procedure&lt;/h2>
&lt;h3 id="migrate-to-unified-gateway-deployment-if-needed">Migrate to unified gateway deployment (if needed)&lt;/h3>
&lt;p>If your values file contains a top-level &lt;code>nginx&lt;/code> section, you must migrate to the unified gateway deployment before upgrading to version 6.0.&lt;/p></description></item></channel></rss>