在 Kubernetes 中,如何在空闲时将部署缩放为零

Pat*_*ick 10 kubernetes horizontal-pod-autoscaling

我正在 Kubernetes 集群上运行一个相当资源密集型的服务来支持 CI 活动。只需要一个replica,但是占用资源多(16cpu),而且一般只在工作时间(工作日,大概8am-6pm)才需要。我的集群在云中运行并设置了实例自动缩放,因此如果此服务缩放为零,则可以终止该实例。

该服务是无法修改的第三方代码(好吧,不容易)。这是一个相当典型的 HTTP 服务,但它的工作是相当占用 CPU 的。

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

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

Pat*_*ick 10

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

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


小智 7

实际上 Kubernetes 仅支持通过 API 调用的方式缩放到 0,因为 Horizo​​ntal Pod Autoscaler 仅支持缩小到 1 个副本。

无论如何,有一些 Operator 允许您通过拦截进入您的 Pod 的请求或检查一些指标来超越该限制。

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

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

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

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

希望它有所帮助。


小智 5

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

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