如何向 HPA 提供外部指标?

Tim*_*nov 5 kubernetes hpa

问题设置。假设我有 2 个 pod,A 和 B。我希望能够根据任意来源的任意数量动态扩展 pod A。假设 pod B 是这样的源:例如,它可以拥有一个带有端点的 HTTP 服务器,该端点在请求时以 pod A 的所需副本数量进行响应。或者它可能是 ES 服务器或 SQL DB(没关系)。

问题。我需要定义哪些 kubernetes 对象才能实现此目的(HPA 除外)?HPA 需要什么配置才能知道它需要查找 B 来获取当前指标?B 的 API 应该是什么样的(或者有什么限制吗?)?

我所做的研究。不幸的是,官方文档除了宣称存在这种可能性之外,并没有对此做太多说明。还有两个存储库,一个存储库包含一些我在构建时遇到问题的 go 样板代码,另一个存储库没有任何使用说明(尽管据称确实满足“通过 HTTP 的外部指标”要求)。

通过查看.yaml这些存储库中的配置,我得出了一个结论,除了Deployment需要Service定义一个APIService对象,该对象在 kubernetes API 中注册外部或自定义指标并将其与普通服务链接(您可以在其中使用pod)和一些ClusterRoleClusterRoleBinding对象。但对此没有任何解释。此外,我什至无法像其他对象一样在本地集群(1.15 版本)中使用 kubectl 列出现有的 APIServices。

Max*_*bur 5

最简单的方法是将指标输入 Prometheus(这是一个常见解决的问题),然后设置一个基于 Prometheus 的 HPA(也是一个常见解决的问题)。

1. 将自己的指标提供给 Prometheus

  • Prometheus-Operator开始监控集群本身,并访问ServiceMonitor对象。ServiceMonitor 是指向集群中服务的指针。他们让你的 Pod/metrics它们让Prometheus 服务器发现并抓取
  • 编写一个 pod,从第 3 方 API 读取指标并在自己的/metrics端点中显示它们。这将是 API 和 Prometheus 格式之间的适配器。当然有客户端: https: //github.com/prometheus/client_python#exporting
  • 编写一个代表您的 Pod 的Service类型。ClusterIP
  • 编写一个ServiceMonitor指向服务的内容。
  • 通过 Prometheus 仪表板查询您的自定义指标,以确保此阶段完成。

2. 设置基于 Prometheus 的 HPA

获得 HPA 看起来需要做大量的工作。然而,这里只有适配器盒是定制部件。大多数集群中的其他一切都是标准堆栈设置,无论如何您都会获得许多其他用例。