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

7gs2gvoe  于 2023-11-17  发布在  Kubernetes
关注(0)|答案(6)|浏览(137)

我在Kubernetes集群上运行了一个相当资源密集型的服务来支持CI活动。只需要一个副本,但它使用了大量的资源(16个CPU),并且通常只在工作时间(工作日,大约上午8点到下午6点)需要它。我的集群在云中运行,并设置了示例自动缩放,所以如果这个服务缩放到零,该示例可以被终止。
该服务是第三方代码,不能被修改(当然,不容易)。它是一个相当典型的HTTP服务,除了它的工作是相当CPU密集型的。
有哪些选项可以在空闲时自动将此Deployment缩减为零?
我不想设置一个在工作时间内向上/向下扩展的计划,因为偶尔会在正常时间之外执行CI活动。我希望扩展是动态的(例如,当空闲时间超过30分钟时扩展到零,或者当传入连接到达时扩展到一)。

ufj5ltwl

ufj5ltwl1#

实际上,Kubernetes仅通过API调用支持缩放到零,因为Horizontal Pod Autoscaler只支持缩小到1个副本。
无论如何,有一些Operator允许您通过拦截到达您的Pod的请求或检查一些指标来超越该限制。
你可以看看KnativeKeda,它们使你的应用程序成为无服务器的,而且它们以不同的方式实现。

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

相比之下,Keda最适合事件驱动架构,因为它能够检查预定义的指标,如滞后,队列长度或自定义指标(例如从Prometheus收集)并触发缩放。
两者都支持在同样预定义的窗口中满足预定义条件的情况下缩放到零。
希望有帮助。

js5cn81o

js5cn81o2#

我最终实现了一个自定义解决方案:https://github.com/greenkeytech/zero-pod-autoscaler
与Knative相比,它更像是一个“玩具”项目,相当小,并且不依赖于istio。它在我的用例中运行良好,尽管我不建议其他人在不愿意采用代码作为自己的代码的情况下使用它。

5gfr0r5j

5gfr0r5j3#

有几种方法可以实现这一点,可能最“原生”的方法是使用Knative和Istio。Kubernetes默认允许您扩展到零,但是您需要一些可以基于“输入事件”代理扩展事件的东西,本质上是支持事件驱动架构的东西。
您可以在这里查看官方文档:https://knative.dev/docs/serving/configuring-autoscaling/

jtjikinw

jtjikinw4#

水平Pod自动缩放器目前不允许将minReplicas字段设置为0,因此自动缩放器永远不会缩小到零,即使Pod没有做任何事情。允许Pod数量缩小到零可以显著提高硬件的利用率。
当您运行的服务每隔几个小时甚至几天才收到一次请求时,让它们一直运行是没有意义的,会占用其他pod可以使用的资源。
但是您仍然希望在客户端请求到来时立即提供这些服务。
这被称为空闲和非空闲。它允许提供特定服务的Pod缩减到零。当新请求进来时,请求被阻止,直到Pod被启动,然后请求最终被转发到Pod。
Kubernetes目前还没有提供此功能,但最终会提供。

yftpprvb

yftpprvb5#

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

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

字符串
你也可以根据prometheus指标设置HPA,请点击此链接:-
https://itnext.io/horizontal-pod-autoscale-with-custom-metrics-8cb13e9d475

wvyml7n5

wvyml7n56#

在Kubernetes 1.16或更高版本中,您必须在kube-apiserver上启用HPAScaleToZero功能门才能支持缩放到0。它只支持对象/外部指标。
我的PR处理了对象/外部指标的minReplicas的零值验证,因此您可以等待下一个稳定的K8S版本或设置v1.16.0-alpha.1。
https://github.com/kubernetes/kubernetes/issues/69687#issuecomment-513745438

相关问题