使用 Helm 管理 Grafana Mimir 的配置
mimir-distributed
Helm chart 提供了用于设置 Grafana Mimir 配置参数的接口,并自定义 Grafana Mimir 如何部署在 Kubernetes 集群上。本文档描述了配置参数。
概述
Grafana Mimir 的配置可以通过 Helm chart 管理,也可以通过用户管理的对象提供。
如果您希望通过 Helm chart 管理配置,请参阅使用 Helm 管理配置。
如果您希望自行外部管理配置,请参阅外部管理配置。
处理敏感信息(如凭据)在这两种方法之间是通用的,请参阅注入凭据。
使用 Helm 管理配置
配置参数可以通过三种方式修改
- 通过
mimir.structuredConfig
值设置参数(推荐) - 复制整个
mimir.config
值并将其作为文本修改配置(不推荐,除非您想阻止 chart 升级自动更新配置) - 单独为组件设置额外的 CLI 标志(不推荐,除了设置可用区)
请参阅示例了解实际应用。
限制:无法通过
mimir.structuredConfig
删除在mimir.config
中设置的配置参数。请将配置参数设置为其默认值或某个其他值。
配置如何应用
Grafana Mimir 组件运行时使用的配置通过以下过程计算得出
mimir.config
中的配置 YAML 被评估为 Helm 模板。此步骤确保配置适用于将要安装它的 Kubernetes 集群。例如,设置集群特定地址。mimir.structuredConfig
中的值与mimir.config
递归合并。mimir.structuredConfig
中的值优先于mimir.config
中的值。结果再次被评估为 Helm 模板。此步骤应用用户特定的自定义设置。例如,S3 存储详情。- 生成的 YAML 配置随后按字母顺序排序并存储在
ConfigMap
(或Secret
,具体取决于configStorageType
的值)中,然后提供给所有 Grafana Mimir 组件。 - 配置文件以及任何额外的 CLI 标志都提供给 Mimir pod。
- 每个组件都会评估配置,并根据需要替换环境变量。请注意,额外的 CLI 标志优先于配置文件。
注意:CLI 标志是组件特定的,因此它们不会显示在生成的
ConfigMap
(或Secret
)中,从而使得正在运行的配置不太明显。仅在绝对必要时使用。
升级前检查配置更改
按照以下步骤检查将应用于配置的更改。
准备工作
- 安装 helm diff 插件。
- 将
configStorageType
的值设置为ConfigMap
。
使用 helm diff
子命令检查更改
helm -n mimir-test diff upgrade grafana/mimir-distributed -f custom.yaml
此命令显示正在运行的安装与执行 helm upgrade
命令后产生的安装之间的差异。在输出中搜索 name: mimir-config
以查看配置设置的差异。有关具体示例,请参阅Helm diff 命令输出示例。
注意:CLI 标志及其差异可在
Deployment
和StatefulSet
对象中找到。
外部管理配置
将配置准备为文本。它不能包含 Helm 模板函数或值评估。配置可以包含对环境变量的引用,如注入凭据中所述。
决定您是想使用 ConfigMap
还是 Secret
来存储配置。处理 ConfigMap
会稍微简单一些,但要注意敏感信息。
使用外部 ConfigMap
准备一个 ConfigMap
对象,将配置放在 mimir.yaml
数据键下。
apiVersion: v1
kind: ConfigMap
metadata:
name: my-mimir-config
data:
mimir.yaml: |
<configuration>
将 <configuration>
替换为多行文本形式的配置,注意缩进。名称 my-mimir-config
只是一个示例。
在您的自定义 values 文件(或 Helm 命令行)中设置以下值
useExternalConfig: true
externalConfigSecretName: my-mimir-config
externalConfigVersion: "0"
使用外部 Secret
准备一个 Secret
对象,将 base64 编码的配置放在 mimir.yaml
数据键下。
apiVersion: v1
kind: Secret
metadata:
name: my-mimir-config
data:
mimir.yaml: <configuration-base64>
将 <configuration-base64>
替换为 base64 格式字符串编码的配置。名称 my-mimir-config
只是一个示例。
在您的自定义 values 文件(或 Helm 命令行)中设置以下值
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
。
设置外部块存储,在本例中是 S3,存储桶命名例如
my-blocks-bucket
、my-ruler-bucket
,如果是 Grafana Enterprise Metrics,还有my-admin-bucket
。通过将以下内容写入
mysecret.yaml
文件来创建包含 S3 凭据的外部 SecretapiVersion: v1 kind: Secret metadata: name: mimir-bucket-secret data: AWS_ACCESS_KEY_ID: FAKEACCESSKEY AWS_SECRET_ACCESS_KEY: FAKESECRETKEY
将
FAKEACCESSKEY
和FAKESECRETKEY
替换为 base64 编码的实际值。使用
kubectl
命令将 Secret 应用到您的集群kubectl -n mimir-test apply -f mysecret.yaml
准备您的名为
custom.yaml
的自定义 values 文件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}
在安装前使用
helm
命令检查生成的配置helm -n mimir-test template mimir grafana/mimir-distributed -f custom.yaml -s templates/mimir-config.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
使用
helm
命令安装 charthelm -n mimir-test install mimir grafana/mimir-distributed -f custom.yaml
helm diff 命令输出示例
此示例按以下步骤生成
使用
helm
命令安装 Grafana Mimirhelm -n test install mimir grafana/mimir-distributed --version 3.0.0
创建一个包含以下内容的
custom.yaml
文件mimir: structuredConfig: alertmanager: external_url: https://example.com/alerts server: log_level: debug
使用
helm
命令生成 diffhelm -n test diff upgrade mimir grafana/mimir-distributed --version 3.0.0 -f custom.yaml
输出是真实输出的摘录,以减小篇幅
#... 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 ...
以“
-
”开头的行被移除,以“+
”开头的行被添加。对 annotationchecksum/config
的更改意味着应用此更改时,pod 将被重启。