菜单
Enterprise 开源 RSS

使用 Helm chart 在生产环境中运行 Grafana Mimir

除了使用 Helm chart 入门 Grafana Mimir 指南(该指南涵盖了在本地 Kubernetes 集群或低风险开发环境中设置 Grafana Mimir),您还可以为生产环境准备 Grafana Mimir。

尽管以下信息假设您正在面向客户的生产环境中使用 Grafana Mimir,但即使在内部开发环境中,您也可能需要 Grafana Mimir 的高可用性和水平可伸缩性功能。

开始之前

满足以下所有前提条件

  • 您熟悉 Helm 3.x

    将 grafana Helm 仓库添加到您的本地环境或 CI/CD 工具中

    bash
    helm repo add grafana https://grafana.github.io/helm-charts
    helm repo update
  • 您拥有一个与 mimir-distributed 部署的 MinIO 对象存储不同的外部对象存储,因为 Helm chart 中的 MinIO 部署仅用于入门目的,不适合用于生产环境。

    要在生产环境中使用 Grafana Mimir,您必须将默认对象存储替换为 Amazon S3 兼容服务、Google Cloud Storage、Microsoft® Azure Blob Storage 或 OpenStack Swift。或者,如果您想自行部署 MinIO,请参阅 MinIO 高性能对象存储

  • 注意

    与 Amazon S3 类似,所选的对象存储实现不得创建目录。Grafana Mimir 对对象存储目录没有概念,因此在移除块时会留下空目录。例如,如果您使用 Azure Blob Storage,则必须禁用

    分层命名空间.

规划容量

mimir-distributed Helm chart 附带两个容量规划

这些容量规划是基于 Grafana Labs 运营 Grafana Mimir 的经验估算得出的。您的集群的理想规模取决于您的使用模式。因此,请将这些容量规划作为规划 Grafana Mimir 集群规模的起点,而不是严格的指导原则。要更好地了解如何规划容量,请参阅 small.yamllarge.yaml 文件开头的 YAML 注释,这些注释与读写工作负载相关。另请参阅 规划 Grafana Mimir 容量

要使用某个容量规划,请从 mimir GitHub 仓库中复制它,并将其作为 values 文件传递给 helm 命令。请注意,随着 mimir-distributed chart 的新版本发布,容量规划可能会发生变化。请确保使用与您正在安装的 Helm chart 版本相近的容量规划。

例如

bash
helm install mimir-prod grafana/mimir-distributed -f ./small.yaml

满足容错要求

作为 Pod 调度的一部分,small.yamllarge.yaml 文件添加了 Pod 反亲和性规则,以确保任意两个 ingester Pod 或任意两个 store-gateway Pod 不会调度在同一个 Kubernetes Node 上。这提高了 Mimir 集群的容错能力。

您必须创建并添加 Node,使 Node 的数量大于或等于 ingester Pod 的数量或 store-gateway Pod 的数量,取两者中的较大值。用公式表示如下

number_of_nodes >= max(number_of_ingesters_pods, number_of_store_gateway_pods)

有关 ingester 或 store-gateway 组件故障模式的更多信息,请参阅 Ingesters 故障和数据丢失Store-gateway:块分片和复制

确定您是否需要地理冗余、快速滚动更新或两者兼而有之。

您可以使用滚动更新策略来应用 Grafana Mimir 的配置更改,并将 Grafana Mimir 升级到新版本。滚动更新不会导致 Grafana Mimir 中断。

Helm chart 会为您执行滚动更新。为了确保滚动更新更快,请配置 Helm chart 以使用区域感知复制部署 Grafana Mimir。

新安装

Grafana Mimir 支持 在 Kubernetes 集群内的可用区之间进行复制。这进一步提高了 Mimir 集群的容错能力。即使您的 Kubernetes 集群当前没有多个区域,您也可以避免在开始使用多个区域时不得不额外迁移集群。

对于 mimir-distributed Helm chart v4.0 或更高版本,新安装时默认启用区域感知。

要从区域感知中受益,请为您的不同区域选择节点选择器。为了方便起见,您可以使用以下 YAML 配置片段作为起点

yaml
ingester:
  zoneAwareReplication:
    enabled: true
    topologyKey: kubernetes.io/hostname
    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

store_gateway:
  zoneAwareReplication:
    enabled: true
    topologyKey: kubernetes.io/hostname
    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

现有安装

如果您正在从以前的 mimir-distributed Helm chart 版本升级到 v4.0,请参阅迁移指南以配置区域感知复制。

配置 Mimir 使用对象存储

有关 Mimir 支持的不同对象存储类型和示例,请参阅 配置 Grafana Mimir 对象存储后端

  1. 如果您没有使用规划容量中提到的容量规划,请将以下 YAML 添加到您的 values 文件中

    yaml
    minio:
      enabled: false
  2. 准备对象存储的凭证和 bucket 名称。

  3. 将对象存储配置添加到 Helm chart values 中。将对象存储配置嵌套在 mimir.structuredConfig 下。此示例使用 Amazon S3

    yaml
    mimir:
      structuredConfig:
        common:
          storage:
            backend: s3
            s3:
              endpoint: s3.us-east-2.amazonaws.com
              region: us-east
              secret_access_key: "${AWS_SECRET_ACCESS_KEY}" # This is a secret injected via an environment variable
              access_key_id: "${AWS_ACCESS_KEY_ID}" # This is a secret injected via an environment variable
    
        blocks_storage:
          s3:
            bucket_name: mimir-blocks
        alertmanager_storage:
          s3:
            bucket_name: mimir-alertmanager
        ruler_storage:
          s3:
            bucket_name: mimir-ruler
    
        # The following admin_client configuration only applies to Grafana Enterprise Metrics deployments:
        #admin_client:
        #  storage:
        #    s3:
        #      bucket_name: gem-admin

满足安全合规要求

Grafana Mimir 不需要在其运行的主机上具有任何特殊权限。因此,您可以将其部署在强制执行 Kubernetes 受限安全策略的环境中。

在 Kubernetes v1.23 及更高版本中,可以通过部署 Mimir 的 Namespace 资源上的命名空间标签来强制执行受限策略。例如

pod-security.kubernetes.io/enforce: restricted

在 Kubernetes 1.23 之前的版本中,mimir-distributed Helm chart 提供了一个 PodSecurityPolicy 资源,该资源强制执行了命名空间标签强制执行的受限策略中的许多建议。要为您的 Kubernetes 集群启用 PodSecurityPolicy 准入控制器,请参阅 如何开启准入控制器?

有关 OpenShift 的具体说明,请参阅在 OpenShift 上部署

mimir-distributed Helm chart 还部署了大多数容器,它们具有只读根文件系统 (readOnlyRootFilesystem: true)。例外情况是可选的 MinIO 和 Grafana Agent(已弃用)容器。PodSecurityPolicy 资源强制执行此设置。

监控 Grafana Mimir 集群的健康状况

要监控 Grafana Mimir 集群的健康状况(也称为元监控),您可以使用现成的 Grafana Dashboard 以及 Prometheus 告警和记录规则。有关更多信息,请参阅 安装 Grafana Mimir Dashboard 和告警

mimir-distributed Helm chart 使您能够轻松收集 Mimir 的指标和日志。它会为您分配正确的标签,以便 Dashboard 和告警能够正常工作。该 chart 使用 Grafana Agent 将指标发送到兼容 Prometheus 的服务器,并将日志发送到 Loki 或 GEL (Grafana Enterprise Logs) 服务器。

注意

Grafana Alloy 是我们的 OTel Collector 分发版的新名称。Grafana Agent 已被弃用,并在 2025 年 10 月 31 日之前处于长期支持 (LTS) 阶段。Grafana Agent 将于 2025 年 11 月 1 日达到生命周期结束 (EOL)。详细了解我们推荐迁移到 Grafana Alloy 的原因。

  1. https://github.com/grafana/agent/tree/main/operations/agent-static-operator/crds 下载 Grafana Agent Operator 自定义资源定义 (CRD)

  2. 在您的集群上安装 CRD

    bash
    kubectl apply -f operations/agent-static-operator/crds/
  3. 将以下 YAML 代码片段添加到您的 values 文件中,以发送 Mimir 的元监控遥测数据。更改 URL 和凭证以匹配您的目标目的地。

    yaml
    metaMonitoring:
      serviceMonitor:
        enabled: true
      grafanaAgent:
        enabled: true
        installOperator: true
    
        logs:
          remote:
            url: "https://example.com/loki/api/v1/push"
            auth:
              username: 12345
    
        metrics:
          remote:
            url: "https://prometehus.prometheus.svc.cluster.local./api/v1/push"
            headers:
              X-Scope-OrgID: metamonitoring

    有关如何设置凭证的详细信息,请参阅 从 Grafana Mimir 收集指标和日志

您的 Grafana Mimir 集群现在可以在生产环境中摄取指标了。

配置客户端向 Mimir 写入指标

要配置每个客户端远程写入指标到 Mimir,请参阅 配置 Prometheus 向 Grafana Mimir 写入数据配置 Grafana Alloy 向 Grafana Mimir 写入数据

设置冗余 Prometheus 或 Grafana Alloy 实例以实现高可用性

如果您需要在写入路径到达 Mimir 之前实现冗余,则可以设置冗余的 Prometheus 或 Grafana Alloy 实例向 Mimir 写入指标。

有关更多信息,请参阅 使用 Consul 配置高可用去重

在 OpenShift 上部署

要在 OpenShift 上部署 mimir-distributed Helm chart,您需要修改一些默认值。将以下 YAML 代码片段添加到您的 values 文件中。这将为 mimir-distributed chart 创建一个专用的 SecurityContextConstraints (SCC) 资源。

yaml
rbac:
  create: true
  type: scc
  podSecurityContext:
    fsGroup: null
    runAsGroup: null
    runAsUser: null
rollout_operator:
  podSecurityContext:
    fsGroup: null
    runAsGroup: null
    runAsUser: null

或者,要在您的 OpenShift 集群中使用默认 SCC 进行部署,请将以下 YAML 代码片段添加到您的 values 文件中

yaml
rbac:
  create: false
  type: scc
  podSecurityContext:
    fsGroup: null
    runAsGroup: null
    runAsUser: null
rollout_operator:
  podSecurityContext:
    fsGroup: null
    runAsGroup: null
    runAsUser: null

注意

在 Helm 3.13 及更早版本中,当将 mimir-distributed Helm chart 用作依赖项时,您可能会遇到一个已知问题,即无法覆盖默认值。要查看示例和可能的解决方法,请参阅 GitHub 上的此 issue。如果您的具体情况没有得到解决,请在 Mimir 仓库中开启一个 issue。