使用容器中应用程序公开的 REST API 进行水平 Pod 自动缩放

Posted

技术标签:

【中文标题】使用容器中应用程序公开的 REST API 进行水平 Pod 自动缩放【英文标题】:Horizontal Pod Autoscaling using REST API exposed by the application in container 【发布时间】:2020-01-13 01:14:00 【问题描述】:

我在 Windows 上使用 minikube,只有一个节点“master”。

部署的 Spring Boot 应用程序具有 REST 端点,它提供了当前服务的客户端数量。当请求达到某个限制时,我想水平扩展或自动旋转 pod。

Lets say:
There is 1 pod in the cluster.
If the request limit reached 50 (for Pod 1), spin up a new pod.
If the request limit reached 50 for Pod 1 and Pod 2, spin up a new Pod (Pod 3).

我尝试研究如何实现这一点,但我无法弄清楚。 我所能找到的只是使用 Horizo​​ntalPodAutoscaler(HPA) 的 CPU 使用率来扩展。 获得有关如何使用 Kubernetes HPA 实现此目标的指导会很有帮助。

【问题讨论】:

通常自动缩放节点来自底层基础设施,如果使用 AWS,则自动缩放组,如果使用 Azure,则使用 Scaling Sets。如果要扩展 POD,则必须开始查看 Kubernetes 入口控制器,它们可以与入口负载均衡器一起确定是否启动新 Pod @CallumLinington,水平 pod 自动缩放器正是用于扩展 pod。入口和节点自动缩放与它无关。 除了 HPA 仅用于 CPU 利用率 - 而不是 OP 要求的请求限制。并且看到负载均衡器正在跟踪连接,它们非常适合确定启动新节点的需求 应用程序已经跟踪了连接,并且有一个 REST api 当命中时给出了连接数。如果需要,我可以使用负载均衡器跟踪的连接计数。无论如何对我来说都很好,我的用例是在连接达到阈值限制时扩展 pod。 【参考方案1】:

相信你可以从autoscaling on custom metrics article开始。据我所知 - 这可以通过结合使用自定义指标和 Prometheus Adapter for Kubernetes Metrics APIs(使用 Prometheus 实现 custom.metrics.k8s.io API)来实现。

Prometheus Adapter for Kubernetes Metrics APIs repo 包含 Kubernetes resource metrics API 和 custom metrics API 的实现。

因此,此适配器适用于 Kubernetes 1.6+ 中的 autoscaling/v2 Horizo​​ntal Pod Autoscaler。

来自autoscaling on custom metrics的信息:

请注意,您可以指定除 CPU 之外的其他资源指标。经过 默认情况下,唯一支持的其他资源指标是内存。这些 资源不会在集群之间更改名称,并且应该 始终可用,只要 metrics.k8s.io API 可用。

这些替代指标类型中的第一个是 pod 指标。这些指标描述了 Pod,并在 Pod 之间进行平均,并与目标值进行比较以确定副本数。它们的工作原理与资源指标非常相似,只是它们仅支持目标类型 AverageValue。

Pod 指标是使用这样的指标块指定的:

type: Pods
pods:
  metric:
    name: packets-per-second
  target:
    type: AverageValue
    averageValue: 1k

第二种替代度量类型是对象度量。这些指标描述了同一命名空间中的不同对象,而不是描述 pod。指标不一定是从对象中获取的;他们只描述它。对象度量支持 Value 和 AverageValue 的目标类型。使用 Value,目标直接与 API 返回的指标进行比较。使用 AverageValue,从自定义指标 API 返回的值在与目标进行比较之前除以 pod 的数量。以下示例是每秒请求数指标的 YAML 表示形式。

type: Object
object:
  metric:
    name: requests-per-second
  describedObject:
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    name: main-route
  target:
    type: Value
    value: 2k

以下内容可能对您未来的调查有所帮助:

Autoscaling on more specific metrics

Autoscaling on metrics not related to Kubernetes objects

希望对你有帮助

【讨论】:

感谢您的意见。自动缩放不是问题。但主要的挑战是路由到接受请求的特定 pod。请看这个:***.com/q/58007073/11836838 @VKR 我是 Kubernetes 新手,对 HPA 感到困惑。我们需要带自动缩放/v2beta2 的 Prometheus 和 Prometheus 适配器吗?我目前正在使用弹簧启动执行器和 Prometheus,并且可以根据请求数量自动缩放

以上是关于使用容器中应用程序公开的 REST API 进行水平 Pod 自动缩放的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 AWS Gateway REST API 可通过可公开访问的网页进行访问 (React)

通过 REST API 公开 Redshift 表

REST/JSON:如何生成示例请求?如何公开 API?

Django REST API 公开图像

使用nodejs+ harbor rest api 进行容器镜像迁移

是否可以使用 Ktor 和/或 Kotlin 多平台在 Rest API 和 Android 应用程序之间“共享”公开的数​​据?