14

我在 Kubernetes 集群上运行一个资源相当密集的服务来支持 CI 活动。只需要一个副本,但它使用大量资源(16 cpu),并且通常只在工作时间(工作日,大约上午 8 点到下午 6 点)需要。我的集群在云中运行并设置了实例自动缩放,因此如果此服务缩放为零,则可以终止该实例。

该服务是无法修改的第三方代码(嗯,不容易)。这是一个相当典型的 HTTP 服务,除了它的工作是相当 CPU 密集的。

有哪些选项可以在空闲时自动将此部署缩减为零?

我宁愿不在工作时间设置一个时间表来扩大/缩小它,因为 CI 活动偶尔会在正常时间之外执行。我希望缩放是动态的(例如,当空闲 > 30 分钟时缩放到零,或者当传入连接到达时缩放到一)。

4

5 回答 5

11

实际上 Kubernetes 仅通过 API 调用支持缩放到零,因为 Horizo​​ntal Pod Autoscaler 确实只支持缩减到 1 个副本。

无论如何,有一些 Operator 可以让您通过拦截到达您的 pod 的请求或检查一些指标来超越该限制。

你可以看看 KnativeKeda。它们使您的应用程序成为无服务器的,并且它们以不同的方式实现。

Knative,通过 Istio 拦截请求,如果有一个活动的 pod 为它们服务,它会将传入的请求重定向到那个,否则它会触发缩放。

相比之下,Keda最适合事件驱动架构,因为它能够检查预定义的指标,例如延迟、队列长度或自定义指标(例如从 Prometheus 收集)并触发缩放。

如果在同样预定义的窗口中满足预定义条件,两者都支持缩放为零。

希望它有所帮助。

于 2020-05-04T21:46:39.000 回答
6

我最终实施了一个自定义解决方案:https ://github.com/greenkeytech/zero-pod-autoscaler

与 Knative 相比,它更像是一个“玩具”项目,相当小,并且不依赖于 istio。它在我的用例中运行良好,但我不建议其他人在不愿意采用代码作为自己的代码的情况下使用它。

于 2020-06-23T14:38:09.027 回答
4

有几种方法可以实现这一点,可能最“原生”的方式是将 Knative 与 Istio 结合使用。默认情况下,Kubernetes 允许您扩展到零,但是您需要能够基于“输入事件”代理扩展事件的东西,本质上是支持事件驱动架构的东西。

您可以在这里查看官方文档:https ://knative.dev/docs/serving/configuring-autoscaling/

于 2020-05-04T16:20:34.733 回答
3

水平 pod 自动缩放器当前不允许将 minReplicas 字段设置为 0,因此自动缩放器永远不会缩小到零,即使 pod 没有做任何事情。允许将 pod 的数量缩减到零可以显着提高硬件的利用率。

当您运行每隔几个小时甚至几天才收到一次请求的服务时,让它们一直运行是没有意义的,会占用其他 Pod 可以使用的资源。

但是您仍然希望在收到客户请求时立即提供这些服务。

这被称为空闲和非空闲。它允许将提供某种服务的 pod 缩小到零。当有新的请求进来时,请求会被阻塞,直到 pod 被启动,然后请求最终被转发到 pod。

Kubernetes 目前还没有提供这个功能,但它最终会提供。

于 2020-05-04T17:39:45.397 回答
1

根据文档,到目前为止它不支持 minReplicas=0 。阅读此线程:- https://github.com/kubernetes/kubernetes/issues/69687。要正确设置 HPA,您可以使用此公式来设置所需的 pod:-

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

您还可以按照以下链接根据 prometheus 指标设置 HPA:-

https://itnext.io/horizo​​ntal-pod-autoscale-with-custom-metrics-8cb13e9d475

于 2020-05-04T16:30:48.450 回答