HPA缩减Kubernetes吊舱

时间:2019-12-25 16:21:02

标签: kubernetes

我的要求是按自定义指标扩展PODS,例如来自队列的待处理消息增加,必须增加pod才能处理作业。在kubernetes中,使用prometheus适配器和prometheus运算符可以很好地进行Scale up。

我在Pod中运行时间很长,但是HPA会检查自定义指标并尝试缩小规模,因为此过程会导致操作中断并丢失该消息。我如何控制HPA仅杀死没有进程正在运行的免费Pod。

AdapterService收集自定义指标

  • seriesQuery:'{namespace =“ default”,service =“ hpatest-service”}'    资源:      覆盖:        命名空间:          资源:“命名空间”        服务:          资源:“服务”    名称:     匹配:“ msg_consumergroup_lag”    metricsQuery:'avg_over_time(msg_consumergroup_lag {topic =“ test”,consumergroup =“ test”} [1m])'

HPA配置

  • 类型:对象   宾语:     describeObject:       种类:服务       名称:custommetric-service     指标:       名称:msg_consumergroup_lag     目标:       类型:值       值:2

4 个答案:

答案 0 :(得分:1)

当前,无法将HPA配置为容纳这种性质的工作负载。 HPA只需根据伸缩算法将部署上的副本数设置为所需值,然后部署选择一个或多个Pod终止。

this Kubernetes issue中有许多关于此主题的讨论,您可能会感兴趣。 HPA不能解决它,而且可能永远也不能解决。对于这种类型的工作负载,可能需要使用其他类型的自动缩放器。链接中提供了一些建议,可以帮助您定义其中之一。

如果我自己考虑这一点,我将创建一个新的控制器,并使用相应的CRD包含作业定义和缩放要求。与其扩展部署,不如让它启动工作。我会让工作完成他们的工作(处理队列),直到它们变得空闲(队列中没有项目)然后退出。控制器只会通过添加作业来扩大规模,而永远不会缩减规模。当队列为空时,作业本身可以通过退出来缩小。

这将要求您的作业能够通过检查队列并退出(如果那里什么也没有)来检测它们何时变得空闲。如果您的队列永远无法读取,则将无法正常工作,您将需要其他解决方案。

kubebuilder project是工作控制器的一个很好的例子。我将从此开始,然后再扩展它以检查您发布的指标并相应地开始工作。

另请参见Kubernetes文档中的Fine Parallel Processing Using a Work Queue

答案 1 :(得分:0)

我会在这里提出建议和想法,您可以运行自定义脚本以在扩展后立即禁用 HPA,并且脚本应继续检查资源和进程,当没有进程启用 HPA 并缩小时,或使用以下命令杀死 pod kubectl 命令并启用 HPA。

答案 2 :(得分:0)

我有类似的用例来根据队列长度扩展部署,我使用了 KEDA (keda.sh),它正是这样做的。只要知道它会缩减为该部署创建的额外 Pod,即使 Pod 当前正在处理数据/输入 - 您必须配置冷却参数以适当缩减。

答案 3 :(得分:0)

KEDA ScaledJobs 最适合此类场景,可以通过 Queue、Storage 等方式触发(当前可用的缩放器可在 here 中找到)。 ScaledJobs 不会在执行之间终止,建议用于长时间运行的执行。