菜单
开源

使用 Jsonnet 配置 Grafana Mimir 自动伸缩

Mimir Jsonnet 支持以下组件的自动伸缩

自动伸缩基于 Prometheus 指标和 Kubernetes-based Event Driven Autoscaler (KEDA),使用 Kubernetes 的 Horizontal Pod Autoscaler (HPA)。

HPA 不是直接在 Jsonnet 中配置的,而是由 KEDA 创建和更新。KEDA 是一个在 Kubernetes 集群中运行的 operator,负责简化使用自定义指标(在本例中为 Prometheus)设置 HPA 的过程。

警告

请勿使用同一个 Mimir 或 Grafana Enterprise Metrics 集群来存储和查询自动伸缩指标。使用同一个集群可能会产生危险的反馈循环

请勿使用同一个 Mimir 或 Grafana Enterprise Metrics 集群来存储和查询自动伸缩指标。使用同一个集群可能会产生危险的反馈循环。

例如,如果 Mimir 或 GEM 集群变得不可用,自动伸缩将停止工作,因为它无法查询指标。这会阻止集群在高负载或恢复期间自动向外伸缩。这种无法伸缩的情况会进一步加剧集群的不可用性,这反过来又可能阻止集群恢复。

相反,请使用一个独立的 Prometheus 实例或不同的指标后端来存储自动伸缩指标。

相反,请使用一个独立的 Prometheus 实例或不同的指标后端来存储自动伸缩指标。

KEDA 工作原理

KEDA 是一个 Kubernetes operator,旨在简化 HPA 和 Prometheus 之间的连接。

Kubernetes 原生的 HPA 无法基于 Prometheus 抓取的指标进行自动伸缩,但它允许配置一个自定义指标 API 服务器,该服务器将数据源(例如 Prometheus)的指标代理到 Kubernetes。在 Kubernetes 中为 Prometheus 设置自定义指标 API 服务器可能是一项繁琐的操作,因此 KEDA 提供了一个 operator 来自动设置它。KEDA 支持为各种来源代理指标,包括 Prometheus。

KEDA 概述

  • 运行一个 operator 和一个外部指标服务器。
  • 指标服务器支持代理许多指标来源,包括 Prometheus。
  • operator 监视 ScaledObject 自定义资源定义 (CRD),该 CRD 定义了 Deployment 或 StatefulSet 的最小副本数、最大副本数以及伸缩触发器指标,然后配置相关的 HPA 资源。您无需在 Kubernetes 中创建 HPA 资源,operator 会在 ScaledObject CRD 创建时为您创建它(并在其整个生命周期内保持更新)。

有关更多信息,请参阅 KEDA 文档

如果 KEDA 不健康会发生什么

Deployment 的自动伸缩始终由 HPA 管理,HPA 是 Kubernetes 的原生功能。我们使用的 KEDA 不会更改 Mimir Deployment 或 StatefulSet 的副本数量。

然而,如果 KEDA 未成功运行,Mimir 自动伸缩也会受到影响

  • keda-operator 宕机(严重):由于 operator 是单一事实来源,当 keda-operator-metrics-apiserver 请求指标时,它将不会请求指标。对 ScaledObject CRD 的更改在 operator 恢复在线之前不会反映到 HPA。Deployment(例如 querier)将继续工作,但如果流量激增,HPA 将因缺少指标而无法检测到,因此无法向外伸缩。
  • keda-operator-metrics-apiserver 宕机(严重):HPA 无法获取更新的指标,并且在指标恢复之前会停止伸缩 Deployment。Deployment(例如 querier)将继续工作,但如果流量激增,HPA 将因缺少指标而无法检测到,因此无法向外伸缩。
  • keda-admission-webhooks 宕机(不严重):CRD 验证将不会执行。根据 KEDA 的配置,这可能会阻止对 CRD 的更改,直到服务恢复。HPA 功能不受影响。

注意

如果自动伸缩对您的用例至关重要,请使用高可用性 KEDA 配置。

如果 HPA 由于任何原因(例如无法从 KEDA 指标 API 服务器抓取指标)而无法伸缩 Deployment,将触发警报 MimirAutoscalerNotActive

Kubernetes HPA 工作原理

要全面了解 HPA 的工作原理,请参阅 Kubernetes Horizontal Pod Autoscaling 文档。

如何启用自动伸缩

以下 Jsonnet 配置片段展示了如何使用 Jsonnet 启用 Mimir 自动伸缩的示例

jsonnet
local mimir = import 'mimir/mimir.libsonnet';

mimir {
    _config+:: {
        autoscaling_prometheus_url: 'http://prometheus.default:9090/prometheus',
        // Enable queriers autoscaling.
        autoscaling_querier_enabled: true,
        autoscaling_querier_min_replicas: 10,
        autoscaling_querier_max_replicas: 40,
        // Enable ruler queriers autoscaling.
        autoscaling_ruler_querier_enabled: true,
        autoscaling_ruler_querier_min_replicas: 10,
        autoscaling_ruler_querier_max_replicas: 40,
        // Enable distributor autoscaling.
        autoscaling_distributor_enabled: true,
        autoscaling_distributor_min_replicas: 10,
        autoscaling_distributor_max_replicas: 40,
    }
}

注意

Mimir Jsonnet 不会安装 KEDA。

要安装 KEDA,请按照部署 KEDA 中的说明进行操作。

如何禁用自动伸缩

在 Mimir 集群中禁用自动伸缩有两种选择

  1. 设置最小副本数 = 最大副本数。
  2. 停用 HPA。

设置最小副本数 = 最大副本数

如果 KEDA 和 Kubernetes HPA 工作正常,但 HPA 配置(指标和阈值)未给出预期结果(例如在需要时未向上伸缩),一个简单的解决方案是绕过自动伸缩算法,将最小副本数和最大副本数设置为相同的值。(例如 autoscaling_querier_min_replicas: 40autoscaling_querier_max_replicas: 40)。

停用 HPA

要在 Mimir 集群中完全停用 HPA,您需要

  1. 禁用相关的自动伸缩器(例如 autoscaling_querier_enabled: false)。
  2. 手动设置给定 Mimir 组件所需的副本数量。

以下示例展示了如何禁用 querier 自动伸缩器并将 querier Deployment 配置为 10 个副本

jsonnet
local k = import 'github.com/grafana/jsonnet-libs/ksonnet-util/kausal.libsonnet';
local deployment = k.apps.v1.deployment;

mimir {
    _config+:: {
        autoscaling_querier_enabled: false,
    },

    querier_deployment+: deployment.mixin.spec.withReplicas(10),
}