菜单
企业版 开源

使用 Helm 管理 Grafana Mimir 的配置

mimir-distributed Helm chart 提供了用于设置 Grafana Mimir 配置参数的接口,并自定义 Grafana Mimir 如何部署在 Kubernetes 集群上。本文档描述了配置参数。

概述

Grafana Mimir 的配置可以通过 Helm chart 管理,也可以通过用户管理的对象提供。

如果您希望通过 Helm chart 管理配置,请参阅使用 Helm 管理配置

如果您希望自行外部管理配置,请参阅外部管理配置

处理敏感信息(如凭据)在这两种方法之间是通用的,请参阅注入凭据

使用 Helm 管理配置

配置参数可以通过三种方式修改

  1. 通过 mimir.structuredConfig 值设置参数(推荐)
  2. 复制整个 mimir.config 值并将其作为文本修改配置(不推荐,除非您想阻止 chart 升级自动更新配置)
  3. 单独为组件设置额外的 CLI 标志(不推荐,除了设置可用区)

请参阅示例了解实际应用。

限制:无法通过 mimir.structuredConfig 删除在 mimir.config 中设置的配置参数。请将配置参数设置为其默认值或某个其他值。

配置如何应用

Grafana Mimir 组件运行时使用的配置通过以下过程计算得出

  1. mimir.config 中的配置 YAML 被评估为 Helm 模板。此步骤确保配置适用于将要安装它的 Kubernetes 集群。例如,设置集群特定地址。
  2. mimir.structuredConfig 中的值与 mimir.config 递归合并。mimir.structuredConfig 中的值优先于 mimir.config 中的值。结果再次被评估为 Helm 模板。此步骤应用用户特定的自定义设置。例如,S3 存储详情。
  3. 生成的 YAML 配置随后按字母顺序排序并存储在 ConfigMap(或 Secret,具体取决于 configStorageType 的值)中,然后提供给所有 Grafana Mimir 组件。
  4. 配置文件以及任何额外的 CLI 标志都提供给 Mimir pod。
  5. 每个组件都会评估配置,并根据需要替换环境变量。请注意,额外的 CLI 标志优先于配置文件。

注意:CLI 标志是组件特定的,因此它们不会显示在生成的 ConfigMap(或 Secret)中,从而使得正在运行的配置不太明显。仅在绝对必要时使用。

升级前检查配置更改

按照以下步骤检查将应用于配置的更改。

准备工作

  1. 安装 helm diff 插件。
  2. configStorageType 的值设置为 ConfigMap

使用 helm diff 子命令检查更改

bash
helm -n mimir-test diff upgrade grafana/mimir-distributed -f custom.yaml

此命令显示正在运行的安装与执行 helm upgrade 命令后产生的安装之间的差异。在输出中搜索 name: mimir-config 以查看配置设置的差异。有关具体示例,请参阅Helm diff 命令输出示例

注意:CLI 标志及其差异可在 DeploymentStatefulSet 对象中找到。

外部管理配置

将配置准备为文本。它不能包含 Helm 模板函数或值评估。配置可以包含对环境变量的引用,如注入凭据中所述。

决定您是想使用 ConfigMap 还是 Secret 来存储配置。处理 ConfigMap 会稍微简单一些,但要注意敏感信息。

使用外部 ConfigMap

准备一个 ConfigMap 对象,将配置放在 mimir.yaml 数据键下。

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-mimir-config
data:
  mimir.yaml: |
    <configuration>

<configuration> 替换为多行文本形式的配置,注意缩进。名称 my-mimir-config 只是一个示例。

在您的自定义 values 文件(或 Helm 命令行)中设置以下值

yaml
useExternalConfig: true
externalConfigSecretName: my-mimir-config
externalConfigVersion: "0"

使用外部 Secret

准备一个 Secret 对象,将 base64 编码的配置放在 mimir.yaml 数据键下。

yaml
apiVersion: v1
kind: Secret
metadata:
  name: my-mimir-config
data:
  mimir.yaml: <configuration-base64>

<configuration-base64> 替换为 base64 格式字符串编码的配置。名称 my-mimir-config 只是一个示例。

在您的自定义 values 文件(或 Helm 命令行)中设置以下值

yaml
useExternalConfig: true
externalConfigSecretName: my-mimir-config
configStorageType: Secret
externalConfigVersion: "0"

更新配置

为了让组件感知配置更改,您可以

  • 更新 externalConfigVersion 中的值并运行 helm update
  • 或手动重启受配置更改影响的组件。

注入凭据

您可以使用 Helm chart 值 global.extraEnvFrom 将凭据注入到 Grafana Mimir 组件的运行时环境变量中。数据键将成为环境变量,可在 Grafana Mimir 配置中使用。例如,AWS_SECRET_ACCESS_KEY 在配置中可以引用为 ${AWS_SECRET_ACCESS_KEY}。有关实际应用,请参阅示例

为避免复杂性,请确保 Secret 中的键名只包含 ASCII 字母、数字和下划线。优先使用 AWS_SECRET_ACCESS_KEY 而非 secret-access-key.aws

Grafana Mimir 不会跟踪凭据的更改。如果凭据发生更改,应重启 Grafana Mimir pod 以使用新值。要触发重启,请在 global.podAnnotation 中提供一个应用于所有 Grafana Mimir pod 的全局 pod annotation。更改全局 annotation 的值将使 Kubernetes 重新创建所有 pod。例如,将 global.podAnnotations.bucketSecretVersion 的值从 "0" 更改为 "1" 会触发重启。请注意,pod annotations 只能是字符串。

使用 Helm 管理配置的示例

此示例展示了如何设置配置以使用 S3 存储桶作为块存储。我们假设正在使用的命名空间名为 mimir-test

  1. 设置外部块存储,在本例中是 S3,存储桶命名例如 my-blocks-bucketmy-ruler-bucket,如果是 Grafana Enterprise Metrics,还有 my-admin-bucket

  2. 通过将以下内容写入 mysecret.yaml 文件来创建包含 S3 凭据的外部 Secret

    yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: mimir-bucket-secret
    data:
      AWS_ACCESS_KEY_ID: FAKEACCESSKEY
      AWS_SECRET_ACCESS_KEY: FAKESECRETKEY

    FAKEACCESSKEYFAKESECRETKEY 替换为 base64 编码的实际值。

  3. 使用 kubectl 命令将 Secret 应用到您的集群

    bash
    kubectl -n mimir-test apply -f mysecret.yaml
  4. 准备您的名为 custom.yaml 的自定义 values 文件

    yaml
    global:
      extraEnvFrom:
        - secretRef:
            name: mimir-bucket-secret
      podAnnotations:
        bucketSecretVersion: "0"
    
    # This turns of the built-in MinIO support
    minio:
      enabled: false
    
    mimir:
      structuredConfig:
        # Uncomment when using Grafana Enterprise Metrics
        # admin_client:
        #   storage:
        #     s3:
        #       bucket_name: my-admin-bucket
        #       access_key_id: ${AWS_ACCESS_KEY_ID}
        #       endpoint: s3.amazonaws.com
        #       secret_access_key: ${AWS_SECRET_ACCESS_KEY}
        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}
  5. 在安装前使用 helm 命令检查生成的配置

    bash
    helm -n mimir-test template mimir grafana/mimir-distributed -f custom.yaml -s templates/mimir-config.yaml

    您应该看到以下输出

    yaml
    ---
    # 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: "2.2.0"
        app.kubernetes.io/managed-by: Helm
      namespace: "mimir-test"
    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+mimir-gossip-ring.test.svc.cluster.local:7946
        ruler:
          alertmanager_url: dnssrvnoa+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
  6. 使用 helm 命令安装 chart

    bash
    helm -n mimir-test install mimir grafana/mimir-distributed -f custom.yaml

helm diff 命令输出示例

此示例按以下步骤生成

  1. 使用 helm 命令安装 Grafana Mimir

    bash
    helm -n test install mimir grafana/mimir-distributed --version 3.0.0
  2. 创建一个包含以下内容的 custom.yaml 文件

    yaml
    mimir:
      structuredConfig:
        alertmanager:
          external_url: https://example.com/alerts
        server:
          log_level: debug
  3. 使用 helm 命令生成 diff

    bash
    helm -n test diff upgrade mimir grafana/mimir-distributed --version 3.0.0  -f custom.yaml

    输出是真实输出的摘录,以减小篇幅

    diff
    #... 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: "2.2.0"
          app.kubernetes.io/managed-by: Helm
        namespace: "test"
      data:
        mimir.yaml: |
           activity_tracker:
            filepath: /active-query-tracker/activity.log
          alertmanager:
            data_dir: /data
            enable_api: true
    -       external_url: /alertmanager
    +       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+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
    +       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: "2.2.0"
          app.kubernetes.io/managed-by: Helm
        annotations:
          {}
        namespace: "test"
      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: "2.2.0"
              app.kubernetes.io/managed-by: Helm
              app.kubernetes.io/component: distributor
              app.kubernetes.io/part-of: memberlist
            annotations:
    -         checksum/config: bad33a421a56693ebad68b64ecf407b5e897c3679b1a33b65672dbc4e98e918f
    +         checksum/config: 02f080c347a1fcd6c9e49a38280330378d3afe12efc7151cd679935c96b35b83
            namespace: "test"
          spec:
            serviceAccountName: mimir
            securityContext:
              {}
            initContainers:
              []
            containers:
              - name: distributor
                image: "grafana/mimir:2.2.0"
                imagePullPolicy: IfNotPresent
                args:
                  - "-target=distributor"
                  - "-config.expand-env=true"
                  - "-config.file=/etc/mimir/mimir.yaml"
                volumeMounts:
                  - name: config
                    mountPath: /etc/mimir
                  - name: runtime-config
                    mountPath: /var/mimir
                  - name: storage
                    mountPath: "/data"
                    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: "mimir.yaml"
                      path: "mimir.yaml"
              - name: runtime-config
                configMap:
                  name: mimir-runtime
              - name: storage
                emptyDir: {}
     #... cut for size ...

    以“-”开头的行被移除,以“+”开头的行被添加。对 annotation checksum/config 的更改意味着应用此更改时,pod 将被重启。