使用 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 自动伸缩的示例
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 集群中禁用自动伸缩有两种选择
- 设置最小副本数 = 最大副本数。
- 停用 HPA。
设置最小副本数 = 最大副本数
如果 KEDA 和 Kubernetes HPA 工作正常,但 HPA 配置(指标和阈值)未给出预期结果(例如在需要时未向上伸缩),一个简单的解决方案是绕过自动伸缩算法,将最小副本数和最大副本数设置为相同的值。(例如 autoscaling_querier_min_replicas: 40
和 autoscaling_querier_max_replicas: 40
)。
停用 HPA
要在 Mimir 集群中完全停用 HPA,您需要
- 禁用相关的自动伸缩器(例如
autoscaling_querier_enabled: false
)。 - 手动设置给定 Mimir 组件所需的副本数量。
以下示例展示了如何禁用 querier 自动伸缩器并将 querier Deployment 配置为 10 个副本
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),
}