<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Run Grafana Mimir in production using the Helm chart on Grafana Labs</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/run-production-environment-with-helm/</link><description>Recent content in Run Grafana Mimir in production using the Helm chart on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/helm-charts/mimir-distributed/latest/run-production-environment-with-helm/index.xml" rel="self" type="application/rss+xml"/><item><title>Configure high-availability deduplication with the Mimir distributed Helm chart</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/run-production-environment-with-helm/configure-helm-ha-deduplication/</link><pubDate>Fri, 31 Oct 2025 14:55:43 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/run-production-environment-with-helm/configure-helm-ha-deduplication/</guid><content><![CDATA[&lt;h1 id=&#34;configure-high-availability-deduplication-with-the-mimir-distributed-helm-chart&#34;&gt;Configure high-availability deduplication with the Mimir distributed Helm chart&lt;/h1&gt;
&lt;p&gt;Grafana Mimir can deduplicate data from a high-availability (HA) Prometheus setup. Starting from Mimir 3.0, the HA tracker uses &lt;code&gt;memberlist&lt;/code&gt; by default, which requires no external dependencies. For more information, see 
    &lt;a href=&#34;/docs/mimir/v3.0.x/configure/configure-high-availability-deduplication/&#34;&gt;Configure high availability&lt;/a&gt;.&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;Prior to Mimir 3.0, the HA tracker required an external key-value store such as Consul or etcd. These backends are now deprecated. If you&amp;rsquo;re currently using Consul or etcd for the HA tracker, refer to the migration guide.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;You need to have a Grafana Mimir installed via the mimir-distributed Helm chart.&lt;/p&gt;
&lt;p&gt;For conceptual information about how Mimir deduplicates incoming HA samples, refer to 
    &lt;a href=&#34;/docs/mimir/v3.0.x/configure/configure-high-availability-deduplication/&#34;&gt;Configure high availability&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You also need to configure HA for Prometheus or Grafana Alloy.&lt;/p&gt;


&lt;div data-shared=&#34;agent-deprecation.md&#34;&gt;
            

&lt;div class=&#34;admonition admonition-caution&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Caution&lt;/p&gt;&lt;p&gt;Grafana Alloy is the new name for our distribution of the OTel collector.
Grafana Agent has been deprecated and is in Long-Term Support (LTS) through October 31, 2025. Grafana Agent will reach an End-of-Life (EOL) on November 1, 2025.
Read more about why we recommend migrating to &lt;a href=&#34;/blog/2024/04/09/grafana-alloy-opentelemetry-collector-with-prometheus-pipelines/&#34;&gt;Grafana Alloy&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;/div&gt;

        
&lt;h2 id=&#34;configure-prometheus-or-grafana-alloy-to-send-ha-external-labels&#34;&gt;Configure Prometheus or Grafana Alloy to send HA external labels&lt;/h2&gt;
&lt;p&gt;Configure the Prometheus or Grafana Alloy HA setup by setting the labels named &lt;code&gt;cluster&lt;/code&gt; and &lt;code&gt;__replica__&lt;/code&gt;,
which are the default labels for a HA setup in Grafana Mimir. If you want to change the HA labels,
make sure to change them in Mimir as well. This ensures that the configurations of Grafana Mimir, Prometheus, and Grafana Alloy all match each other. Otherwise, HA deduplication will not work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The value of the &lt;code&gt;cluster&lt;/code&gt; label must be same across replicas that belong to the same cluster.&lt;/li&gt;
&lt;li&gt;The value of the &lt;code&gt;__replica__&lt;/code&gt; label must be unique across replicas within the same cluster.&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;global:
  external_labels:
    __replica__: replica-1
    cluster: my-prometheus&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Reload or restart Prometheus or Grafana Alloy after you update the configuration.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 
    &lt;a href=&#34;/docs/mimir/v3.0.x/configure/configure-high-availability-deduplication/&#34;&gt;Configure high availability&lt;/a&gt; contains the same information on Prometheus setup for HA deduplication.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;configure-mimir-high-availability&#34;&gt;Configure Mimir high availability&lt;/h2&gt;
&lt;p&gt;You can configure Mimir HA deduplication globally or at the tenant level.&lt;/p&gt;
&lt;h3 id=&#34;globally-configure-ha-deduplication&#34;&gt;Globally configure HA deduplication&lt;/h3&gt;
&lt;p&gt;Before you begin, make sure that Mimir was installed using the mimir-distributed Helm chart.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Merge the following configuration to your &lt;code&gt;custom.yaml&lt;/code&gt; file:&lt;/li&gt;
&lt;/ol&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:
      accept_ha_samples: true
      # The following two configurations must match those of external_labels in Prometheus
      # The config values below are the default and can be removed if you don&amp;#39;t want to override to a new value
      ha_cluster_label: cluster
      ha_replica_label: __replica__
    distributor:
      ha_tracker:
        enable_ha_tracker: true
        kvstore:
          store: memberlist&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;p&gt;If memberlist is already configured for other Mimir components (such as the hash ring), the HA tracker will automatically use that configuration. In most Helm deployments, memberlist is already configured, so no additional configuration is needed.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Upgrade the Mimir Helm release using the following command:&lt;/li&gt;
&lt;/ol&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 -n &amp;lt;mimir-namespace&amp;gt; upgrade mimir grafana/mimir-distributed -f custom.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;configure-ha-deduplication-per-tenant&#34;&gt;Configure HA deduplication per tenant&lt;/h3&gt;
&lt;p&gt;Before you begin, make sure that Mimir was installed using the mimir-distributed Helm chart.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Merge the following configuration to the &lt;code&gt;custom.yaml&lt;/code&gt; file:&lt;/li&gt;
&lt;/ol&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:
      accept_ha_samples: true
      # The following two configurations must match those of external_labels in Prometheus
      # The config values below are the default and can be removed if you don&amp;#39;t want to override to a new value
      ha_cluster_label: cluster
      ha_replica_label: __replica__
    distributor:
      ha_tracker:
        enable_ha_tracker: true
        kvstore:
          store: memberlist
runtimeConfig:
  overrides:
    &amp;lt;tenant-id&amp;gt;: # put real tenant ID here
      accept_ha_samples: true
      ha_cluster_label: cluster
      ha_replica_label: __replica__&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;mimir&lt;/code&gt; configuration block is similar to the global HA deduplication configuration. The &lt;code&gt;runtimeConfig&lt;/code&gt; block
configures per-tenant HA deduplication.&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Upgrade the Mimir&amp;rsquo;s helm release using the following command:&lt;/li&gt;
&lt;/ol&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 -n &amp;lt;mimir-namespace&amp;gt; upgrade mimir grafana/mimir-distributed -f custom.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;verifying-deduplication&#34;&gt;Verifying deduplication&lt;/h2&gt;
&lt;p&gt;After Prometheus and Mimir are running, you can verify deduplication in several ways.&lt;/p&gt;
&lt;h3 id=&#34;ha_trackers-page&#34;&gt;ha_tracker&amp;rsquo;s page&lt;/h3&gt;
&lt;p&gt;Port forward Mimir distributor service. The argument after port-forward must
match your Mimir&amp;rsquo;s distributor name.&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 -n &amp;lt;mimir-namespace&amp;gt; port-forward service/mimir-distributor 8080:8080&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can use the following command to get the distributor name:&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 -n &amp;lt;mimir-namespace&amp;gt; get service | grep distributor&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Open &lt;code&gt;http://localhost:8080/distributor/ha_tracker&lt;/code&gt; in a browser. You should see the output similar like the following.
If the table is empty, it means there is something wrong with the configuration.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;ha-tracker-status.png&#34;
  alt=&#34;HA Tracker status&#34;/&gt;&lt;/p&gt;
&lt;h3 id=&#34;distributor-metrics&#34;&gt;Distributor metrics&lt;/h3&gt;
&lt;p&gt;If you have set up &lt;a href=&#34;/docs/mimir/latest/manage/monitor-grafana-mimir/monitor-system-health/&#34;&gt;metamonitoring&lt;/a&gt;,
Mimir 
    &lt;a href=&#34;/docs/mimir/v3.0.x/references/architecture/components/distributor/&#34;&gt;distributor&lt;/a&gt;
exposes some metrics related to HA deduplication. The relevant metrics are those with &lt;code&gt;cortex_ha_tracker_&lt;/code&gt; prefix.&lt;/p&gt;
&lt;h3 id=&#34;ensure-ha-metrics-are-deduplicated&#34;&gt;Ensure HA metrics are deduplicated&lt;/h3&gt;
&lt;p&gt;Go to Grafana explore page and select Mimir datasource. Then execute the following query: &lt;code&gt;up&lt;/code&gt;. In the Options drop down,
select Format = Table. In the result you can see the several time series with different labels.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;verify-deduplication.png&#34;
  alt=&#34;Verify deduplication&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The most important thing is you will not find &lt;code&gt;__replica__&lt;/code&gt; label (or any label that you set in &lt;code&gt;ha_replica_label&lt;/code&gt;
config) anymore. This means you have configured the deduplication successfully.&lt;/p&gt;
]]></content><description>&lt;h1 id="configure-high-availability-deduplication-with-the-mimir-distributed-helm-chart">Configure high-availability deduplication with the Mimir distributed Helm chart&lt;/h1>
&lt;p>Grafana Mimir can deduplicate data from a high-availability (HA) Prometheus setup. Starting from Mimir 3.0, the HA tracker uses &lt;code>memberlist&lt;/code> by default, which requires no external dependencies. For more information, see
&lt;a href="/docs/mimir/v3.0.x/configure/configure-high-availability-deduplication/">Configure high availability&lt;/a>.&lt;/p></description></item><item><title>Manage the configuration of Grafana Mimir with Helm</title><link>https://grafana.com/docs/helm-charts/mimir-distributed/latest/run-production-environment-with-helm/configuration-with-helm/</link><pubDate>Fri, 31 Oct 2025 14:55:43 +0000</pubDate><guid>https://grafana.com/docs/helm-charts/mimir-distributed/latest/run-production-environment-with-helm/configuration-with-helm/</guid><content><![CDATA[&lt;h1 id=&#34;manage-the-configuration-of-grafana-mimir-with-helm&#34;&gt;Manage the configuration of Grafana Mimir with Helm&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;mimir-distributed&lt;/code&gt; Helm chart provides interfaces to set Grafana Mimir 
    &lt;a href=&#34;/docs/mimir/v3.0.x/configure/configuration-parameters/&#34;&gt;configuration parameters&lt;/a&gt; and to customize how to deploy Grafana Mimir on a Kubernetes cluster.&lt;/p&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;p&gt;You can either manage the configuration of Grafana Mimir through the Helm chart or supply the configuration through a user-managed object.&lt;/p&gt;
&lt;p&gt;If you want to manage the configuration through the Helm chart, refer to &lt;a href=&#34;#manage-the-configuration-with-helm&#34;&gt;Manage the configuration with Helm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to manage the configuration externally, refer to &lt;a href=&#34;#manage-the-configuration-externally&#34;&gt;Manage the configuration externally&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Handling sensitive information, such as credentials, is common between the two methods. Refer to &lt;a href=&#34;#injecting-credentials&#34;&gt;Inject credentials&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;manage-the-configuration-with-helm&#34;&gt;Manage the configuration with Helm&lt;/h2&gt;
&lt;p&gt;There are three ways that you can modify configuration parameters:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Setting parameters via the &lt;code&gt;mimir.structuredConfig&lt;/code&gt; value (recommended).&lt;/li&gt;
&lt;li&gt;Copying the entire &lt;code&gt;mimir.config&lt;/code&gt; value and modifying the configuration as text (discouraged, unless you want to prevent upgrades of the chart from automatically updating the configuration).&lt;/li&gt;
&lt;li&gt;Setting extra CLI flags for components individually (discouraged, except for setting availability zones).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Refer to the &lt;a href=&#34;#example-of-configuration-managed-with-helm&#34;&gt;Example&lt;/a&gt; for a practical application.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Limitation:&lt;/strong&gt; It&amp;rsquo;s not possible to delete configuration parameters that were set in &lt;code&gt;mimir.config&lt;/code&gt; through &lt;code&gt;mimir.structuredConfig&lt;/code&gt;. Instead, set the configuration parameter to its default or to some other value.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;how-grafana-mimir-applies-the-configuration&#34;&gt;How Grafana Mimir applies the configuration&lt;/h3&gt;
&lt;p&gt;Grafana Mimir components run with a configuration calculated by the following process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The configuration YAML in &lt;code&gt;mimir.config&lt;/code&gt; is evaluated as a Helm template. This step ensures that the configuration applies to the Kubernetes cluster where it will be installed. For example, setting up cluster-specific addresses.&lt;/li&gt;
&lt;li&gt;The values from &lt;code&gt;mimir.structuredConfig&lt;/code&gt; are recursively merged with &lt;code&gt;mimir.config&lt;/code&gt;. The values from &lt;code&gt;mimir.structuredConfig&lt;/code&gt; take precedence over the values in &lt;code&gt;mimir.config&lt;/code&gt;. The result is again evaluated as a Helm template. This step applies user-specific customizations. For example, S3 storage details.&lt;/li&gt;
&lt;li&gt;The resulting YAML configuration is then sorted alphabetically and stored in a &lt;code&gt;ConfigMap&lt;/code&gt; (or &lt;code&gt;Secret&lt;/code&gt;, depending on the value of &lt;code&gt;configStorageType&lt;/code&gt;) and provided to all Grafana Mimir components.&lt;/li&gt;
&lt;li&gt;The configuration file, as well as any extra CLI flags, are provided to the Mimir pods.&lt;/li&gt;
&lt;li&gt;Each component evaluates the configuration, substituting environment variables as required. Note that extra CLI flags take precedence over the configuration file.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; CLI flags are component-specific, and therefore, don&amp;rsquo;t show up in the generated &lt;code&gt;ConfigMap&lt;/code&gt; (or &lt;code&gt;Secret&lt;/code&gt;). This makes it less obvious which configuration is running. Use these flags only when necessary.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;inspect-changes-to-the-configuration-before-upgrade&#34;&gt;Inspect changes to the configuration before upgrade&lt;/h3&gt;
&lt;p&gt;Follow these steps to inspect which change apply to the configuration.&lt;/p&gt;
&lt;p&gt;Preparation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install the &lt;a href=&#34;https://github.com/databus23/helm-diff&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;helm diff&lt;/a&gt; plugin.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;configStorageType&lt;/code&gt; value to &lt;code&gt;ConfigMap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Inspect changes using the &lt;code&gt;helm diff&lt;/code&gt; sub command:&lt;/li&gt;
&lt;/ol&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 -n mimir-test diff upgrade grafana/mimir-distributed -f custom.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This command shows the differences between the running installation and the installation that would result from running the &lt;code&gt;helm upgrade&lt;/code&gt; command. Search for &lt;code&gt;name: mimir-config&lt;/code&gt; in the output to see the difference in configuration settings. Refer to &lt;a href=&#34;#example-output-of-helm-diff-command&#34;&gt;Example output of helm diff command&lt;/a&gt; for a concrete example.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can find CLI flags and their differences in the &lt;code&gt;Deployment&lt;/code&gt; and &lt;code&gt;StatefulSet&lt;/code&gt; objects.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;manage-runtime-configuration&#34;&gt;Manage runtime configuration&lt;/h3&gt;
&lt;p&gt;You can also use the Helm chart to manage runtime configuration files. Runtime configuration files contain configuration parameters and are periodically reloaded while Mimir is running. This process allows you to change a subset of Grafana Mimir’s configuration without having to restart the Grafana Mimir component or instance.&lt;/p&gt;
&lt;p&gt;To manage runtime configuration with the Helm chart, add the following stanza to 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;runtimeConfig:
  overrides:
    tenant-1: # limits for tenant-1 that the whole cluster enforces
      ingestion_tenant_shard_size: _`&amp;lt;SAMPLE_VALUE&amp;gt;`_
      max_global_series_per_user: _`&amp;lt;SAMPLE_VALUE&amp;gt;`_
      max_fetched_series_per_query: _`&amp;lt;SAMPLE_VALUE&amp;gt;`_&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For more information about runtime configuration in Grafana Mimir, refer to 
    &lt;a href=&#34;/docs/mimir/v3.0.x/configure/about-runtime-configuration/&#34;&gt;About Grafana Mimir runtime configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;manage-the-configuration-externally&#34;&gt;Manage the configuration externally&lt;/h2&gt;
&lt;p&gt;Prepare the configuration as text, without including Helm template functions or value evaluations. You can include references to environment variables, as explained in &lt;a href=&#34;#injecting-credentials&#34;&gt;Injecting credentials&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Decide whether you want to use a &lt;code&gt;ConfigMap&lt;/code&gt; or &lt;code&gt;Secret&lt;/code&gt; to store the configuration. Handling &lt;code&gt;ConfigMap&lt;/code&gt; is simpler, but beware of sensitive information.&lt;/p&gt;
&lt;h3 id=&#34;use-external-configmap&#34;&gt;Use external ConfigMap&lt;/h3&gt;
&lt;p&gt;Prepare a &lt;code&gt;ConfigMap&lt;/code&gt; object that places the configuration under the &lt;code&gt;mimir.yaml&lt;/code&gt; data key.&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: ConfigMap
metadata:
  name: my-mimir-config
data:
  mimir.yaml: |
    &amp;lt;configuration&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;&amp;lt;configuration&amp;gt;&lt;/code&gt; with the configuration as multi-line text, being mindful of indentation. The name &lt;code&gt;my-mimir-config&lt;/code&gt; is just an example.&lt;/p&gt;
&lt;p&gt;Set the following values in your custom values file, or on the Helm command line:&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;useExternalConfig: true
externalConfigSecretName: my-mimir-config
externalConfigVersion: &amp;#34;0&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;use-external-secret&#34;&gt;Use external Secret&lt;/h3&gt;
&lt;p&gt;Prepare a &lt;code&gt;Secret&lt;/code&gt; object, where the configuration is base64-encoded and placed under the &lt;code&gt;mimir.yaml&lt;/code&gt; data key.&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: my-mimir-config
data:
  mimir.yaml: &amp;lt;configuration-base64&amp;gt;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Replace &lt;code&gt;&amp;lt;configuration-base64&amp;gt;&lt;/code&gt; with the configuration encoded as base64 format string. The name &lt;code&gt;my-mimir-config&lt;/code&gt; is just an example.&lt;/p&gt;
&lt;p&gt;Set the following values in your custom values file, or on the Helm command line:&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;useExternalConfig: true
externalConfigSecretName: my-mimir-config
configStorageType: Secret
externalConfigVersion: &amp;#34;0&amp;#34;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;update-the-configuration&#34;&gt;Update the configuration&lt;/h3&gt;
&lt;p&gt;To make components aware of configuration changes, choose one of the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update the value in &lt;code&gt;externalConfigVersion&lt;/code&gt; and run &lt;code&gt;helm update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Manually restart components affected by the configuration change.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;inject-credentials&#34;&gt;Inject credentials&lt;/h2&gt;
&lt;p&gt;You can use the Helm chart value &lt;code&gt;global.extraEnvFrom&lt;/code&gt; to inject credentials into the runtime environment variables of Grafana Mimir components. The data keys become environment variables and usable in the Grafana Mimir configuration. For example, you can reference &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; as &lt;code&gt;${AWS_SECRET_ACCESS_KEY}&lt;/code&gt; in the configuration. Refer to the &lt;a href=&#34;#example-of-configuration-managed-with-helm&#34;&gt;Example&lt;/a&gt; for a practical application.&lt;/p&gt;
&lt;p&gt;To avoid complications, make sure that the key names in the secret contain only ASCII letters, numbers, and underscores.
Prefer &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; over &lt;code&gt;secret-access-key.aws&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Grafana Mimir does not track changes to the credentials. If you update the credentials, restart Grafana Mimir pods to use the updated value. To trigger a restart, provide a global &lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;pod annotation&lt;/a&gt; in &lt;code&gt;global.podAnnotation&lt;/code&gt;, which is applied to all Grafana Mimir pods. Changing the value of the global annotation makes Kubernetes recreate all pods. For example, changing &lt;code&gt;global.podAnnotations.bucketSecretVersion&lt;/code&gt; from &lt;code&gt;&amp;quot;0&amp;quot;&lt;/code&gt; to &lt;code&gt;&amp;quot;1&amp;quot;&lt;/code&gt; triggers a restart. Note that pod annotations can only be strings.&lt;/p&gt;
&lt;h2 id=&#34;example-configuration-managed-with-helm&#34;&gt;Example configuration managed with Helm&lt;/h2&gt;
&lt;p&gt;This example shows how to set up the configuration to use an S3 bucket for blocks storage in a namespace called &lt;code&gt;mimir-test&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set up the external blocks storage, in this case S3 with buckets named, for example, &lt;code&gt;my-blocks-bucket&lt;/code&gt; and &lt;code&gt;my-ruler-bucket&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create an external secret with the S3 credentials by writing the following to a &lt;code&gt;mysecret.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;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;Replace &lt;code&gt;FAKEACCESSKEY&lt;/code&gt; and &lt;code&gt;FAKESECRETKEY&lt;/code&gt; with the actual value encoded in base64.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the secret to your cluster with the &lt;code&gt;kubectl&lt;/code&gt; 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;kubectl -n mimir-test apply -f mysecret.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prepare your custom values file called &lt;code&gt;custom.yaml&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: mimir-bucket-secret
  podAnnotations:
    bucketSecretVersion: &amp;#34;0&amp;#34;

# This turns of the built-in MinIO support
minio:
  enabled: false

mimir:
  structuredConfig:
    alertmanager_storage:
      s3:
        bucket_name: my-ruler-bucket
        access_key_id: ${AWS_ACCESS_KEY_ID}
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}
    blocks_storage:
      backend: s3
      s3:
        bucket_name: my-blocks-bucket
        access_key_id: ${AWS_ACCESS_KEY_ID}
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}
    ruler_storage:
      s3:
        bucket_name: my-ruler-bucket
        access_key_id: ${AWS_ACCESS_KEY_ID}
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the resulting configuration with the &lt;code&gt;helm&lt;/code&gt; command before installing:&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 -n mimir-test template mimir grafana/mimir-distributed -f custom.yaml -s templates/mimir-config.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You should see the following output:&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;---
# Source: mimir-distributed/templates/mimir-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mimir-config
  labels:
    helm.sh/chart: mimir-distributed-3.0.0
    app.kubernetes.io/name: mimir
    app.kubernetes.io/instance: mimir
    app.kubernetes.io/version: &amp;#34;2.2.0&amp;#34;
    app.kubernetes.io/managed-by: Helm
  namespace: &amp;#34;mimir-test&amp;#34;
data:
  mimir.yaml: |
    activity_tracker:
      filepath: /active-query-tracker/activity.log
    alertmanager:
      data_dir: /data
      enable_api: true
      external_url: /alertmanager
    alertmanager_storage:
      s3:
        access_key_id: ${AWS_ACCESS_KEY_ID}
        bucket_name: my-ruler-bucket
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}
    blocks_storage:
      backend: s3
      bucket_store:
        sync_dir: /data/tsdb-sync
      s3:
        access_key_id: ${AWS_ACCESS_KEY_ID}
        bucket_name: my-blocks-bucket
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}
      tsdb:
        dir: /data/tsdb
    compactor:
      data_dir: /data
    frontend:
      align_queries_with_step: true
      log_queries_longer_than: 10s
    frontend_worker:
      frontend_address: mimir-query-frontend-headless.test.svc:9095
    ingester:
      ring:
        final_sleep: 0s
        num_tokens: 512
        unregister_on_shutdown: false
    ingester_client:
      grpc_client_config:
        max_recv_msg_size: 104857600
        max_send_msg_size: 104857600
    limits: {}
    memberlist:
      abort_if_cluster_join_fails: false
      compression_enabled: false
      join_members:
      - dns&amp;#43;mimir-gossip-ring.test.svc.cluster.local:7946
    ruler:
      alertmanager_url: dnssrvnoa&amp;#43;http://_http-metrics._tcp.mimir-alertmanager-headless.test.svc.cluster.local/alertmanager
      enable_api: true
      rule_path: /data
    ruler_storage:
      s3:
        access_key_id: ${AWS_ACCESS_KEY_ID}
        bucket_name: my-ruler-bucket
        endpoint: s3.amazonaws.com
        secret_access_key: ${AWS_SECRET_ACCESS_KEY}
    runtime_config:
      file: /var/mimir/runtime.yaml
    server:
      grpc_server_max_concurrent_streams: 1000&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the chart with the &lt;code&gt;helm&lt;/code&gt; 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;helm -n mimir-test install mimir grafana/mimir-distributed -f custom.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;example-output-of-helm-diff-command&#34;&gt;Example output of helm diff command&lt;/h2&gt;
&lt;p&gt;The example is generated with the following steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install Grafana Mimir with the &lt;code&gt;helm&lt;/code&gt; 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;helm -n test install mimir grafana/mimir-distributed --version 3.0.0&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;custom.yaml&lt;/code&gt; file with the following content:&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:
    alertmanager:
      external_url: https://example.com/alerts
    server:
      log_level: debug&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Produce the diff with the &lt;code&gt;helm&lt;/code&gt; 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;helm -n test diff upgrade mimir grafana/mimir-distributed --version 3.0.0  -f custom.yaml&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The output is an excerpt of the real output to reduce the size:&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;diff&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-diff&#34;&gt;#... cut for size ...

test, mimir-config, ConfigMap (v1) has changed:
  # Source: mimir-distributed/templates/mimir-config.yaml
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: mimir-config
    labels:
      helm.sh/chart: mimir-distributed-3.0.0
      app.kubernetes.io/name: mimir
      app.kubernetes.io/instance: mimir
      app.kubernetes.io/version: &amp;#34;2.2.0&amp;#34;
      app.kubernetes.io/managed-by: Helm
    namespace: &amp;#34;test&amp;#34;
  data:
    mimir.yaml: |
       activity_tracker:
        filepath: /active-query-tracker/activity.log
      alertmanager:
        data_dir: /data
        enable_api: true
-       external_url: /alertmanager
&amp;#43;       external_url: https://example.com/alerts
      alertmanager_storage:
        backend: s3
        s3:
          access_key_id: grafana-mimir
          bucket_name: mimir-ruler
          endpoint: mimir-minio.test.svc:9000
          insecure: true
          secret_access_key: supersecret
      blocks_storage:
        backend: s3
        bucket_store:
          sync_dir: /data/tsdb-sync
        s3:
          access_key_id: grafana-mimir
          bucket_name: mimir-tsdb
          endpoint: mimir-minio.test.svc:9000
          insecure: true
          secret_access_key: supersecret
        tsdb:
          dir: /data/tsdb
      compactor:
        data_dir: /data
      frontend:
        align_queries_with_step: true
        log_queries_longer_than: 10s
      frontend_worker:
        frontend_address: mimir-query-frontend-headless.test.svc:9095
      ingester:
        ring:
          final_sleep: 0s
          num_tokens: 512
          unregister_on_shutdown: false
      ingester_client:
        grpc_client_config:
          max_recv_msg_size: 104857600
          max_send_msg_size: 104857600
      limits: {}
      memberlist:
        abort_if_cluster_join_fails: false
        compression_enabled: false
        join_members:
        - mimir-gossip-ring
      ruler:
        alertmanager_url: dnssrvnoa&amp;#43;http://_http-metrics._tcp.mimir-alertmanager-headless.test.svc.cluster.local/alertmanager
        enable_api: true
        rule_path: /data
      ruler_storage:
        backend: s3
        s3:
          access_key_id: grafana-mimir
          bucket_name: mimir-ruler
          endpoint: mimir-minio.test.svc:9000
          insecure: true
          secret_access_key: supersecret
      runtime_config:
        file: /var/mimir/runtime.yaml
      server:
        grpc_server_max_concurrent_streams: 1000
&amp;#43;       log_level: debug

#... cut for size ...

test, mimir-distributor, Deployment (apps) has changed:
  # Source: mimir-distributed/templates/distributor/distributor-dep.yaml
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: mimir-distributor
    labels:
      helm.sh/chart: mimir-distributed-3.0.0
      app.kubernetes.io/name: mimir
      app.kubernetes.io/instance: mimir
      app.kubernetes.io/component: distributor
      app.kubernetes.io/part-of: memberlist
      app.kubernetes.io/version: &amp;#34;2.2.0&amp;#34;
      app.kubernetes.io/managed-by: Helm
    annotations:
      {}
    namespace: &amp;#34;test&amp;#34;
  spec:
    replicas: 1
    selector:
      matchLabels:
        app.kubernetes.io/name: mimir
        app.kubernetes.io/instance: mimir
        app.kubernetes.io/component: distributor
    strategy:
      rollingUpdate:
        maxSurge: 0
        maxUnavailable: 1
      type: RollingUpdate
    template:
      metadata:
        labels:
          helm.sh/chart: mimir-distributed-3.0.0
          app.kubernetes.io/name: mimir
          app.kubernetes.io/instance: mimir
          app.kubernetes.io/version: &amp;#34;2.2.0&amp;#34;
          app.kubernetes.io/managed-by: Helm
          app.kubernetes.io/component: distributor
          app.kubernetes.io/part-of: memberlist
        annotations:
-         checksum/config: bad33a421a56693ebad68b64ecf407b5e897c3679b1a33b65672dbc4e98e918f
&amp;#43;         checksum/config: 02f080c347a1fcd6c9e49a38280330378d3afe12efc7151cd679935c96b35b83
        namespace: &amp;#34;test&amp;#34;
      spec:
        serviceAccountName: mimir
        securityContext:
          {}
        initContainers:
          []
        containers:
          - name: distributor
            image: &amp;#34;grafana/mimir:2.2.0&amp;#34;
            imagePullPolicy: IfNotPresent
            args:
              - &amp;#34;-target=distributor&amp;#34;
              - &amp;#34;-config.expand-env=true&amp;#34;
              - &amp;#34;-config.file=/etc/mimir/mimir.yaml&amp;#34;
            volumeMounts:
              - name: config
                mountPath: /etc/mimir
              - name: runtime-config
                mountPath: /var/mimir
              - name: storage
                mountPath: &amp;#34;/data&amp;#34;
                subPath:
            ports:
              - name: http-metrics
                containerPort: 8080
                protocol: TCP
              - name: grpc
                containerPort: 9095
                protocol: TCP
              - name: memberlist
                containerPort: 7946
                protocol: TCP
            livenessProbe:
              null
            readinessProbe:
              httpGet:
                path: /ready
                port: http-metrics
              initialDelaySeconds: 45
            resources:
              requests:
                cpu: 100m
                memory: 512Mi
            securityContext:
              readOnlyRootFilesystem: true
            env:
            envFrom:
        nodeSelector:
          {}
        affinity:
          podAntiAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                - key: target
                  operator: In
                  values:
                  - distributor
              topologyKey: kubernetes.io/hostname
        tolerations:
          []
        terminationGracePeriodSeconds: 60
        volumes:
          - name: config
            configMap:
              name: mimir-config
              items:
                - key: &amp;#34;mimir.yaml&amp;#34;
                  path: &amp;#34;mimir.yaml&amp;#34;
          - name: runtime-config
            configMap:
              name: mimir-runtime
          - name: storage
            emptyDir: {}
 #... cut for size ...&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lines starting with &amp;ldquo;&lt;code&gt;-&lt;/code&gt;&amp;rdquo; are removed and lines starting with &amp;ldquo;&lt;code&gt;&#43;&lt;/code&gt;&amp;rdquo; are added. The change to the annotation &lt;code&gt;checksum/config&lt;/code&gt; means the pods are restarted when this change is applied.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="manage-the-configuration-of-grafana-mimir-with-helm">Manage the configuration of Grafana Mimir with Helm&lt;/h1>
&lt;p>The &lt;code>mimir-distributed&lt;/code> Helm chart provides interfaces to set Grafana Mimir
&lt;a href="/docs/mimir/v3.0.x/configure/configuration-parameters/">configuration parameters&lt;/a> and to customize how to deploy Grafana Mimir on a Kubernetes cluster.&lt;/p></description></item></channel></rss>