使用 Helm chart 在生产环境中运行 Grafana Mimir
除了使用 Helm chart 入门 Grafana Mimir 指南(该指南涵盖了在本地 Kubernetes 集群或低风险开发环境中设置 Grafana Mimir),您还可以为生产环境准备 Grafana Mimir。
尽管以下信息假设您正在面向客户的生产环境中使用 Grafana Mimir,但即使在内部开发环境中,您也可能需要 Grafana Mimir 的高可用性和水平可伸缩性功能。
开始之前
满足以下所有前提条件
您熟悉 Helm 3.x。
将 grafana Helm 仓库添加到您的本地环境或 CI/CD 工具中
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 附带两个容量规划
- 适用于 1M 系列:
small.yaml
- 适用于 10M 系列:
large.yaml
这些容量规划是基于 Grafana Labs 运营 Grafana Mimir 的经验估算得出的。您的集群的理想规模取决于您的使用模式。因此,请将这些容量规划作为规划 Grafana Mimir 集群规模的起点,而不是严格的指导原则。要更好地了解如何规划容量,请参阅 small.yaml
和 large.yaml
文件开头的 YAML 注释,这些注释与读写工作负载相关。另请参阅 规划 Grafana Mimir 容量。
要使用某个容量规划,请从 mimir GitHub 仓库中复制它,并将其作为 values 文件传递给 helm
命令。请注意,随着 mimir-distributed
chart 的新版本发布,容量规划可能会发生变化。请确保使用与您正在安装的 Helm chart 版本相近的容量规划。
例如
helm install mimir-prod grafana/mimir-distributed -f ./small.yaml
满足容错要求
作为 Pod 调度的一部分,small.yaml
和 large.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 配置片段作为起点
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 对象存储后端。
如果您没有使用规划容量中提到的容量规划,请将以下 YAML 添加到您的 values 文件中
minio: enabled: false
准备对象存储的凭证和 bucket 名称。
将对象存储配置添加到 Helm chart values 中。将对象存储配置嵌套在
mimir.structuredConfig
下。此示例使用 Amazon S3mimir: 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 的原因。
从 https://github.com/grafana/agent/tree/main/operations/agent-static-operator/crds 下载 Grafana Agent Operator 自定义资源定义 (CRD)
在您的集群上安装 CRD
kubectl apply -f operations/agent-static-operator/crds/
将以下 YAML 代码片段添加到您的 values 文件中,以发送 Mimir 的元监控遥测数据。更改 URL 和凭证以匹配您的目标目的地。
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) 资源。
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 文件中
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。