在Kubernetes中,空闲时如何将部署扩展到零

在Kubernetes中,空闲时如何将部署扩展到零,kubernetes,horizontal-pod-autoscaling,Kubernetes,Horizontal Pod Autoscaling,我正在Kubernetes集群上运行一个相当资源密集型的服务,以支持CI活动。只需要一个复制副本,但它会占用大量资源(16个cpu),而且通常只在工作时间(工作日,大约上午8点到下午6点)需要。我的集群在云中运行,并通过实例自动缩放进行设置,因此如果此服务被缩放为零,则可以终止该实例 该服务是无法修改的第三方代码(嗯,不容易)。它是一个相当典型的HTTP服务,不同的是它的工作相当CPU密集 有哪些选项可以在空闲时自动将此部署扩展到零 我不希望在工作时间设置一个时间表来放大/缩小它,因为有时CI活

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

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

有哪些选项可以在空闲时自动将此部署扩展到零


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

有几种方法可以实现这一点,可能最“自然”的方法是将Knative与Istio一起使用。默认情况下,Kubernetes允许您缩放到零,但是您需要能够基于“输入事件”(本质上支持事件驱动体系结构)代理放大事件的东西


您可以在此处查看官方文档:

根据文档,它目前不支持minReplicas=0。读这个帖子:-。为了正确设置HPA,您可以使用此公式设置所需的pod:-

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
您还可以根据普罗米修斯指标设置HPA,请点击以下链接:-


水平吊舱自动缩放器当前不允许将minReplicas字段设置为0,因此即使吊舱不做任何操作,自动缩放器也不会缩小到零。允许POD的数量减少到零可以显著提高硬件的利用率

当您运行的服务每隔几个小时甚至几天只接收一次请求时,让它们一直运行是没有意义的,这样会消耗掉其他pod可能使用的资源

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

这称为怠速和非怠速。它允许提供特定服务的吊舱缩小到零。当一个新的请求进来时,请求被阻止,直到pod被打开,然后请求最终被转发到pod


Kubernetes目前还没有提供此功能,但最终会提供

实际上,Kubernetes仅通过API调用支持缩放到零,因为水平Pod Autoscaler只支持缩放到1个副本

无论如何,有一些运营商允许您通过拦截到您的pod的请求或检查一些指标来超越这一限制

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

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

相比之下,Keda最适合事件驱动的体系结构,因为它能够检查预定义的指标,如滞后、队列长度或自定义指标(例如,从普罗米修斯收集)并触发缩放

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


希望有帮助。

我最终实现了一个定制解决方案:


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

您的集群使用的是什么云?谢谢,Keda看起来很有趣。我正在特别搜索确认“两种支持均为零”。谢谢。编辑:在KEDA文档中找到了关于这个的参考