我正在Kubernetes集群上运行一个资源密集型服务,以支持CI活动。只需要一个副本,但它需要大量资源(16 cpu(,而且通常只在工作时间(工作日,大约上午8点至下午6点(需要。我的集群在云中运行,并通过实例自动缩放进行设置,因此如果此服务缩放为零,则该实例可以终止。
该服务是第三方代码,不能修改(好吧,不容易(。这是一个相当典型的HTTP服务,除了它的工作相当占用CPU之外。
有哪些选项可以在空闲时自动将此部署缩减为零?
我宁愿不设置在工作时间内放大/缩小的时间表,因为偶尔CI活动会在正常时间之外执行。我希望缩放是动态的(例如,当空闲超过30分钟时缩放到零,或者当传入连接到达时缩放到一(。
实际上,Kubernetes只支持通过API调用扩展到零,因为Horizontal Pod Autoscaler只支持扩展到1个副本。
无论如何,有一些运营商可以让你通过拦截到达你的pod的请求或检查一些指标来超越这个限制。
你可以看看Knative或Keda。它们使您的应用程序能够实现无服务器化,并且以不同的方式实现。
Knative,通过Istio拦截请求,如果有活动pod为它们提供服务,它会将传入请求重定向到该pod,否则会触发扩展。
相比之下,Keda最适合事件驱动架构,因为它能够检查预定义的指标,如滞后、队列长度或自定义指标(例如从Prometheus收集的(并触发缩放。
如果在同样预定义的窗口中满足预定义的条件,则两者都支持缩放为零。
希望它能有所帮助。
我最终实现了一个自定义解决方案:https://github.com/greenkeytech/zero-pod-autoscaler
与Knative相比,它更像是一个";玩具;项目,相当小,并且不依赖istio。它在我的用例中运行得很好,尽管我不建议其他人在不愿意将代码作为自己的代码的情况下使用它。
有几种方法可以实现这一点,可能最"原生"的方法是将Knative与Istio一起使用。Kubernetes默认情况下允许您扩展到零,但您需要一些可以基于"输入事件"代理扩展事件的东西,本质上是支持事件驱动架构的东西。
你可以在这里查看官方文件:https://knative.dev/docs/serving/configuring-autoscaling/
水平pod自动缩放器目前不允许将minReplicas字段设置为0,因此即使pod什么都不做,自动缩放器也永远不会缩小到零。允许pod的数量减少到零可以显著提高硬件的利用率。
当你运行的服务每几个小时甚至几天只收到一次请求时,让它们一直运行是没有意义的,会占用其他pod可以使用的资源。
但是你仍然希望在收到客户请求时立即提供这些服务
这被称为怠速和非怠速。它允许提供特定服务的pod缩小到零。当一个新的请求进来时,该请求会被阻止,直到pod被打开,然后该请求最终被转发到pod。
Kubernetes目前还没有提供这个功能,但它最终会提供的。
根据文档,到目前为止它不支持minReplicas=0。阅读此线程:-https://github.com/kubernetes/kubernetes/issues/69687.为了正确设置HPA,你可以使用这个公式来设置所需的吊舱:-
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
你也可以根据普罗米修斯的指标设置HPA,点击这个链接:-
https://itnext.io/horizontal-pod-autoscale-with-custom-metrics-8cb13e9d475